[systemd-devel] [PATCH v2] journalctl: Improve boot ID lookup

Jan Janssen medhefgo at web.de
Wed Apr 8 07:14:14 PDT 2015



On 2015-04-08 14:39, Lennart Poettering wrote:
> On Thu, 02.04.15 17:08, Jan Janssen (medhefgo at web.de) wrote:
>
>> This method should greatly improve offset based lookup. We now don't have
>> to aggregate the full boot listing just so we can jump to a specific position,
>> 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
>> we now need to do 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.
>>
>> https://bugs.freedesktop.org/show_bug.cgi?id=72601
>> ---
>> Hi,
>>
>> today I realized that it would be nice if we could do without the cursor seeking.
>> Turns out we can! I could swear that I tested sd_journal_flush_matches() would
>> reset our position in the journal. But it seems that sd_journal_next/previous
>> will advance just fine from the last position we were in, even after a flush.
>>
>> Though, I would still like someone with better journal internals knowledge confirm
>> that this is how it's supposed to work.
>>
>> Some testing/timing from others than me would be nice too.
>
> Hmm, the patch is hard to read, can you explain what precisely the new
> algorithm is you propose?
>
> Lennart
>

Yeah, patches like these always do end up looking messy. It's much 
easier to read after applying it.

Well, it jumps from one boot to the next boot using _BOOT_ID matches. It 
starts at the journal head to get the boot ID, makes a _BOOT_ID match 
and then comes from the opposite journal direction (tail) to get the end 
a boot. And then flushes the matches, and advances the journal from that 
exact position one further (which gives us the start and ID of our next 
boot). Rinse and repeat.
Note, v1 differs in that it assumes sd_journal_flush_matches() will also 
reset the position we are in the journal at that moment. That version 
went around that by using a cursor and seeking to the after flushing. 
Hence why I wonder if this behavior of slush_matches is expected/desired 
or not.

This is much faster for relative boot ID lookups, for the very reason 
that you don't have to look at all boots. Though, it does make the 
assumption that all boots (IDs) are assumed to not interleave 
(constellations like "A B A C" cannot happen), which afaik would be 
satisfied on single host machines.

Later after sending this patch I realized that it could probably break 
on journals with more than one machine ID, since then boot IDs can 
interleave due to them running in parallel, breaking a important 
assumption. Though, I *should* be able to fix that by adding some 
_MACHINE_ID matches in the mix.

Adding machine ID matches would make --list-boots behavior differ quite 
a lot. For one, with this approach, there isn't any global ordering of 
boots across machine IDs. Personally, I find this ordering (although you 
can define it as *a* valid ordering) to be useless. Doing a "journalctl 
-b boodID-1" match, for example, should use that bootID's machine ID to 
get to the previous boot (of that machine). Right now it can get you any 
bootID from any other machine, so long as it was booted right before it.

So yeah, I will make this patch work for journals with more than one 
machine ID if this approach is desired.

Jan


More information about the systemd-devel mailing list