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