diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2023-04-07 09:28:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-07 09:28:27 +0200 |
commit | 1e094cb4ba258496dd8b210658106f3d196252a2 (patch) | |
tree | 5c3fa8f17a8525d15fe911dc68b94657322dffc1 /src/libsystemd | |
parent | 744b04c5571eb1518e686dce505357aa3fb94ce8 (diff) | |
parent | d23a1c52a93206b0dbabcb4336752ccb796c11c3 (diff) | |
download | systemd-1e094cb4ba258496dd8b210658106f3d196252a2.tar.gz |
Merge pull request #27126 from yuwata/journal-compress
sd-journal: allow to specify compression algorithm through env
Diffstat (limited to 'src/libsystemd')
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.c | 117 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.h | 12 |
2 files changed, 98 insertions, 31 deletions
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 8da4ca9cad..a616390ad8 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -27,6 +27,7 @@ #include "journal-internal.h" #include "lookup3.h" #include "memory-util.h" +#include "missing_threads.h" #include "path-util.h" #include "prioq.h" #include "random-util.h" @@ -313,27 +314,79 @@ JournalFile* journal_file_close(JournalFile *f) { } static bool keyed_hash_requested(void) { + static thread_local int cached = -1; int r; - r = getenv_bool("SYSTEMD_JOURNAL_KEYED_HASH"); - if (r >= 0) - return r; - if (r != -ENXIO) - log_debug_errno(r, "Failed to parse $SYSTEMD_JOURNAL_KEYED_HASH environment variable, ignoring: %m"); + if (cached < 0) { + r = getenv_bool("SYSTEMD_JOURNAL_KEYED_HASH"); + if (r < 0) { + if (r != -ENXIO) + log_debug_errno(r, "Failed to parse $SYSTEMD_JOURNAL_KEYED_HASH environment variable, ignoring: %m"); + cached = true; + } else + cached = r; + } - return true; + return cached; } static bool compact_mode_requested(void) { + static thread_local int cached = -1; + int r; + + if (cached < 0) { + r = getenv_bool("SYSTEMD_JOURNAL_COMPACT"); + if (r < 0) { + if (r != -ENXIO) + log_debug_errno(r, "Failed to parse $SYSTEMD_JOURNAL_COMPACT environment variable, ignoring: %m"); + cached = true; + } else + cached = r; + } + + return cached; +} + +#if HAVE_COMPRESSION +static Compression getenv_compression(void) { + Compression c; + const char *e; int r; - r = getenv_bool("SYSTEMD_JOURNAL_COMPACT"); + e = getenv("SYSTEMD_JOURNAL_COMPRESS"); + if (!e) + return DEFAULT_COMPRESSION; + + r = parse_boolean(e); if (r >= 0) - return r; - if (r != -ENXIO) - log_debug_errno(r, "Failed to parse $SYSTEMD_JOURNAL_COMPACT environment variable, ignoring: %m"); + return r ? DEFAULT_COMPRESSION : COMPRESSION_NONE; - return true; + 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( @@ -355,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( @@ -1619,24 +1672,31 @@ static int journal_file_append_field( } static Compression maybe_compress_payload(JournalFile *f, uint8_t *dst, const uint8_t *src, uint64_t size, size_t *rsize) { - Compression compression = COMPRESSION_NONE; - assert(f); assert(f->header); #if HAVE_COMPRESSION - if (JOURNAL_FILE_COMPRESS(f) && size >= f->compress_threshold_bytes) { - compression = compress_blob(src, size, dst, size - 1, rsize); - if (compression > 0) - log_debug("Compressed data object %"PRIu64" -> %zu using %s", - size, *rsize, compression_to_string(compression)); - else - /* Compression didn't work, we don't really care why, let's continue without compression */ - compression = COMPRESSION_NONE; + Compression c; + int r; + + c = JOURNAL_FILE_COMPRESSION(f); + if (c == COMPRESSION_NONE || size < f->compress_threshold_bytes) + return COMPRESSION_NONE; + + r = compress_blob_explicit(c, src, size, dst, size - 1, rsize); + if (r < 0) { + log_debug_errno(r, "Failed to compress data object using %s, ignoring: %m", compression_to_string(c)); + /* Compression didn't work, we don't really care why, let's continue without compression */ + return COMPRESSION_NONE; } -#endif - return compression; + assert(r == c); + log_debug("Compressed data object %"PRIu64" -> %zu using %s", size, *rsize, compression_to_string(c)); + + return c; +#else + return COMPRESSION_NONE; +#endif } static int journal_file_append_data( @@ -3956,20 +4016,21 @@ int journal_file_open( f->close_fd = true; if (DEBUG_LOGGING) { - static int last_seal = -1, last_compress = -1, last_keyed_hash = -1; + static int last_seal = -1, last_keyed_hash = -1; + static Compression last_compression = _COMPRESSION_INVALID; static uint64_t last_bytes = UINT64_MAX; if (last_seal != JOURNAL_HEADER_SEALED(f->header) || last_keyed_hash != JOURNAL_HEADER_KEYED_HASH(f->header) || - last_compress != JOURNAL_FILE_COMPRESS(f) || + last_compression != JOURNAL_FILE_COMPRESSION(f) || last_bytes != f->compress_threshold_bytes) { log_debug("Journal effective settings seal=%s keyed_hash=%s compress=%s compress_threshold_bytes=%s", yes_no(JOURNAL_HEADER_SEALED(f->header)), yes_no(JOURNAL_HEADER_KEYED_HASH(f->header)), - yes_no(JOURNAL_FILE_COMPRESS(f)), FORMAT_BYTES(f->compress_threshold_bytes)); + compression_to_string(JOURNAL_FILE_COMPRESSION(f)), FORMAT_BYTES(f->compress_threshold_bytes)); last_seal = JOURNAL_HEADER_SEALED(f->header); last_keyed_hash = JOURNAL_HEADER_KEYED_HASH(f->header); - last_compress = JOURNAL_FILE_COMPRESS(f); + last_compression = JOURNAL_FILE_COMPRESSION(f); last_bytes = f->compress_threshold_bytes; } } diff --git a/src/libsystemd/sd-journal/journal-file.h b/src/libsystemd/sd-journal/journal-file.h index 70d2276ced..a4d8912aa8 100644 --- a/src/libsystemd/sd-journal/journal-file.h +++ b/src/libsystemd/sd-journal/journal-file.h @@ -321,10 +321,16 @@ bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec, int log int journal_file_map_data_hash_table(JournalFile *f); int journal_file_map_field_hash_table(JournalFile *f); -static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) { +static inline Compression JOURNAL_FILE_COMPRESSION(JournalFile *f) { assert(f); - return JOURNAL_HEADER_COMPRESSED_XZ(f->header) || JOURNAL_HEADER_COMPRESSED_LZ4(f->header) || - JOURNAL_HEADER_COMPRESSED_ZSTD(f->header); + + if (JOURNAL_HEADER_COMPRESSED_XZ(f->header)) + return COMPRESSION_XZ; + if (JOURNAL_HEADER_COMPRESSED_LZ4(f->header)) + return COMPRESSION_LZ4; + if (JOURNAL_HEADER_COMPRESSED_ZSTD(f->header)) + return COMPRESSION_ZSTD; + return COMPRESSION_NONE; } uint64_t journal_file_hash_data(JournalFile *f, const void *data, size_t sz); |