summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/journal/journald-server.c4
-rw-r--r--src/journal/managed-journal-file.c3
-rw-r--r--src/journal/test-journal-flush.c3
-rw-r--r--src/libsystemd/sd-journal/journal-file.c6
4 files changed, 14 insertions, 2 deletions
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index 9e2d239abd..b59f42c4b8 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -839,6 +839,10 @@ static bool shall_try_append_again(JournalFile *f, int r) {
log_ratelimit_warning(JOURNAL_LOG_RATELIMIT, "%s: Journal file is from the future, rotating.", f->path);
return true;
+ case -EREMCHG: /* Time jumped backwards relative to last journal entry */
+ log_ratelimit_warning(JOURNAL_LOG_RATELIMIT, "%s: Time jumped backwards relative to last journal entry, rotating.", f->path);
+ return true;
+
case -EAFNOSUPPORT:
log_ratelimit_warning(JOURNAL_LOG_RATELIMIT,
"%s: underlying file system does not support memory mapping or another required file system feature.",
diff --git a/src/journal/managed-journal-file.c b/src/journal/managed-journal-file.c
index 810167772a..6e313f2a05 100644
--- a/src/journal/managed-journal-file.c
+++ b/src/journal/managed-journal-file.c
@@ -524,7 +524,8 @@ int managed_journal_file_open_reliably(
-ESHUTDOWN, /* Already archived */
-EIO, /* IO error, including SIGBUS on mmap */
-EIDRM, /* File has been deleted */
- -ETXTBSY)) /* File is from the future */
+ -ETXTBSY, /* File is from the future */
+ -EREMCHG)) /* Clock rolled back */
return r;
if ((open_flags & O_ACCMODE) == O_RDONLY)
diff --git a/src/journal/test-journal-flush.c b/src/journal/test-journal-flush.c
index c734aa02ca..b78e073ddd 100644
--- a/src/journal/test-journal-flush.c
+++ b/src/journal/test-journal-flush.c
@@ -58,7 +58,8 @@ static void test_journal_flush(int argc, char *argv[]) {
assert_se(r >= 0 ||
IN_SET(r, -EBADMSG, /* corrupted file */
-EPROTONOSUPPORT, /* unsupported compression */
- -EIO)); /* file rotated */
+ -EIO, /* file rotated */
+ -EREMCHG)); /* clock rollback */
if (++n >= 10000)
break;
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c
index ab518fea80..805773474c 100644
--- a/src/libsystemd/sd-journal/journal-file.c
+++ b/src/libsystemd/sd-journal/journal-file.c
@@ -2092,6 +2092,12 @@ static int journal_file_append_entry_internal(
assert(ts);
assert(items || n_items == 0);
+ if (ts->realtime < le64toh(f->header->tail_entry_realtime))
+ return log_debug_errno(SYNTHETIC_ERRNO(EREMCHG),
+ "Realtime timestamp %" PRIu64 " smaller than previous realtime "
+ "timestamp %" PRIu64 ", refusing entry.",
+ ts->realtime, le64toh(f->header->tail_entry_realtime));
+
osize = offsetof(Object, entry.items) + (n_items * journal_file_entry_item_size(f));
r = journal_file_append_object(f, OBJECT_ENTRY, osize, &o, &np);