journal: remember last direction of search and keep offset cache

The fields in JournalFile are moved around to avoid wasting
7 bytes because of alignment.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2013-06-06 22:28:05 -04:00
parent 8d98da3f11
commit 87011c25d9
3 changed files with 16 additions and 16 deletions

3
TODO
View file

@ -77,9 +77,6 @@ Features:
* investigate endianess issues of UUID vs. GUID
* see if we can fix https://bugs.freedesktop.org/show_bug.cgi?id=63672
without dropping the location cache entirely.
* dbus: when a unit failed to load (i.e. is in UNIT_ERROR state), we
should be able to safely try another attempt when the bus call LoadUnit() is invoked.

View file

@ -42,10 +42,14 @@ typedef struct JournalMetrics {
uint64_t keep_free;
} JournalMetrics;
typedef enum direction {
DIRECTION_UP,
DIRECTION_DOWN
} direction_t;
typedef struct JournalFile {
int fd;
char *path;
struct stat last_stat;
mode_t mode;
int flags;
@ -56,6 +60,11 @@ typedef struct JournalFile {
bool tail_entry_monotonic_valid;
direction_t last_direction;
char *path;
struct stat last_stat;
Header *header;
HashItem *data_hash_table;
HashItem *field_hash_table;
@ -90,11 +99,6 @@ typedef struct JournalFile {
#endif
} JournalFile;
typedef enum direction {
DIRECTION_UP,
DIRECTION_DOWN
} direction_t;
int journal_file_open(
const char *fname,
int flags,

View file

@ -102,7 +102,8 @@ static void init_location(Location *l, LocationType type, JournalFile *f, Object
l->seqnum_set = l->realtime_set = l->monotonic_set = l->xor_hash_set = true;
}
static void set_location(sd_journal *j, LocationType type, JournalFile *f, Object *o, uint64_t offset) {
static void set_location(sd_journal *j, LocationType type, JournalFile *f, Object *o,
direction_t direction, uint64_t offset) {
assert(j);
assert(type == LOCATION_DISCRETE || type == LOCATION_SEEK);
assert(f);
@ -110,12 +111,10 @@ static void set_location(sd_journal *j, LocationType type, JournalFile *f, Objec
init_location(&j->current_location, type, f, o);
if (j->current_file)
j->current_file->current_offset = 0;
j->current_file = f;
j->current_field = 0;
f->last_direction = direction;
f->current_offset = offset;
}
@ -811,7 +810,7 @@ static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc
assert(j);
assert(f);
if (f->current_offset > 0) {
if (f->last_direction == direction && f->current_offset > 0) {
cp = f->current_offset;
r = journal_file_move_to_object(f, OBJECT_ENTRY, cp, &c);
@ -908,7 +907,7 @@ static int real_journal_next(sd_journal *j, direction_t direction) {
if (r < 0)
return r;
set_location(j, LOCATION_DISCRETE, new_file, o, new_offset);
set_location(j, LOCATION_DISCRETE, new_file, o, direction, new_offset);
return 1;
}