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