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.
This commit is contained in:
msizanoen
2023-08-30 20:17:18 +07:00
parent 2f766aca1e
commit addcecf6f4
2 changed files with 15 additions and 18 deletions
+6 -6
View File
@@ -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 */
+9 -12
View File
@@ -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) {