From 2f766aca1e1398288e01b26a69eb02a7b831ab00 Mon Sep 17 00:00:00 2001 From: msizanoen Date: Wed, 30 Aug 2023 20:11:42 +0700 Subject: [PATCH 1/2] journal: Don't write to journal files without the new boot ID update behavior guarantee With the old boot ID update behavior there's no way to compare the boot ID of a new entry to be written with the boot ID of the last entry in the journal in a performant manner, and therefore no way to determine if monotonic clock value consistency checking is needed. Refuse to open journal files without the new boot ID update behavior guarantee to simplify consistency checking. --- src/libsystemd/sd-journal/journal-file.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 06ffa137d4..1d118583c8 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -572,6 +572,10 @@ static int journal_file_verify_header(JournalFile *f) { if (journal_file_writable(f) && header_size != sizeof(Header)) return -EPROTONOSUPPORT; + /* Don't write to journal files without the new boot ID update behavior guarantee. */ + if (journal_file_writable(f) && !JOURNAL_HEADER_TAIL_ENTRY_BOOT_ID(f->header)) + return -EPROTONOSUPPORT; + if (JOURNAL_HEADER_SEALED(f->header) && !JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays)) return -EBADMSG; From addcecf6f4686811b63d48d51398d887c2c4bb68 Mon Sep 17 00:00:00 2001 From: msizanoen Date: Wed, 30 Aug 2023 18:53:29 +0700 Subject: [PATCH 2/2] journal: Relax boot ID and monotonic clock consistency checks The monotonic clock value consistency should only be checked if the boot ID is the same as the last journal entry, and requiring that the current boot ID be the same as the boot ID of the last entry is not necessary for ensuring deterministic bisection as we already enforce strict ordering of the real time clock value in a single journal file. This fixes an issue where a new journal file is unnecessarily created every boot, potentially wasting storage space. --- src/journal/journald-server.c | 12 ++++++------ src/libsystemd/sd-journal/journal-file.c | 21 +++++++++------------ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 2932a190ff..897e2abd3a 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -871,12 +871,12 @@ static bool shall_try_append_again(JournalFile *f, int r) { log_ratelimit_info_errno(r, JOURNAL_LOG_RATELIMIT, "%s: Realtime clock jumped backwards relative to last journal entry, rotating.", f->path); return true; - case -EREMOTE: /* Boot ID different from the one of the last entry */ - log_ratelimit_info_errno(r, JOURNAL_LOG_RATELIMIT, "%s: Boot ID changed since last record, rotating.", f->path); - return true; - - case -ENOTNAM: /* Monotonic time (CLOCK_MONOTONIC) jumped backwards relative to last journal entry */ - log_ratelimit_info_errno(r, JOURNAL_LOG_RATELIMIT, "%s: Monotonic clock jumped backwards relative to last journal entry, rotating.", f->path); + case -ENOTNAM: /* Monotonic time (CLOCK_MONOTONIC) jumped backwards relative to last journal entry with the same boot ID */ + log_ratelimit_info_errno( + r, + JOURNAL_LOG_RATELIMIT, + "%s: Monotonic clock jumped backwards relative to last journal entry with the same boot ID, rotating.", + f->path); return true; case -EILSEQ: /* seqnum ID last used in the file doesn't match the one we'd passed when writing an entry to it */ diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index 1d118583c8..95cf25bff0 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -2287,18 +2287,15 @@ static int journal_file_append_entry_internal( "timestamp %" PRIu64 ", refusing entry.", ts->realtime, le64toh(f->header->tail_entry_realtime)); - if (!sd_id128_is_null(f->header->tail_entry_boot_id) && boot_id) { - - if (!sd_id128_equal(f->header->tail_entry_boot_id, *boot_id)) - return log_debug_errno(SYNTHETIC_ERRNO(EREMOTE), - "Boot ID to write is different from previous boot id, refusing entry."); - - if (ts->monotonic < le64toh(f->header->tail_entry_monotonic)) - return log_debug_errno(SYNTHETIC_ERRNO(ENOTNAM), - "Monotonic timestamp %" PRIu64 " smaller than previous monotonic " - "timestamp %" PRIu64 ", refusing entry.", - ts->monotonic, le64toh(f->header->tail_entry_monotonic)); - } + if ((!boot_id || sd_id128_equal(*boot_id, f->header->tail_entry_boot_id)) && + ts->monotonic < le64toh(f->header->tail_entry_monotonic)) + return log_debug_errno( + SYNTHETIC_ERRNO(ENOTNAM), + "Monotonic timestamp %" PRIu64 + " smaller than previous monotonic timestamp %" PRIu64 + " while having the same boot ID, refusing entry.", + ts->monotonic, + le64toh(f->header->tail_entry_monotonic)); } if (seqnum_id) {