Coverage Report

Created: 2019-06-19 13:33

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