summaryrefslogtreecommitdiff
path: root/src/journal
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-06 22:28:05 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-10 10:10:07 -0400
commit87011c25d96e9fbcd8a465ba758fa037c7d08203 (patch)
tree0b15d26d6152566d701b4bf3908ac7507dea45c9 /src/journal
parent8d98da3f1107529d5ba49aea1fa285f7264b7cba (diff)
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.
Diffstat (limited to 'src/journal')
-rw-r--r--src/journal/journal-file.h18
-rw-r--r--src/journal/sd-journal.c11
2 files changed, 16 insertions, 13 deletions
diff --git a/src/journal/journal-file.h b/src/journal/journal-file.h
index 7b1cd4285..5cc2c2d28 100644
--- a/src/journal/journal-file.h
+++ b/src/journal/journal-file.h
@@ -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,
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
index 3aa9ed4b3..4c4cc2d21 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -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;
}