]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal-remote/journal-remote-write.c
tree-wide: use mfree more
[thirdparty/systemd.git] / src / journal-remote / journal-remote-write.c
CommitLineData
fdfccdbc
ZJS
1/***
2 This file is part of systemd.
3
4 Copyright 2012 Zbigniew Jędrzejewski-Szmek
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18***/
19
b5efdb8a 20#include "alloc-util.h"
9ff48d09 21#include "journal-remote.h"
fdfccdbc
ZJS
22
23int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
24 if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
25 return log_oom();
26
27 iovw->iovec[iovw->count++] = (struct iovec) {data, len};
28 return 0;
29}
30
31void iovw_free_contents(struct iovec_wrapper *iovw) {
a1e58e8e 32 iovw->iovec = mfree(iovw->iovec);
fdfccdbc
ZJS
33 iovw->size_bytes = iovw->count = 0;
34}
35
36size_t iovw_size(struct iovec_wrapper *iovw) {
37 size_t n = 0, i;
38
92b10cbc 39 for (i = 0; i < iovw->count; i++)
fdfccdbc
ZJS
40 n += iovw->iovec[i].iov_len;
41
42 return n;
43}
44
92b10cbc
ZJS
45void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) {
46 size_t i;
47
48 for (i = 0; i < iovw->count; i++)
49 iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new;
50}
51
fdfccdbc
ZJS
52/**********************************************************************
53 **********************************************************************
54 **********************************************************************/
55
56static int do_rotate(JournalFile **f, bool compress, bool seal) {
b58c888f 57 int r = journal_file_rotate(f, compress, seal, NULL);
fdfccdbc
ZJS
58 if (r < 0) {
59 if (*f)
c33b3297 60 log_error_errno(r, "Failed to rotate %s: %m", (*f)->path);
fdfccdbc 61 else
c33b3297 62 log_error_errno(r, "Failed to create rotated journal: %m");
fdfccdbc
ZJS
63 }
64
65 return r;
66}
67
9ff48d09
ZJS
68Writer* writer_new(RemoteServer *server) {
69 Writer *w;
fdfccdbc 70
9ff48d09
ZJS
71 w = new0(Writer, 1);
72 if (!w)
73 return NULL;
fdfccdbc 74
9ff48d09 75 memset(&w->metrics, 0xFF, sizeof(w->metrics));
fdfccdbc 76
9ff48d09 77 w->mmap = mmap_cache_new();
6b430fdb
ZJS
78 if (!w->mmap)
79 return mfree(w);
fdfccdbc 80
9ff48d09
ZJS
81 w->n_ref = 1;
82 w->server = server;
fdfccdbc 83
9ff48d09 84 return w;
fdfccdbc
ZJS
85}
86
9ff48d09
ZJS
87Writer* writer_free(Writer *w) {
88 if (!w)
89 return NULL;
90
91 if (w->journal) {
92 log_debug("Closing journal file %s.", w->journal->path);
93 journal_file_close(w->journal);
eacbb4d3 94 }
9ff48d09 95
dd87b184
ZJS
96 if (w->server && w->hashmap_key)
97 hashmap_remove(w->server->writers, w->hashmap_key);
9ff48d09
ZJS
98
99 free(w->hashmap_key);
100
101 if (w->mmap)
102 mmap_cache_unref(w->mmap);
103
6b430fdb 104 return mfree(w);
9ff48d09
ZJS
105}
106
107Writer* writer_unref(Writer *w) {
108 if (w && (-- w->n_ref <= 0))
109 writer_free(w);
110
111 return NULL;
fdfccdbc
ZJS
112}
113
9ff48d09
ZJS
114Writer* writer_ref(Writer *w) {
115 if (w)
116 assert_se(++ w->n_ref >= 2);
117
118 return w;
119}
120
dd87b184 121int writer_write(Writer *w,
fdfccdbc
ZJS
122 struct iovec_wrapper *iovw,
123 dual_timestamp *ts,
124 bool compress,
125 bool seal) {
126 int r;
127
dd87b184 128 assert(w);
fdfccdbc
ZJS
129 assert(iovw);
130 assert(iovw->count > 0);
131
dd87b184 132 if (journal_file_rotate_suggested(w->journal, 0)) {
fdfccdbc 133 log_info("%s: Journal header limits reached or header out-of-date, rotating",
dd87b184
ZJS
134 w->journal->path);
135 r = do_rotate(&w->journal, compress, seal);
fdfccdbc
ZJS
136 if (r < 0)
137 return r;
138 }
139
dd87b184
ZJS
140 r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count,
141 &w->seqnum, NULL, NULL);
142 if (r >= 0) {
143 if (w->server)
144 w->server->event_count += 1;
fdfccdbc 145 return 1;
dd87b184 146 }
fdfccdbc 147
da927ba9 148 log_debug_errno(r, "%s: Write failed, rotating: %m", w->journal->path);
dd87b184 149 r = do_rotate(&w->journal, compress, seal);
fdfccdbc
ZJS
150 if (r < 0)
151 return r;
a83f4037 152 else
0e72da6f 153 log_debug("%s: Successfully rotated journal", w->journal->path);
fdfccdbc
ZJS
154
155 log_debug("Retrying write.");
dd87b184
ZJS
156 r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count,
157 &w->seqnum, NULL, NULL);
158 if (r < 0)
159 return r;
160
161 if (w->server)
162 w->server->event_count += 1;
163 return 1;
fdfccdbc 164}