|
|
803fb7 |
From f45b66a348f5778bd391ad1b0a0e09bf5789b415 Mon Sep 17 00:00:00 2001
|
|
|
803fb7 |
From: Lennart Poettering <lennart@poettering.net>
|
|
|
803fb7 |
Date: Sat, 24 Oct 2015 13:17:54 +0200
|
|
|
803fb7 |
Subject: [PATCH] journal: fix error handling when compressing journal objects
|
|
|
803fb7 |
|
|
|
803fb7 |
Let's make sure we handle compression errors properly, and don't
|
|
|
803fb7 |
misunderstand an error for success.
|
|
|
803fb7 |
|
|
|
803fb7 |
Also, let's actually compress things if lz4 is enabled.
|
|
|
803fb7 |
|
|
|
803fb7 |
Fixes #1662.
|
|
|
803fb7 |
|
|
|
803fb7 |
Cherry-picked from: d1afbcd22170e95c79261340071d376fe41fc3af
|
|
|
803fb7 |
Resolves: #1292447
|
|
|
803fb7 |
---
|
|
|
803fb7 |
src/journal/journal-file.c | 12 +++++++-----
|
|
|
803fb7 |
src/journal/journal-file.h | 5 +++++
|
|
|
803fb7 |
2 files changed, 12 insertions(+), 5 deletions(-)
|
|
|
803fb7 |
|
|
|
803fb7 |
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
|
|
|
803fb7 |
index f500568fe..a8f92e23a 100644
|
|
|
803fb7 |
--- a/src/journal/journal-file.c
|
|
|
803fb7 |
+++ b/src/journal/journal-file.c
|
|
|
803fb7 |
@@ -1051,23 +1051,25 @@ static int journal_file_append_data(
|
|
|
803fb7 |
o->data.hash = htole64(hash);
|
|
|
803fb7 |
|
|
|
803fb7 |
#if defined(HAVE_XZ) || defined(HAVE_LZ4)
|
|
|
803fb7 |
- if (f->compress_xz &&
|
|
|
803fb7 |
- size >= COMPRESSION_SIZE_THRESHOLD) {
|
|
|
803fb7 |
+ if (JOURNAL_FILE_COMPRESS(f) && size >= COMPRESSION_SIZE_THRESHOLD) {
|
|
|
803fb7 |
size_t rsize;
|
|
|
803fb7 |
|
|
|
803fb7 |
compression = compress_blob(data, size, o->data.payload, &rsize);
|
|
|
803fb7 |
|
|
|
803fb7 |
- if (compression) {
|
|
|
803fb7 |
+ if (compression >= 0) {
|
|
|
803fb7 |
o->object.size = htole64(offsetof(Object, data.payload) + rsize);
|
|
|
803fb7 |
o->object.flags |= compression;
|
|
|
803fb7 |
|
|
|
803fb7 |
log_debug("Compressed data object %"PRIu64" -> %zu using %s",
|
|
|
803fb7 |
size, rsize, object_compressed_to_string(compression));
|
|
|
803fb7 |
- }
|
|
|
803fb7 |
+ } else
|
|
|
803fb7 |
+ /* Compression didn't work, we don't really care why, let's continue without compression */
|
|
|
803fb7 |
+ compression = 0;
|
|
|
803fb7 |
+
|
|
|
803fb7 |
}
|
|
|
803fb7 |
#endif
|
|
|
803fb7 |
|
|
|
803fb7 |
- if (!compression && size > 0)
|
|
|
803fb7 |
+ if (compression == 0 && size > 0)
|
|
|
803fb7 |
memcpy(o->data.payload, data, size);
|
|
|
803fb7 |
|
|
|
803fb7 |
r = journal_file_link_data(f, o, p, hash);
|
|
|
803fb7 |
diff --git a/src/journal/journal-file.h b/src/journal/journal-file.h
|
|
|
803fb7 |
index 403c8f760..0f29b092b 100644
|
|
|
803fb7 |
--- a/src/journal/journal-file.h
|
|
|
803fb7 |
+++ b/src/journal/journal-file.h
|
|
|
803fb7 |
@@ -229,3 +229,8 @@ int journal_file_get_cutoff_realtime_usec(JournalFile *f, usec_t *from, usec_t *
|
|
|
803fb7 |
int journal_file_get_cutoff_monotonic_usec(JournalFile *f, sd_id128_t boot, usec_t *from, usec_t *to);
|
|
|
803fb7 |
|
|
|
803fb7 |
bool journal_file_rotate_suggested(JournalFile *f, usec_t max_file_usec);
|
|
|
803fb7 |
+
|
|
|
803fb7 |
+static inline bool JOURNAL_FILE_COMPRESS(JournalFile *f) {
|
|
|
803fb7 |
+ assert(f);
|
|
|
803fb7 |
+ return f->compress_xz || f->compress_lz4;
|
|
|
803fb7 |
+}
|