From a6db5931947acb807b37cac9c832d68cd66fbc2a Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 1 May 2015 15:15:16 +0200 Subject: [PATCH] journalctl: Improve boot ID lookup This method should greatly improve offset based lookup, by simply jumping from one boot to the next boot. It starts at the journal head to get the a boot ID, makes a _BOOT_ID match and then comes from the opposite journal direction (tail) to get to the end that boot. After flushing the matches and advancing the journal from that exact position, we arrive at the start of next boot. Rinse and repeat. This is faster than the old method of aggregating the full boot listing just so we can jump to a specific boot, which can be a real pain on big journals just for a mere "-b -1" case. As an additional benefit --list-boots should improve slightly too, because it does less seeking. Note that there can be a change in boot order with this lookup method because it will use the order of boots in the journal, not the realtime stamp stored in them. That's arguably better, though. Another deficiency is that it will get confused with boots interleaving in the journal, therefore, it will refuse operation in --merge, --file and --directory mode. https://bugs.freedesktop.org/show_bug.cgi?id=72601 Conflicts: src/journal/journalctl.c Cherry-picked from: 596a23293d28f93843aef86721b90043e74d3081 Related: #1318994 --- src/journal/journalctl.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index f60e641..c7a19f2 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1166,11 +1166,10 @@ static int add_boot(sd_journal *j) { const char *reason = (r == 0) ? "No such boot ID in journal" : strerror(-r); if (sd_id128_is_null(arg_boot_id)) - log_error("Data from the specified boot (%+i) is not available: %s", - arg_boot_offset, reason); + log_error("Failed to look up boot %+i: %s", arg_boot_offset, reason); else - log_error("Data from the specified boot ("SD_ID128_FORMAT_STR") is not available: %s", - SD_ID128_FORMAT_VAL(arg_boot_id), reason); + log_error("Failed to look up boot ID "SD_ID128_FORMAT_STR"%+i: %s", + SD_ID128_FORMAT_VAL(arg_boot_id), arg_boot_offset, reason); return r == 0 ? -ENODATA : r; }