]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/journal-remote/journal-remote-write.c
2 This file is part of systemd.
4 Copyright 2012 Zbigniew Jędrzejewski-Szmek
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.
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.
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/>.
20 #include "alloc-util.h"
21 #include "journal-remote.h"
23 int iovw_put(struct iovec_wrapper
*iovw
, void* data
, size_t len
) {
24 if (!GREEDY_REALLOC(iovw
->iovec
, iovw
->size_bytes
, iovw
->count
+ 1))
27 iovw
->iovec
[iovw
->count
++] = (struct iovec
) {data
, len
};
31 void iovw_free_contents(struct iovec_wrapper
*iovw
) {
32 iovw
->iovec
= mfree(iovw
->iovec
);
33 iovw
->size_bytes
= iovw
->count
= 0;
36 size_t iovw_size(struct iovec_wrapper
*iovw
) {
39 for (i
= 0; i
< iovw
->count
; i
++)
40 n
+= iovw
->iovec
[i
].iov_len
;
45 void iovw_rebase(struct iovec_wrapper
*iovw
, char *old
, char *new) {
48 for (i
= 0; i
< iovw
->count
; i
++)
49 iovw
->iovec
[i
].iov_base
= (char*) iovw
->iovec
[i
].iov_base
- old
+ new;
52 /**********************************************************************
53 **********************************************************************
54 **********************************************************************/
56 static int do_rotate(JournalFile
**f
, bool compress
, bool seal
) {
57 int r
= journal_file_rotate(f
, compress
, seal
, NULL
);
60 log_error_errno(r
, "Failed to rotate %s: %m", (*f
)->path
);
62 log_error_errno(r
, "Failed to create rotated journal: %m");
68 Writer
* writer_new(RemoteServer
*server
) {
75 memset(&w
->metrics
, 0xFF, sizeof(w
->metrics
));
77 w
->mmap
= mmap_cache_new();
89 Writer
* writer_free(Writer
*w
) {
94 log_debug("Closing journal file %s.", w
->journal
->path
);
95 journal_file_close(w
->journal
);
98 if (w
->server
&& w
->hashmap_key
)
99 hashmap_remove(w
->server
->writers
, w
->hashmap_key
);
101 free(w
->hashmap_key
);
104 mmap_cache_unref(w
->mmap
);
111 Writer
* writer_unref(Writer
*w
) {
112 if (w
&& (-- w
->n_ref
<= 0))
118 Writer
* writer_ref(Writer
*w
) {
120 assert_se(++ w
->n_ref
>= 2);
125 int writer_write(Writer
*w
,
126 struct iovec_wrapper
*iovw
,
134 assert(iovw
->count
> 0);
136 if (journal_file_rotate_suggested(w
->journal
, 0)) {
137 log_info("%s: Journal header limits reached or header out-of-date, rotating",
139 r
= do_rotate(&w
->journal
, compress
, seal
);
144 r
= journal_file_append_entry(w
->journal
, ts
, iovw
->iovec
, iovw
->count
,
145 &w
->seqnum
, NULL
, NULL
);
148 w
->server
->event_count
+= 1;
152 log_debug_errno(r
, "%s: Write failed, rotating: %m", w
->journal
->path
);
153 r
= do_rotate(&w
->journal
, compress
, seal
);
157 log_debug("%s: Successfully rotated journal", w
->journal
->path
);
159 log_debug("Retrying write.");
160 r
= journal_file_append_entry(w
->journal
, ts
, iovw
->iovec
, iovw
->count
,
161 &w
->seqnum
, NULL
, NULL
);
166 w
->server
->event_count
+= 1;