diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2023-04-04 18:22:50 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2023-04-04 18:32:12 +0900 |
commit | 2360352ef02548723ac0c8eaf5ff6905eb9eeca5 (patch) | |
tree | 1c88cc2afcb66f079338079489667113b086f57a /src/libsystemd/sd-journal | |
parent | 83f3d73da8d132773dd91aae0fa7babb74920774 (diff) | |
download | systemd-2360352ef02548723ac0c8eaf5ff6905eb9eeca5.tar.gz |
sd-journal: always use the compression algorithm specified in the header
Previously, data object may be compressed with an algorithm that is not
mentioned in the header.
Diffstat (limited to 'src/libsystemd/sd-journal')
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.c | 40 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.h | 12 |
2 files changed, 33 insertions, 19 deletions
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 675ecea7b6..4b00129c7f 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -1630,24 +1630,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( @@ -3967,20 +3974,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); |