]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journal: introduce _SOURCE_BOOTTIME_TIMESTAMP field
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 18 Jun 2024 08:36:51 +0000 (17:36 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 18 Jun 2024 08:57:40 +0000 (17:57 +0900)
Then, fix the monotonic timestamp.

The _SOURCE_MONOTONIC_TIMESTAMP field is already used in other projects.
Hence, we cannot remove the field. But, let's store the correct value.
The existence of the new _SOURCE_BOOTTIME_TIMESTAMP field can indicate
that the monotonic timestamp field is reliable or not.

src/journal/journald-kmsg.c

index 78f6e1fef36d0184cdea2509ccefe4720efb2374..4123fda5f925422171c5ee620325256d7bec7128 100644 (file)
@@ -253,9 +253,17 @@ void dev_kmsg_record(Server *s, char *p, size_t l) {
                 }
         }
 
-        char source_time[STRLEN("_SOURCE_MONOTONIC_TIMESTAMP=") + DECIMAL_STR_MAX(unsigned long long)];
-        xsprintf(source_time, "_SOURCE_MONOTONIC_TIMESTAMP=%llu", usec);
-        iovec[n++] = IOVEC_MAKE_STRING(source_time);
+        char source_boot_time[STRLEN("_SOURCE_BOOTTIME_TIMESTAMP=") + DECIMAL_STR_MAX(unsigned long long)];
+        xsprintf(source_boot_time, "_SOURCE_BOOTTIME_TIMESTAMP=%llu", usec);
+        iovec[n++] = IOVEC_MAKE_STRING(source_boot_time);
+
+        /* Historically, we stored the timestamp 'usec' as _SOURCE_MONOTONIC_TIMESTAMP, so we cannot remove
+         * the field as it is already used in other projects. So, let's store the correct timestamp here by
+         * mapping the boottime to monotonic. Then, the existence of _SOURCE_BOOTTIME_TIMESTAMP indicates
+         * the reliability of _SOURCE_MONOTONIC_TIMESTAMP field. */
+        char source_monotonic_time[STRLEN("_SOURCE_MONOTONIC_TIMESTAMP=") + DECIMAL_STR_MAX(unsigned long long)];
+        xsprintf(source_monotonic_time, "_SOURCE_MONOTONIC_TIMESTAMP="USEC_FMT, map_clock_usec(usec, CLOCK_BOOTTIME, CLOCK_MONOTONIC));
+        iovec[n++] = IOVEC_MAKE_STRING(source_monotonic_time);
 
         iovec[n++] = IOVEC_MAKE_STRING("_TRANSPORT=kernel");