diff options
author | Daan De Meyer <daan.j.demeyer@gmail.com> | 2021-10-23 22:24:56 +0100 |
---|---|---|
committer | Daan De Meyer <daan.j.demeyer@gmail.com> | 2022-10-07 11:26:28 +0200 |
commit | 87413812c92b7a435e94c9c37ed634328d182d4d (patch) | |
tree | f18284550e64e4ec7477e15ea8b6cdd878ec55c4 /src/libsystemd | |
parent | c76691d708ac7fe13b7c4307c010d447fcbc3e9a (diff) | |
download | systemd-87413812c92b7a435e94c9c37ed634328d182d4d.tar.gz |
journal: Add compact mode
This adds a new flag in preparation for incompatible journal changes
which will be gated behind this flag. The max file size of journal
files in compact mode is limited to 4 GiB.
Diffstat (limited to 'src/libsystemd')
-rw-r--r-- | src/libsystemd/sd-journal/journal-def.h | 7 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.c | 15 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.h | 3 |
3 files changed, 19 insertions, 6 deletions
diff --git a/src/libsystemd/sd-journal/journal-def.h b/src/libsystemd/sd-journal/journal-def.h index ffd1af005f..e0919a7faa 100644 --- a/src/libsystemd/sd-journal/journal-def.h +++ b/src/libsystemd/sd-journal/journal-def.h @@ -152,19 +152,22 @@ enum { HEADER_INCOMPATIBLE_COMPRESSED_LZ4 = 1 << 1, HEADER_INCOMPATIBLE_KEYED_HASH = 1 << 2, HEADER_INCOMPATIBLE_COMPRESSED_ZSTD = 1 << 3, + HEADER_INCOMPATIBLE_COMPACT = 1 << 4, }; #define HEADER_INCOMPATIBLE_ANY \ (HEADER_INCOMPATIBLE_COMPRESSED_XZ | \ HEADER_INCOMPATIBLE_COMPRESSED_LZ4 | \ HEADER_INCOMPATIBLE_KEYED_HASH | \ - HEADER_INCOMPATIBLE_COMPRESSED_ZSTD) + HEADER_INCOMPATIBLE_COMPRESSED_ZSTD | \ + HEADER_INCOMPATIBLE_COMPACT) #define HEADER_INCOMPATIBLE_SUPPORTED \ ((HAVE_XZ ? HEADER_INCOMPATIBLE_COMPRESSED_XZ : 0) | \ (HAVE_LZ4 ? HEADER_INCOMPATIBLE_COMPRESSED_LZ4 : 0) | \ (HAVE_ZSTD ? HEADER_INCOMPATIBLE_COMPRESSED_ZSTD : 0) | \ - HEADER_INCOMPATIBLE_KEYED_HASH) + HEADER_INCOMPATIBLE_KEYED_HASH | \ + HEADER_INCOMPATIBLE_COMPACT) enum { HEADER_COMPATIBLE_SEALED = 1 << 0, diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 1fad2a8146..8a8b92a36c 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -44,6 +44,7 @@ /* This is the minimum journal file size */ #define JOURNAL_FILE_SIZE_MIN (512 * 1024ULL) /* 512 KiB */ +#define JOURNAL_COMPACT_SIZE_MAX UINT32_MAX /* 4 GiB */ /* These are the lower and upper bounds if we deduce the max_use value * from the file system size */ @@ -387,7 +388,7 @@ static bool warn_wrong_flags(const JournalFile *f, bool compatible) { f->path, type, flags & ~any); flags = (flags & any) & ~supported; if (flags) { - const char* strv[5]; + const char* strv[6]; size_t n = 0; _cleanup_free_ char *t = NULL; @@ -403,6 +404,8 @@ static bool warn_wrong_flags(const JournalFile *f, bool compatible) { strv[n++] = "zstd-compressed"; if (flags & HEADER_INCOMPATIBLE_KEYED_HASH) strv[n++] = "keyed-hash"; + if (flags & HEADER_INCOMPATIBLE_COMPACT) + strv[n++] = "compact"; } strv[n] = NULL; assert(n < ELEMENTSOF(strv)); @@ -3229,7 +3232,7 @@ void journal_file_print_header(JournalFile *f) { "Sequential number ID: %s\n" "State: %s\n" "Compatible flags:%s%s\n" - "Incompatible flags:%s%s%s%s%s\n" + "Incompatible flags:%s%s%s%s%s%s\n" "Header size: %"PRIu64"\n" "Arena size: %"PRIu64"\n" "Data hash table size: %"PRIu64"\n" @@ -3256,6 +3259,7 @@ void journal_file_print_header(JournalFile *f) { JOURNAL_HEADER_COMPRESSED_LZ4(f->header) ? " COMPRESSED-LZ4" : "", JOURNAL_HEADER_COMPRESSED_ZSTD(f->header) ? " COMPRESSED-ZSTD" : "", JOURNAL_HEADER_KEYED_HASH(f->header) ? " KEYED-HASH" : "", + JOURNAL_HEADER_COMPACT(f->header) ? " COMPACT" : "", (le32toh(f->header->incompatible_flags) & ~HEADER_INCOMPATIBLE_ANY) ? " ???" : "", le64toh(f->header->header_size), le64toh(f->header->arena_size), @@ -3336,7 +3340,7 @@ static int journal_file_warn_btrfs(JournalFile *f) { return 1; } -static void journal_default_metrics(JournalMetrics *m, int fd) { +static void journal_default_metrics(JournalMetrics *m, int fd, bool compact) { struct statvfs ss; uint64_t fs_size = 0; @@ -3379,6 +3383,9 @@ static void journal_default_metrics(JournalMetrics *m, int fd) { else m->max_size = PAGE_ALIGN(m->max_size); + if (compact && m->max_size > JOURNAL_COMPACT_SIZE_MAX) + m->max_size = JOURNAL_COMPACT_SIZE_MAX; + if (m->max_size != 0) { if (m->max_size < JOURNAL_FILE_SIZE_MIN) m->max_size = JOURNAL_FILE_SIZE_MIN; @@ -3570,7 +3577,7 @@ int journal_file_open( if (journal_file_writable(f)) { if (metrics) { - journal_default_metrics(metrics, f->fd); + journal_default_metrics(metrics, f->fd, JOURNAL_HEADER_COMPACT(f->header)); f->metrics = *metrics; } else if (template) f->metrics = template->metrics; diff --git a/src/libsystemd/sd-journal/journal-file.h b/src/libsystemd/sd-journal/journal-file.h index be02b2624f..01942ec72b 100644 --- a/src/libsystemd/sd-journal/journal-file.h +++ b/src/libsystemd/sd-journal/journal-file.h @@ -184,6 +184,9 @@ static inline bool VALID_EPOCH(uint64_t u) { #define JOURNAL_HEADER_KEYED_HASH(h) \ FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_KEYED_HASH) +#define JOURNAL_HEADER_COMPACT(h) \ + FLAGS_SET(le32toh((h)->incompatible_flags), HEADER_INCOMPATIBLE_COMPACT) + int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret); int journal_file_read_object_header(JournalFile *f, ObjectType type, uint64_t offset, Object *ret); |