sd-journal: allow to specify compression algorithm through env

Fixes RHBZ#2183546 (https://bugzilla.redhat.com/show_bug.cgi?id=2183546).

Previously, journal file is always compressed with the default algorithm
set at compile time. So, if a newer algorithm is used, journal files
cannot be read by older version of journalctl that does not support the
algorithm.

Co-authored-by: Colin Walters <walters@verbum.org>
This commit is contained in:
Yu Watanabe
2023-04-04 18:32:12 +09:00
co-authored by Colin Walters
parent 2360352ef0
commit 1f06ea747b
2 changed files with 51 additions and 1 deletions
+43 -1
View File
@@ -347,6 +347,48 @@ static bool compact_mode_requested(void) {
return cached;
}
#if HAVE_COMPRESSION
static Compression getenv_compression(void) {
Compression c;
const char *e;
int r;
e = getenv("SYSTEMD_JOURNAL_COMPRESS");
if (!e)
return DEFAULT_COMPRESSION;
r = parse_boolean(e);
if (r >= 0)
return r ? DEFAULT_COMPRESSION : COMPRESSION_NONE;
c = compression_from_string(e);
if (c < 0) {
log_debug_errno(c, "Failed to parse SYSTEMD_JOURNAL_COMPRESS value, ignoring: %s", e);
return DEFAULT_COMPRESSION;
}
if (!compression_supported(c)) {
log_debug("Unsupported compression algorithm specified, ignoring: %s", e);
return DEFAULT_COMPRESSION;
}
return c;
}
#endif
static Compression compression_requested(void) {
#if HAVE_COMPRESSION
static thread_local Compression cached = _COMPRESSION_INVALID;
if (cached < 0)
cached = getenv_compression();
return cached;
#else
return COMPRESSION_NONE;
#endif
}
static int journal_file_init_header(
JournalFile *f,
JournalFileFlags file_flags,
@@ -366,7 +408,7 @@ static int journal_file_init_header(
Header h = {
.header_size = htole64(ALIGN64(sizeof(h))),
.incompatible_flags = htole32(
FLAGS_SET(file_flags, JOURNAL_COMPRESS) * COMPRESSION_TO_HEADER_INCOMPATIBLE_FLAG(DEFAULT_COMPRESSION) |
FLAGS_SET(file_flags, JOURNAL_COMPRESS) * COMPRESSION_TO_HEADER_INCOMPATIBLE_FLAG(compression_requested()) |
keyed_hash_requested() * HEADER_INCOMPATIBLE_KEYED_HASH |
compact_mode_requested() * HEADER_INCOMPATIBLE_COMPACT),
.compatible_flags = htole32(