]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logs-show: use _SOURCE_MONOTONIC_TIMESTAMP when _SOURCE_BOOTTIME_TIMESTAMP field... 33386/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 18 Jun 2024 09:00:33 +0000 (18:00 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 18 Jun 2024 09:01:21 +0000 (18:01 +0900)
With the previous commit, now the _SOURCE_MONOTONIC_TIMESTAMP field is
usable but only when _SOURCE_BOOTTIME_TIMESTAMP exists.

src/shared/logs-show.c

index 7dcc77e11407aef77d87baf3166296552fd2c2cc..34f9411fcf587215e83fa514df8d42f5403fa09c 100644 (file)
@@ -443,6 +443,7 @@ static void parse_display_realtime(
                 sd_journal *j,
                 const char *source_realtime,
                 const char *source_monotonic,
+                const char *source_boottime,
                 usec_t *ret) {
 
         usec_t t, s, u;
@@ -450,8 +451,10 @@ static void parse_display_realtime(
         assert(j);
         assert(ret);
 
-        // FIXME: _SOURCE_MONOTONIC_TIMESTAMP is in CLOCK_BOOTTIME, hence we cannot use it for adjusting realtime.
-        source_monotonic = NULL;
+        if (!source_boottime)
+                /* _SOURCE_MONOTONIC_TIMESTAMP field is usable only when _SOURCE_BOOTTIME_TIMESTAMP exists,
+                 * as previously the timestamp was in CLOCK_BOOTTIME. */
+                source_monotonic = NULL;
 
         /* First, try _SOURCE_REALTIME_TIMESTAMP. */
         if (source_realtime && safe_atou64(source_realtime, &t) >= 0 && VALID_REALTIME(t)) {
@@ -480,6 +483,7 @@ static void parse_display_timestamp(
                 sd_journal *j,
                 const char *source_realtime,
                 const char *source_monotonic,
+                const char *source_boottime,
                 dual_timestamp *ret_display_ts,
                 sd_id128_t *ret_boot_id) {
 
@@ -491,8 +495,10 @@ static void parse_display_timestamp(
         assert(ret_display_ts);
         assert(ret_boot_id);
 
-        // FIXME: _SOURCE_MONOTONIC_TIMESTAMP is in CLOCK_BOOTTIME, hence we cannot use it for adjusting realtime.
-        source_monotonic = NULL;
+        if (!source_boottime)
+                /* _SOURCE_MONOTONIC_TIMESTAMP field is usable only when _SOURCE_BOOTTIME_TIMESTAMP exists,
+                 * as previously the timestamp was in CLOCK_BOOTTIME. */
+                source_monotonic = NULL;
 
         if (source_realtime && safe_atou64(source_realtime, &t) >= 0 && VALID_REALTIME(t))
                 source_ts.realtime = t;
@@ -533,7 +539,7 @@ static int output_short(
         _cleanup_free_ char *hostname = NULL, *identifier = NULL, *comm = NULL, *pid = NULL, *fake_pid = NULL,
                 *message = NULL, *priority = NULL, *transport = NULL,
                 *config_file = NULL, *unit = NULL, *user_unit = NULL, *documentation_url = NULL,
-                *realtime = NULL, *monotonic = NULL;
+                *realtime = NULL, *monotonic = NULL, *boottime = NULL;
         size_t hostname_len = 0, identifier_len = 0, comm_len = 0, pid_len = 0, fake_pid_len = 0, message_len = 0,
                 priority_len = 0, transport_len = 0, config_file_len = 0,
                 unit_len = 0, user_unit_len = 0, documentation_url_len = 0;
@@ -556,6 +562,7 @@ static int output_short(
                 PARSE_FIELD_VEC_ENTRY("DOCUMENTATION=",               &documentation_url, &documentation_url_len),
                 PARSE_FIELD_VEC_ENTRY("_SOURCE_REALTIME_TIMESTAMP=",  &realtime,          NULL                  ),
                 PARSE_FIELD_VEC_ENTRY("_SOURCE_MONOTONIC_TIMESTAMP=", &monotonic,         NULL                  ),
+                PARSE_FIELD_VEC_ENTRY("_SOURCE_BOOTTIME_TIMESTAMP=",  &boottime,          NULL                  ),
         };
         size_t highlight_shifted[] = {highlight ? highlight[0] : 0, highlight ? highlight[1] : 0};
 
@@ -602,11 +609,11 @@ static int output_short(
         audit = streq_ptr(transport, "audit");
 
         if (IN_SET(mode, OUTPUT_SHORT_MONOTONIC, OUTPUT_SHORT_DELTA)) {
-                parse_display_timestamp(j, realtime, monotonic, &display_ts, &boot_id);
+                parse_display_timestamp(j, realtime, monotonic, boottime, &display_ts, &boot_id);
                 r = output_timestamp_monotonic(f, mode, &display_ts, &boot_id, previous_display_ts, previous_boot_id);
         } else {
                 usec_t usec;
-                parse_display_realtime(j, realtime, monotonic, &usec);
+                parse_display_realtime(j, realtime, monotonic, boottime, &usec);
                 r = output_timestamp_realtime(f, j, mode, flags, usec);
         }
         if (r < 0)
@@ -739,11 +746,12 @@ static int output_short(
 
 static int get_display_realtime(sd_journal *j, usec_t *ret) {
         const void *data;
-        _cleanup_free_ char *realtime = NULL, *monotonic = NULL;
+        _cleanup_free_ char *realtime = NULL, *monotonic = NULL, *boottime = NULL;
         size_t length;
         const ParseFieldVec message_fields[] = {
                 PARSE_FIELD_VEC_ENTRY("_SOURCE_REALTIME_TIMESTAMP=",  &realtime,  NULL),
                 PARSE_FIELD_VEC_ENTRY("_SOURCE_MONOTONIC_TIMESTAMP=", &monotonic, NULL),
+                PARSE_FIELD_VEC_ENTRY("_SOURCE_BOOTTIME_TIMESTAMP=",  &boottime,  NULL),
         };
         int r;
 
@@ -755,13 +763,13 @@ static int get_display_realtime(sd_journal *j, usec_t *ret) {
                 if (r < 0)
                         return r;
 
-                if (realtime && monotonic)
+                if (realtime && monotonic && boottime)
                         break;
         }
         if (r < 0)
                 return r;
 
-        (void) parse_display_realtime(j, realtime, monotonic, ret);
+        (void) parse_display_realtime(j, realtime, monotonic, boottime, ret);
 
         /* Restart all data before */
         sd_journal_restart_data(j);