]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal-remote/journal-remote-write.c
tree-wide: beautify remaining copyright statements
[thirdparty/systemd.git] / src / journal-remote / journal-remote-write.c
CommitLineData
53e1b683 1/* SPDX-License-Identifier: LGPL-2.1+ */
fdfccdbc 2/***
96b2fb93 3 Copyright © 2012 Zbigniew Jędrzejewski-Szmek
fdfccdbc
ZJS
4***/
5
b5efdb8a 6#include "alloc-util.h"
9ff48d09 7#include "journal-remote.h"
fdfccdbc 8
fdfccdbc 9static int do_rotate(JournalFile **f, bool compress, bool seal) {
57850536 10 int r = journal_file_rotate(f, compress, (uint64_t) -1, seal, NULL);
fdfccdbc
ZJS
11 if (r < 0) {
12 if (*f)
c33b3297 13 log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
fdfccdbc 14 else
c33b3297 15 log_error_errno(r, "Failed to create rotated journal: %m");
fdfccdbc
ZJS
16 }
17
18 return r;
19}
20
9ff48d09
ZJS
21Writer* writer_new(RemoteServer *server) {
22 Writer *w;
fdfccdbc 23
9ff48d09
ZJS
24 w = new0(Writer, 1);
25 if (!w)
26 return NULL;
fdfccdbc 27
9ff48d09 28 memset(&w->metrics, 0xFF, sizeof(w->metrics));
fdfccdbc 29
9ff48d09 30 w->mmap = mmap_cache_new();
6b430fdb
ZJS
31 if (!w->mmap)
32 return mfree(w);
fdfccdbc 33
9ff48d09
ZJS
34 w->n_ref = 1;
35 w->server = server;
fdfccdbc 36
9ff48d09 37 return w;
fdfccdbc
ZJS
38}
39
9ff48d09
ZJS
40Writer* writer_free(Writer *w) {
41 if (!w)
42 return NULL;
43
44 if (w->journal) {
45 log_debug("Closing journal file %s.", w->journal->path);
46 journal_file_close(w->journal);
eacbb4d3 47 }
9ff48d09 48
dd87b184
ZJS
49 if (w->server && w->hashmap_key)
50 hashmap_remove(w->server->writers, w->hashmap_key);
9ff48d09
ZJS
51
52 free(w->hashmap_key);
53
54 if (w->mmap)
55 mmap_cache_unref(w->mmap);
56
6b430fdb 57 return mfree(w);
9ff48d09
ZJS
58}
59
60Writer* writer_unref(Writer *w) {
61 if (w && (-- w->n_ref <= 0))
62 writer_free(w);
63
64 return NULL;
fdfccdbc
ZJS
65}
66
9ff48d09
ZJS
67Writer* writer_ref(Writer *w) {
68 if (w)
69 assert_se(++ w->n_ref >= 2);
70
71 return w;
72}
73
dd87b184 74int writer_write(Writer *w,
fdfccdbc
ZJS
75 struct iovec_wrapper *iovw,
76 dual_timestamp *ts,
77 bool compress,
78 bool seal) {
79 int r;
80
dd87b184 81 assert(w);
fdfccdbc
ZJS
82 assert(iovw);
83 assert(iovw->count > 0);
84
dd87b184 85 if (journal_file_rotate_suggested(w->journal, 0)) {
fdfccdbc 86 log_info("%s: Journal header limits reached or header out-of-date, rotating",
dd87b184
ZJS
87 w->journal->path);
88 r = do_rotate(&w->journal, compress, seal);
fdfccdbc
ZJS
89 if (r < 0)
90 return r;
91 }
92
d180c349
ZJS
93 r = journal_file_append_entry(w->journal, ts, NULL,
94 iovw->iovec, iovw->count,
dd87b184
ZJS
95 &w->seqnum, NULL, NULL);
96 if (r >= 0) {
97 if (w->server)
98 w->server->event_count += 1;
e743ce70
ZJS
99 return 0;
100 } else if (r == -EBADMSG)
101 return r;
fdfccdbc 102
da927ba9 103 log_debug_errno(r, "%s: Write failed, rotating: %m", w->journal->path);
dd87b184 104 r = do_rotate(&w->journal, compress, seal);
fdfccdbc
ZJS
105 if (r < 0)
106 return r;
a83f4037 107 else
0e72da6f 108 log_debug("%s: Successfully rotated journal", w->journal->path);
fdfccdbc
ZJS
109
110 log_debug("Retrying write.");
d180c349
ZJS
111 r = journal_file_append_entry(w->journal, ts, NULL,
112 iovw->iovec, iovw->count,
dd87b184
ZJS
113 &w->seqnum, NULL, NULL);
114 if (r < 0)
115 return r;
116
117 if (w->server)
118 w->server->event_count += 1;
e743ce70 119 return 0;
fdfccdbc 120}