56 lines
2.0 KiB
Diff
56 lines
2.0 KiB
Diff
From 71976e91c5a887585b9fb8a162116824b141eecf Mon Sep 17 00:00:00 2001
|
|
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
Date: Fri, 12 Nov 2021 14:32:40 +0000
|
|
Subject: [PATCH] journal: Deduplicate entry items before they are stored in
|
|
the entry object
|
|
|
|
If the iovec contains the same data more than once, we'll end up with
|
|
duplicate offsets in the items array. Let's make sure we remove any
|
|
duplicates before we store the items in an entry object.
|
|
|
|
(cherry picked from commit 5ec9fbae64bef896368f744a875dd0437a4c42f2)
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/systemd/systemd/commit/71976e91c5a887585b9fb8a162116824b141eecf
|
|
---
|
|
src/libsystemd/sd-journal/journal-file.c | 16 ++++++++++++++++
|
|
1 file changed, 16 insertions(+)
|
|
|
|
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c
|
|
index ae19c1c1f2..a8029c2868 100644
|
|
--- a/src/libsystemd/sd-journal/journal-file.c
|
|
+++ b/src/libsystemd/sd-journal/journal-file.c
|
|
@@ -2082,6 +2082,21 @@ static int entry_item_cmp(const EntryItem *a, const EntryItem *b) {
|
|
return CMP(le64toh(a->object_offset), le64toh(b->object_offset));
|
|
}
|
|
|
|
+static size_t remove_duplicate_entry_items(EntryItem items[], size_t n) {
|
|
+
|
|
+ /* This function relies on the items array being sorted. */
|
|
+ size_t j = 1;
|
|
+
|
|
+ if (n <= 1)
|
|
+ return n;
|
|
+
|
|
+ for (size_t i = 1; i < n; i++)
|
|
+ if (items[i].object_offset != items[j - 1].object_offset)
|
|
+ items[j++] = items[i];
|
|
+
|
|
+ return j;
|
|
+}
|
|
+
|
|
int journal_file_append_entry(
|
|
JournalFile *f,
|
|
const dual_timestamp *ts,
|
|
@@ -2151,6 +2166,7 @@ int journal_file_append_entry(
|
|
/* Order by the position on disk, in order to improve seek
|
|
* times for rotating media. */
|
|
typesafe_qsort(items, n_iovec, entry_item_cmp);
|
|
+ n_iovec = remove_duplicate_entry_items(items, n_iovec);
|
|
|
|
r = journal_file_append_entry_internal(f, ts, boot_id, xor_hash, items, n_iovec, seqnum, ret, ret_offset);
|
|
|
|
--
|
|
2.33.0
|
|
|