journal: optimize iteration by skipping exhausted files

If from a previous iteration we know we are at the end of a journal
file, don't bother looking into the file again. This is complicated by
the fact that the EOF does not have to be permanent (think of
"journalctl -f"). So we also check if the number of entries in the
journal file changed.

This optimization has a similar effect as "journal: optimize iteration:
skip whole files behind current location" had.
This commit is contained in:
Michal Schmidt 2014-12-18 14:21:55 +01:00
parent 58439db4cc
commit 6e693b42dc
2 changed files with 8 additions and 1 deletions

View file

@ -78,6 +78,7 @@ typedef struct JournalFile {
direction_t last_direction;
LocationType location_type;
uint64_t last_n_entries;
char *path;
struct stat last_stat;

View file

@ -729,12 +729,18 @@ static int next_with_matches(
static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direction) {
Object *c;
uint64_t cp;
uint64_t cp, n_entries;
int r;
assert(j);
assert(f);
/* If we hit EOF before, recheck if any new entries arrived. */
n_entries = le64toh(f->header->n_entries);
if (f->location_type == LOCATION_TAIL && n_entries == f->last_n_entries)
return 0;
f->last_n_entries = n_entries;
if (f->last_direction == direction && f->current_offset > 0) {
cp = f->current_offset;