]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/journal/journal-file.h
journal: coalesce ftruncate()s in 250ms windows
[thirdparty/systemd.git] / src / journal / journal-file.h
CommitLineData
87d2c1ff
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
c2f1db8f 3#pragma once
87d2c1ff
LP
4
5/***
6 This file is part of systemd.
7
8 Copyright 2011 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
87d2c1ff
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
87d2c1ff 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
87d2c1ff
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
24#include <inttypes.h>
25
7560fffc
LP
26#ifdef HAVE_GCRYPT
27#include <gcrypt.h>
28#endif
29
fa6ac760 30#include "sd-id128.h"
81527be1 31
71d35b6b 32#include "hashmap.h"
87d2c1ff 33#include "journal-def.h"
a2341f68 34#include "macro.h"
16e9f408 35#include "mmap-cache.h"
7a24f3bf 36#include "sd-event.h"
71d35b6b 37#include "sparse-endian.h"
de190aef 38
bc85bfee 39typedef struct JournalMetrics {
8580d1f7
LP
40 /* For all these: -1 means "pick automatically", and 0 means "no limit enforced" */
41 uint64_t max_size; /* how large journal files grow at max */
42 uint64_t min_size; /* how large journal files grow at least */
43 uint64_t max_use; /* how much disk space to use in total at max, keep_free permitting */
44 uint64_t min_use; /* how much disk space to use in total at least, even if keep_free says not to */
45 uint64_t keep_free; /* how much to keep free on disk */
46 uint64_t n_max_files; /* how many files to keep around at max */
bc85bfee
LP
47} JournalMetrics;
48
87011c25
ZJS
49typedef enum direction {
50 DIRECTION_UP,
51 DIRECTION_DOWN
52} direction_t;
53
99cc7653
MS
54typedef enum LocationType {
55 /* The first and last entries, resp. */
56 LOCATION_HEAD,
57 LOCATION_TAIL,
58
59 /* We already read the entry we currently point to, and the
60 * next one to read should probably not be this one again. */
61 LOCATION_DISCRETE,
62
63 /* We should seek to the precise location specified, and
64 * return it, as we haven't read it yet. */
65 LOCATION_SEEK
66} LocationType;
67
f4b47811
LP
68typedef struct JournalFile {
69 int fd;
87011c25 70
0ac38b70 71 mode_t mode;
7560fffc 72
0ac38b70 73 int flags;
f4b47811 74 int prot;
b8e891e6 75 bool writable:1;
d89c8fdf
ZJS
76 bool compress_xz:1;
77 bool compress_lz4:1;
b8e891e6 78 bool seal:1;
f27a3864 79 bool defrag_on_close:1;
7560fffc 80
b8e891e6 81 bool tail_entry_monotonic_valid:1;
f4b47811 82
87011c25 83 direction_t last_direction;
6573ef05 84 LocationType location_type;
6e693b42 85 uint64_t last_n_entries;
87011c25
ZJS
86
87 char *path;
88 struct stat last_stat;
2678031a 89 usec_t last_stat_usec;
87011c25 90
f4b47811 91 Header *header;
de190aef
LP
92 HashItem *data_hash_table;
93 HashItem *field_hash_table;
f4b47811 94
f4b47811 95 uint64_t current_offset;
6573ef05
MS
96 uint64_t current_seqnum;
97 uint64_t current_realtime;
98 uint64_t current_monotonic;
99 sd_id128_t current_boot_id;
100 uint64_t current_xor_hash;
bc85bfee
LP
101
102 JournalMetrics metrics;
16e9f408 103 MMapCache *mmap;
807e17f0 104
7a24f3bf
VC
105 sd_event_source *post_change_timer;
106 usec_t post_change_timer_period;
107
4743015d 108 OrderedHashmap *chain_cache;
a4bcff5b 109
10893a5c 110#if defined(HAVE_XZ) || defined(HAVE_LZ4)
807e17f0 111 void *compress_buffer;
fa1c4b51 112 size_t compress_buffer_size;
807e17f0 113#endif
7560fffc
LP
114
115#ifdef HAVE_GCRYPT
116 gcry_md_hd_t hmac;
117 bool hmac_running;
118
baed47c3
LP
119 FSSHeader *fss_file;
120 size_t fss_file_size;
121
122 uint64_t fss_start_usec;
123 uint64_t fss_interval_usec;
b7c9ae91
LP
124
125 void *fsprg_state;
126 size_t fsprg_state_size;
127
128 void *fsprg_seed;
129 size_t fsprg_seed_size;
7560fffc 130#endif
f4b47811
LP
131} JournalFile;
132
4a92baf3
LP
133int journal_file_open(
134 const char *fname,
135 int flags,
136 mode_t mode,
7560fffc 137 bool compress,
baed47c3 138 bool seal,
4a92baf3 139 JournalMetrics *metrics,
27370278 140 MMapCache *mmap_cache,
4a92baf3
LP
141 JournalFile *template,
142 JournalFile **ret);
143
26687bf8 144int journal_file_set_offline(JournalFile *f);
804ae586 145JournalFile* journal_file_close(JournalFile *j);
87d2c1ff 146
4a92baf3
LP
147int journal_file_open_reliably(
148 const char *fname,
149 int flags,
150 mode_t mode,
7560fffc 151 bool compress,
baed47c3 152 bool seal,
4a92baf3 153 JournalMetrics *metrics,
27370278 154 MMapCache *mmap_cache,
4a92baf3
LP
155 JournalFile *template,
156 JournalFile **ret);
9447a7f1 157
0284adc6 158#define ALIGN64(x) (((x) + 7ULL) & ~7ULL)
db11ac1a 159#define VALID64(x) (((x) & 7ULL) == 0ULL)
0284adc6 160
ae97089d
ZJS
161/* Use six characters to cover the offsets common in smallish journal
162 * files without adding too many zeros. */
163#define OFSfmt "%06"PRIx64
164
fc89a139
LP
165static inline bool VALID_REALTIME(uint64_t u) {
166 /* This considers timestamps until the year 3112 valid. That should be plenty room... */
167 return u > 0 && u < (1ULL << 55);
168}
169
170static inline bool VALID_MONOTONIC(uint64_t u) {
171 /* This considers timestamps until 1142 years of runtime valid. */
172 return u < (1ULL << 55);
173}
174
175static inline bool VALID_EPOCH(uint64_t u) {
176 /* This allows changing the key for 1142 years, every usec. */
177 return u < (1ULL << 55);
178}
179
0284adc6
LP
180#define JOURNAL_HEADER_CONTAINS(h, field) \
181 (le64toh((h)->header_size) >= offsetof(Header, field) + sizeof((h)->field))
182
8088cbd3
LP
183#define JOURNAL_HEADER_SEALED(h) \
184 (!!(le32toh((h)->compatible_flags) & HEADER_COMPATIBLE_SEALED))
185
d89c8fdf
ZJS
186#define JOURNAL_HEADER_COMPRESSED_XZ(h) \
187 (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_XZ))
188
189#define JOURNAL_HEADER_COMPRESSED_LZ4(h) \
190 (!!(le32toh((h)->incompatible_flags) & HEADER_INCOMPATIBLE_COMPRESSED_LZ4))
8088cbd3 191
78519831 192int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret);
87d2c1ff 193
44a6b1b6
ZJS
194uint64_t journal_file_entry_n_items(Object *o) _pure_;
195uint64_t journal_file_entry_array_n_items(Object *o) _pure_;
196uint64_t journal_file_hash_table_n_items(Object *o) _pure_;
87d2c1ff 197
78519831 198int journal_file_append_object(JournalFile *f, ObjectType type, uint64_t size, Object **ret, uint64_t *offset);
c2373f84 199int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const struct iovec iovec[], unsigned n_iovec, uint64_t *seqno, Object **ret, uint64_t *offset);
87d2c1ff 200
de190aef
LP
201int journal_file_find_data_object(JournalFile *f, const void *data, uint64_t size, Object **ret, uint64_t *offset);
202int journal_file_find_data_object_with_hash(JournalFile *f, const void *data, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
87d2c1ff 203
3c1668da
LP
204int journal_file_find_field_object(JournalFile *f, const void *field, uint64_t size, Object **ret, uint64_t *offset);
205int journal_file_find_field_object_with_hash(JournalFile *f, const void *field, uint64_t size, uint64_t hash, Object **ret, uint64_t *offset);
206
1fc605b0 207void journal_file_reset_location(JournalFile *f);
950c07d4 208void journal_file_save_location(JournalFile *f, Object *o, uint64_t offset);
d8ae66d7 209int journal_file_compare_locations(JournalFile *af, JournalFile *bf);
f534928a 210int journal_file_next_entry(JournalFile *f, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
87d2c1ff 211
de190aef
LP
212int journal_file_next_entry_for_data(JournalFile *f, Object *o, uint64_t p, uint64_t data_offset, direction_t direction, Object **ret, uint64_t *offset);
213
214int journal_file_move_to_entry_by_seqnum(JournalFile *f, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
215int journal_file_move_to_entry_by_realtime(JournalFile *f, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
216int journal_file_move_to_entry_by_monotonic(JournalFile *f, sd_id128_t boot_id, uint64_t monotonic, direction_t direction, Object **ret, uint64_t *offset);
217
cbdca852 218int journal_file_move_to_entry_by_offset_for_data(JournalFile *f, uint64_t data_offset, uint64_t p, direction_t direction, Object **ret, uint64_t *offset);
de190aef
LP
219int journal_file_move_to_entry_by_seqnum_for_data(JournalFile *f, uint64_t data_offset, uint64_t seqnum, direction_t direction, Object **ret, uint64_t *offset);
220int journal_file_move_to_entry_by_realtime_for_data(JournalFile *f, uint64_t data_offset, uint64_t realtime, direction_t direction, Object **ret, uint64_t *offset);
cbdca852 221int journal_file_move_to_entry_by_monotonic_for_data(JournalFile *f, uint64_t data_offset, sd_id128_t boot_id, uint64_t monotonic, direction_t direction, Object **ret, uint64_t *offset);
87d2c1ff 222
cf244689
LP
223int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p, uint64_t *seqnum, Object **ret, uint64_t *offset);
224
87d2c1ff 225void journal_file_dump(JournalFile *f);
dca6219e 226void journal_file_print_header(JournalFile *f);
87d2c1ff 227
baed47c3 228int journal_file_rotate(JournalFile **f, bool compress, bool seal);
0ac38b70 229
cf244689 230void journal_file_post_change(JournalFile *f);
7a24f3bf 231int journal_file_enable_post_change_timer(JournalFile *f, sd_event *e, usec_t t);
cf244689 232
8580d1f7 233void journal_reset_metrics(JournalMetrics *m);
babfc091
LP
234void journal_default_metrics(JournalMetrics *m, int fd);
235
08984293
LP
236int journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *to);
237int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to);
238
fb0951b0 239bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
dade37d4
LP
240
241int journal_file_map_data_hash_table(JournalFile *f);
242int journal_file_map_field_hash_table(JournalFile *f);
d1afbcd2
LP
243
244static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) {
245 assert(f);
246 return f->compress_xz || f->compress_lz4;
247}