diff options
author | Luca Boccassi <bluca@debian.org> | 2023-02-15 20:58:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-15 20:58:58 +0100 |
commit | 6f97aae029c0fe44d64dc5ff202ab0125571211f (patch) | |
tree | ea5f4f3fc2803ef8b982f7eee426f490091dfe5b /src/libsystemd/sd-journal | |
parent | Merge pull request #26410 from DaanDeMeyer/xattr-symlink (diff) | |
parent | test: add basic seqnum test (diff) | |
download | systemd-6f97aae029c0fe44d64dc5ff202ab0125571211f.tar.xz systemd-6f97aae029c0fe44d64dc5ff202ab0125571211f.zip |
Merge pull request #26213 from poettering/journal-rework-seqnum
journal sequence number rework
Diffstat (limited to 'src/libsystemd/sd-journal')
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.c | 30 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/journal-file.h | 5 | ||||
-rw-r--r-- | src/libsystemd/sd-journal/sd-journal.c | 31 |
3 files changed, 61 insertions, 5 deletions
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 2ead29548b..aab33dbfcc 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -2094,6 +2094,7 @@ static int journal_file_append_entry_internal( const EntryItem items[], size_t n_items, uint64_t *seqnum, + sd_id128_t *seqnum_id, Object **ret_object, uint64_t *ret_offset) { @@ -2139,6 +2140,21 @@ static int journal_file_append_entry_internal( } } + if (seqnum_id) { + /* Settle the passed in sequence number ID */ + + if (sd_id128_is_null(*seqnum_id)) + *seqnum_id = f->header->seqnum_id; /* Caller has none assigned, then copy the one from the file */ + else if (!sd_id128_equal(*seqnum_id, f->header->seqnum_id)) { + /* Different seqnum IDs? We can't allow entries from multiple IDs end up in the same journal.*/ + if (le64toh(f->header->n_entries) == 0) + f->header->seqnum_id = *seqnum_id; /* Caller has one, and file so far has no entries, then copy the one from the caller */ + else + return log_debug_errno(SYNTHETIC_ERRNO(EILSEQ), + "Sequence number IDs don't match, refusing entry."); + } + } + osize = offsetof(Object, entry.items) + (n_items * journal_file_entry_item_size(f)); r = journal_file_append_object(f, OBJECT_ENTRY, osize, &o, &np); @@ -2290,6 +2306,7 @@ int journal_file_append_entry( const struct iovec iovec[], size_t n_iovec, uint64_t *seqnum, + sd_id128_t *seqnum_id, Object **ret_object, uint64_t *ret_offset) { @@ -2376,7 +2393,7 @@ int journal_file_append_entry( 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_object, ret_offset); + r = journal_file_append_entry_internal(f, ts, boot_id, xor_hash, items, n_iovec, seqnum, seqnum_id, ret_object, ret_offset); /* If the memory mapping triggered a SIGBUS then we return an * IO error and ignore the error code passed down to us, since @@ -4093,7 +4110,14 @@ int journal_file_dispose(int dir_fd, const char *fname) { return 0; } -int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p) { +int journal_file_copy_entry( + JournalFile *from, + JournalFile *to, + Object *o, + uint64_t p, + uint64_t *seqnum, + sd_id128_t *seqnum_id) { + _cleanup_free_ EntryItem *items_alloc = NULL; EntryItem *items; uint64_t q, n, xor_hash = 0; @@ -4168,7 +4192,7 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6 return r; } - r = journal_file_append_entry_internal(to, &ts, boot_id, xor_hash, items, n, NULL, NULL, NULL); + r = journal_file_append_entry_internal(to, &ts, boot_id, xor_hash, items, n, seqnum, seqnum_id, NULL, NULL); if (mmap_cache_fd_got_sigbus(to->cache_fd)) return -EIO; diff --git a/src/libsystemd/sd-journal/journal-file.h b/src/libsystemd/sd-journal/journal-file.h index 8c809ed4b9..07f1f5d180 100644 --- a/src/libsystemd/sd-journal/journal-file.h +++ b/src/libsystemd/sd-journal/journal-file.h @@ -259,7 +259,8 @@ int journal_file_append_entry( const sd_id128_t *boot_id, const struct iovec iovec[], size_t n_iovec, - uint64_t *seqno, + uint64_t *seqnum, + sd_id128_t *seqnum_id, Object **ret_object, uint64_t *ret_offset); @@ -286,7 +287,7 @@ int journal_file_move_to_entry_by_seqnum_for_data(JournalFile *f, Object *d, uin int journal_file_move_to_entry_by_realtime_for_data(JournalFile *f, Object *d, uint64_t realtime, direction_t direction, Object **ret_object, uint64_t *ret_offset); int journal_file_move_to_entry_by_monotonic_for_data(JournalFile *f, Object *d, sd_id128_t boot_id, uint64_t monotonic, direction_t direction, Object **ret_object, uint64_t *ret_offset); -int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p); +int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint64_t p, uint64_t *seqnum, sd_id128_t *seqnum_id); void journal_file_dump(JournalFile *f); void journal_file_print_header(JournalFile *f); diff --git a/src/libsystemd/sd-journal/sd-journal.c b/src/libsystemd/sd-journal/sd-journal.c index 9947947ef2..afbf255266 100644 --- a/src/libsystemd/sd-journal/sd-journal.c +++ b/src/libsystemd/sd-journal/sd-journal.c @@ -2232,6 +2232,37 @@ _public_ int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret, sd_id12 return 0; } +_public_ int sd_journal_get_seqnum( + sd_journal *j, + uint64_t *ret_seqnum, + sd_id128_t *ret_seqnum_id) { + + JournalFile *f; + Object *o; + int r; + + assert_return(j, -EINVAL); + assert_return(!journal_pid_changed(j), -ECHILD); + + f = j->current_file; + if (!f) + return -EADDRNOTAVAIL; + + if (f->current_offset <= 0) + return -EADDRNOTAVAIL; + + r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o); + if (r < 0) + return r; + + if (ret_seqnum_id) + *ret_seqnum_id = f->header->seqnum_id; + if (ret_seqnum) + *ret_seqnum = le64toh(o->entry.seqnum); + + return 0; +} + static bool field_is_valid(const char *field) { assert(field); |