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