]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journal: fix error handling when compressing journal objects
authorLennart Poettering <lennart@poettering.net>
Sat, 24 Oct 2015 11:17:54 +0000 (13:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Sat, 24 Oct 2015 11:19:42 +0000 (13:19 +0200)
Let's make sure we handle compression errors properly, and don't
misunderstand an error for success.

Also, let's actually compress things if lz4 is enabled.

Fixes #1662.

src/journal/journal-file.c
src/journal/journal-file.h

index 1071c6d6d73dfa34df64f026266b82ba08b53f1b..89068f26d23cc9ac8f528b0a8b44ec4b8ac8dc5e 100644 (file)
@@ -1076,23 +1076,24 @@ static int journal_file_append_data(
         o->data.hash = htole64(hash);
 
 #if defined(HAVE_XZ) || defined(HAVE_LZ4)
-        if (f->compress_xz &&
-            size >= COMPRESSION_SIZE_THRESHOLD) {
+        if (JOURNAL_FILE_COMPRESS(f) && size >= COMPRESSION_SIZE_THRESHOLD) {
                 size_t rsize = 0;
 
                 compression = compress_blob(data, size, o->data.payload, &rsize);
 
-                if (compression) {
+                if (compression >= 0) {
                         o->object.size = htole64(offsetof(Object, data.payload) + rsize);
                         o->object.flags |= compression;
 
                         log_debug("Compressed data object %"PRIu64" -> %zu using %s",
                                   size, rsize, object_compressed_to_string(compression));
-                }
+                } else
+                        /* Compression didn't work, we don't really care why, let's continue without compression */
+                        compression = 0;
         }
 #endif
 
-        if (!compression && size > 0)
+        if (compression == 0 && size > 0)
                 memcpy(o->data.payload, data, size);
 
         r = journal_file_link_data(f, o, p, hash);
index f2c07356c82c543e2d21fdb8c5d24edb5e461c36..898d12d9924d331a0f70b4c5eebbb9d17727252f 100644 (file)
@@ -235,3 +235,8 @@ bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
 
 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) {
+        assert(f);
+        return f->compress_xz || f->compress_lz4;
+}