journal: if two entries match with everything but seqnums, they are still identical

This commit is contained in:
Lennart Poettering
2011-10-14 16:52:42 +02:00
parent 7210bfb370
commit 1cc101f1e5
2 changed files with 36 additions and 10 deletions
+25 -9
View File
@@ -48,28 +48,29 @@ struct sd_journal {
LIST_HEAD(Match, matches);
};
int sd_journal_add_match(sd_journal *j, const char *field, const void *data, size_t size) {
int sd_journal_add_match(sd_journal *j, const void *data, size_t size) {
Match *m;
char *e;
assert(j);
assert(field);
assert(data || size == 0);
if (size <= 0)
return -EINVAL;
assert(data);
m = new0(Match, 1);
if (!m)
return -ENOMEM;
m->size = strlen(field) + 1 + size;
m->size = size;
m->data = malloc(m->size);
if (!m->data) {
free(m);
return -ENOMEM;
}
e = stpcpy(m->data, field);
*(e++) = '=';
memcpy(e, data, size);
memcpy(m->data, data, size);
LIST_PREPEND(Match, matches, j->matches, m);
return 0;
@@ -93,7 +94,16 @@ static int compare_order(JournalFile *af, Object *ao, uint64_t ap,
uint64_t a, b;
/* We operate on two different files here, hence we can access
* two objects at the same time, which we normally can't */
* two objects at the same time, which we normally can't.
*
* If contents and timestamps match, these entries are
* identical, even if the seqnum does not match */
if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id) &&
ao->entry.monotonic == bo->entry.monotonic &&
ao->entry.realtime == bo->entry.realtime &&
ao->entry.xor_hash == bo->entry.xor_hash)
return 0;
if (sd_id128_equal(af->header->seqnum_id, bf->header->seqnum_id)) {
@@ -106,6 +116,10 @@ static int compare_order(JournalFile *af, Object *ao, uint64_t ap,
return -1;
if (a > b)
return 1;
/* Wow! This is weird, different data but the same
* seqnums? Something is borked, but let's make the
* best of it and compare by time. */
}
if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id)) {
@@ -474,6 +488,8 @@ void sd_journal_close(sd_journal *j) {
hashmap_free(j->files);
}
sd_journal_flush_matches(j);
free(j);
}
+11 -1
View File
@@ -35,6 +35,8 @@
* - implement stdout gateway
* - extend hash table/bisect table as we go
* - accelerate looking for "all hostnames" and suchlike.
* - throttling
* - enforce limit on open journal files in journald and journalctl
*/
typedef struct sd_journal sd_journal;
@@ -50,7 +52,7 @@ int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret);
int sd_journal_get_field(sd_journal *j, const char *field, const void **data, size_t *l);
int sd_journal_iterate_fields(sd_journal *j, const void **data, size_t *l);
int sd_journal_add_match(sd_journal *j, const char *field, const void *data, size_t size);
int sd_journal_add_match(sd_journal *j, const void *data, size_t size);
void sd_journal_flush_matches(sd_journal *j);
int sd_journal_seek_head(sd_journal *j);
@@ -64,6 +66,14 @@ int sd_journal_set_cursor(sd_journal *j, const char *cursor);
int sd_journal_get_fd(sd_journal *j);
enum {
SD_JOURNAL_NOP,
SD_JOURNAL_APPEND,
SD_JOURNAL_DROP
};
int sd_journal_process(sd_journal *j);
#define SD_JOURNAL_FOREACH(j) \
while (sd_journal_next(j) > 0)