245 lines
7.8 KiB
Diff
245 lines
7.8 KiB
Diff
From 57ba83ddd33d8ed5e8cee6a35f6ee780532a7a0d Mon Sep 17 00:00:00 2001
|
|
From: Daan De Meyer <daan.j.demeyer@gmail.com>
|
|
Date: Tue, 25 Jan 2022 11:50:40 +0000
|
|
Subject: [PATCH] journal: Only move to objects when necessary
|
|
|
|
Conflict:don't modify journal_file_read_object because 117e2112 isn't merged;
|
|
don't modify generic_array_get because 8d801e35cb isn't merged; adapt context
|
|
Reference:https://github.com/systemd/systemd/commit/ded10e3a5f4c9a9fca9a57f5feb7e77db4155dbd
|
|
|
|
Let's make sure we only move to objects when it's required. If "ret"
|
|
is NULL, the caller isn't interested in the actual object and the
|
|
function being called shouldn't move to it unless it has to
|
|
inspect/modify the object itself.
|
|
---
|
|
src/libsystemd/sd-journal/journal-file.c | 99 +++++++++--------------
|
|
1 file changed, 39 insertions(+), 60 deletions(-)
|
|
|
|
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c
|
|
index e3e926b..efc5018 100644
|
|
--- a/src/libsystemd/sd-journal/journal-file.c
|
|
+++ b/src/libsystemd/sd-journal/journal-file.c
|
|
@@ -931,7 +931,6 @@ int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset
|
|
uint64_t s;
|
|
|
|
assert(f);
|
|
- assert(ret);
|
|
|
|
/* Objects may only be located at multiple of 64 bit */
|
|
if (!VALID64(offset))
|
|
@@ -986,7 +985,9 @@ int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- *ret = o;
|
|
+ if (ret)
|
|
+ *ret = o;
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -1584,19 +1585,11 @@ static int journal_file_append_field(
|
|
|
|
hash = journal_file_hash_data(f, field, size);
|
|
|
|
- r = journal_file_find_field_object_with_hash(f, field, size, hash, &o, &p);
|
|
+ r = journal_file_find_field_object_with_hash(f, field, size, hash, ret, ret_offset);
|
|
if (r < 0)
|
|
return r;
|
|
- if (r > 0) {
|
|
-
|
|
- if (ret)
|
|
- *ret = o;
|
|
-
|
|
- if (ret_offset)
|
|
- *ret_offset = p;
|
|
-
|
|
+ if (r > 0)
|
|
return 0;
|
|
- }
|
|
|
|
osize = offsetof(Object, field.payload) + size;
|
|
r = journal_file_append_object(f, OBJECT_FIELD, osize, &o, &p);
|
|
@@ -1610,20 +1603,20 @@ static int journal_file_append_field(
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- /* The linking might have altered the window, so let's
|
|
- * refresh our pointer */
|
|
- r = journal_file_move_to_object(f, OBJECT_FIELD, p, &o);
|
|
- if (r < 0)
|
|
- return r;
|
|
+ /* The linking might have altered the window, so let's only pass the offset to hmac which will
|
|
+ * move to the object again if needed. */
|
|
|
|
#if HAVE_GCRYPT
|
|
- r = journal_file_hmac_put_object(f, OBJECT_FIELD, o, p);
|
|
+ r = journal_file_hmac_put_object(f, OBJECT_FIELD, NULL, p);
|
|
if (r < 0)
|
|
return r;
|
|
#endif
|
|
|
|
- if (ret)
|
|
- *ret = o;
|
|
+ if (ret) {
|
|
+ r = journal_file_move_to_object(f, OBJECT_FIELD, p, ret);
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+ }
|
|
|
|
if (ret_offset)
|
|
*ret_offset = p;
|
|
@@ -1647,19 +1640,11 @@ static int journal_file_append_data(
|
|
|
|
hash = journal_file_hash_data(f, data, size);
|
|
|
|
- r = journal_file_find_data_object_with_hash(f, data, size, hash, &o, &p);
|
|
+ r = journal_file_find_data_object_with_hash(f, data, size, hash, ret, ret_offset);
|
|
if (r < 0)
|
|
return r;
|
|
- if (r > 0) {
|
|
-
|
|
- if (ret)
|
|
- *ret = o;
|
|
-
|
|
- if (ret_offset)
|
|
- *ret_offset = p;
|
|
-
|
|
+ if (r > 0)
|
|
return 0;
|
|
- }
|
|
|
|
osize = offsetof(Object, data.payload) + size;
|
|
r = journal_file_append_object(f, OBJECT_DATA, osize, &o, &p);
|
|
@@ -1693,17 +1678,16 @@ static int journal_file_append_data(
|
|
if (r < 0)
|
|
return r;
|
|
|
|
-#if HAVE_GCRYPT
|
|
- r = journal_file_hmac_put_object(f, OBJECT_DATA, o, p);
|
|
+ /* The linking might have altered the window, so let's refresh our pointer. */
|
|
+ r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
|
|
if (r < 0)
|
|
return r;
|
|
-#endif
|
|
|
|
- /* The linking might have altered the window, so let's
|
|
- * refresh our pointer */
|
|
- r = journal_file_move_to_object(f, OBJECT_DATA, p, &o);
|
|
+#if HAVE_GCRYPT
|
|
+ r = journal_file_hmac_put_object(f, OBJECT_DATA, o, p);
|
|
if (r < 0)
|
|
return r;
|
|
+#endif
|
|
|
|
if (!data)
|
|
eq = NULL;
|
|
@@ -2307,20 +2290,15 @@ static int generic_array_get_plus_one(
|
|
uint64_t i,
|
|
Object **ret, uint64_t *ret_offset) {
|
|
|
|
- Object *o;
|
|
-
|
|
assert(f);
|
|
|
|
if (i == 0) {
|
|
int r;
|
|
|
|
- r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, &o);
|
|
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, ret);
|
|
if (r < 0)
|
|
return r;
|
|
|
|
- if (ret)
|
|
- *ret = o;
|
|
-
|
|
if (ret_offset)
|
|
*ret_offset = extra;
|
|
|
|
@@ -2349,7 +2327,7 @@ static int generic_array_bisect(
|
|
|
|
uint64_t a, p, t = 0, i = 0, last_p = 0, last_index = UINT64_MAX;
|
|
bool subtract_one = false;
|
|
- Object *o, *array = NULL;
|
|
+ Object *array = NULL;
|
|
int r;
|
|
ChainCacheItem *ci;
|
|
|
|
@@ -2537,12 +2515,11 @@ found:
|
|
else
|
|
p = le64toh(array->entry_array.items[i]);
|
|
|
|
- r = journal_file_move_to_object(f, OBJECT_ENTRY, p, &o);
|
|
- if (r < 0)
|
|
- return r;
|
|
-
|
|
- if (ret)
|
|
- *ret = o;
|
|
+ if (ret) {
|
|
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, p, ret);
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+ }
|
|
|
|
if (ret_offset)
|
|
*ret_offset = p;
|
|
@@ -2567,7 +2544,6 @@ static int generic_array_bisect_plus_one(
|
|
|
|
int r;
|
|
bool step_back = false;
|
|
- Object *o;
|
|
|
|
assert(f);
|
|
assert(test_object);
|
|
@@ -2610,12 +2586,11 @@ static int generic_array_bisect_plus_one(
|
|
return r;
|
|
|
|
found:
|
|
- r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, &o);
|
|
- if (r < 0)
|
|
- return r;
|
|
-
|
|
- if (ret)
|
|
- *ret = o;
|
|
+ if (ret) {
|
|
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, extra, ret);
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+ }
|
|
|
|
if (ret_offset)
|
|
*ret_offset = extra;
|
|
@@ -3088,7 +3063,6 @@ int journal_file_move_to_entry_by_monotonic_for_data(
|
|
* exists in both bisection arrays */
|
|
|
|
for (;;) {
|
|
- Object *qo;
|
|
uint64_t p, q;
|
|
|
|
r = journal_file_move_to_object(f, OBJECT_DATA, data_offset, &d);
|
|
@@ -3117,14 +3091,18 @@ int journal_file_move_to_entry_by_monotonic_for_data(
|
|
p,
|
|
test_object_offset,
|
|
direction,
|
|
- &qo, &q, NULL);
|
|
+ NULL, &q, NULL);
|
|
|
|
if (r <= 0)
|
|
return r;
|
|
|
|
if (p == q) {
|
|
- if (ret)
|
|
- *ret = qo;
|
|
+ if (ret) {
|
|
+ r = journal_file_move_to_object(f, OBJECT_ENTRY, q, ret);
|
|
+ if (r < 0)
|
|
+ return r;
|
|
+ }
|
|
+
|
|
if (ret_offset)
|
|
*ret_offset = q;
|
|
|
|
--
|
|
2.23.0
|
|
|