summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-10-14 16:52:42 +0200
committerLennart Poettering <lennart@poettering.net>2011-10-14 16:52:42 +0200
commit1cc101f1e59ca2f5e87dea48ac9ed98c6f077b3b (patch)
tree020edb95bcb09db0f8249cfc5ef05cbae46e7189
parent7210bfb3706f8cbb2b35403f916dace1824c516c (diff)
journal: if two entries match with everything but seqnums, they are still identical
-rw-r--r--src/journal/sd-journal.c34
-rw-r--r--src/journal/sd-journal.h12
2 files changed, 36 insertions, 10 deletions
diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c
index 74abac88af..d580b8e768 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -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);
}
diff --git a/src/journal/sd-journal.h b/src/journal/sd-journal.h
index 13b5f891d7..6b451b5765 100644
--- a/src/journal/sd-journal.h
+++ b/src/journal/sd-journal.h
@@ -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)