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 14:19:51 +09:00
parent 2360352ef0
commit 1f06ea747b
2 changed files with 51 additions and 1 deletions

View file

@ -513,6 +513,14 @@ SYSTEMD_HOME_DEBUG_SUFFIX=foo \
journal. Note that journal files in compact mode are limited to 4G to allow use of
32-bit offsets. Enabled by default.
* `$SYSTEMD_JOURNAL_COMPRESS` Takes a boolean, or one of the compression
algorithms "XZ", "LZ4", and "ZSTD". If enabled, the default compression
algorithm set at compile time will be used when opening a new journal file.
If disabled, the journal file compression will be disabled. Note that the
compression mode of existing journal files are not changed. To make the
specified algorithm takes an effect immediately, you need to explicitly run
`journalctl --rotate`.
`systemd-pcrphase`, `systemd-cryptsetup`:
* `$SYSTEMD_FORCE_MEASURE=1` — If set, force measuring of resources (which are

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(