From 260a2be45522f03ce8d8aca38e471d7b0882ff05 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 7 Oct 2011 22:00:05 +0200 Subject: [PATCH] journal: replace linked list by hashmap when merging files --- src/journal/journal-private.h | 12 +++++++- src/journal/journalctl.c | 4 +-- src/journal/journald.c | 4 +-- src/journal/sd-journal.c | 54 +++++++++++++++++++---------------- src/journal/test-journal.c | 2 +- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/journal/journal-private.h b/src/journal/journal-private.h index 863a3989..914b73a4 100644 --- a/src/journal/journal-private.h +++ b/src/journal/journal-private.h @@ -27,10 +27,20 @@ #include "sd-journal.h" #include "journal-def.h" #include "util.h" +#include "sd-id128.h" + +typedef struct JournalCoursor { + sd_id128_t file_id; + sd_id128_t boot_id; + uint64_t seqnum; + uint64_t monotonic; + uint64_t realtime; + uint64_t xor_hash; +} JournalCoursor; typedef struct JournalFile JournalFile; -int journal_file_open(sd_journal *j, const char *fname, int flags, mode_t mode, JournalFile **ret); +int journal_file_open(const char *fname, int flags, mode_t mode, JournalFile **ret); void journal_file_close(JournalFile *j); diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 838e8436..7bcd842f 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -33,9 +33,9 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); - r = journal_file_open(NULL, "/var/log/journal/system.journal", O_RDONLY, 0644, &f); + r = journal_file_open("/var/log/journal/system.journal", O_RDONLY, 0644, &f); if (r == -ENOENT) - r = journal_file_open(NULL, "/run/log/journal/system.journal", O_RDONLY, 0644, &f); + r = journal_file_open("/run/log/journal/system.journal", O_RDONLY, 0644, &f); if (r < 0) { log_error("Failed to open journal: %s", strerror(-r)); diff --git a/src/journal/journald.c b/src/journal/journald.c index 9297ca6f..818e146f 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -257,11 +257,11 @@ static int process_event(Server *s, struct epoll_event *ev) { static int open_system_journal(JournalFile **f) { int r; - r = journal_file_open(NULL, "/var/log/journal/system.journal", O_RDWR|O_CREAT, 0644, f); + r = journal_file_open("/var/log/journal/system.journal", O_RDWR|O_CREAT, 0644, f); if (r == -ENOENT) { mkdir_p("/run/log/journal", 0755); - r = journal_file_open(NULL, "/run/log/journal/system.journal", O_RDWR|O_CREAT, 0644, f); + r = journal_file_open("/run/log/journal/system.journal", O_RDWR|O_CREAT, 0644, f); } return r; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index d49f7179..8bca300f 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -32,6 +32,7 @@ #include "journal-private.h" #include "lookup3.h" #include "list.h" +#include "hashmap.h" #define DEFAULT_ARENA_MAX_SIZE (16ULL*1024ULL*1024ULL*1024ULL) #define DEFAULT_ARENA_MIN_SIZE (256ULL*1024ULL) @@ -43,8 +44,6 @@ #define DEFAULT_WINDOW_SIZE (128ULL*1024ULL*1024ULL) struct JournalFile { - sd_journal *journal; - int fd; char *path; struct stat last_stat; @@ -72,7 +71,7 @@ struct JournalFile { }; struct sd_journal { - LIST_HEAD(JournalFile, files); + Hashmap *files; }; static const char signature[] = { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' }; @@ -82,9 +81,6 @@ static const char signature[] = { 'L', 'P', 'K', 'S', 'H', 'H', 'R', 'H' }; void journal_file_close(JournalFile *f) { assert(f); - if (f->journal) - LIST_REMOVE(JournalFile, files, f->journal->files, f); - if (f->fd >= 0) close_nointr_nofail(f->fd); @@ -1146,7 +1142,6 @@ fail: } int journal_file_open( - sd_journal *j, const char *fname, int flags, mode_t mode, @@ -1242,11 +1237,6 @@ int journal_file_open( if (r < 0) goto fail; - if (j) { - LIST_PREPEND(JournalFile, files, j->files, f); - f->journal = j; - } - if (ret) *ret = f; @@ -1273,6 +1263,10 @@ int sd_journal_open(sd_journal **ret) { if (!j) return -ENOMEM; + j->files = hashmap_new(string_hash_func, string_compare_func); + if (!j->files) + goto fail; + NULSTR_FOREACH(p, search_paths) { DIR *d; @@ -1287,6 +1281,7 @@ int sd_journal_open(sd_journal **ret) { for (;;) { struct dirent buf, *de; int k; + JournalFile *f; k = readdir_r(d, &buf, &de); if (k != 0) { @@ -1309,19 +1304,24 @@ int sd_journal_open(sd_journal **ret) { goto fail; } - k = journal_file_open(j, fn, O_RDONLY, 0, NULL); - if (k < 0 && r == 0) - r = -k; - + k = journal_file_open(fn, O_RDONLY, 0, &f); free(fn); - } - } - if (!j->files) { - if (r >= 0) - r = -ENOENT; + if (k < 0) { - goto fail; + if (r == 0) + r = -k; + } else { + k = hashmap_put(j->files, f->path, f); + if (k < 0) { + journal_file_close(f); + closedir(d); + + r = k; + goto fail; + } + } + } } *ret = j; @@ -1336,8 +1336,14 @@ fail: void sd_journal_close(sd_journal *j) { assert(j); - while (j->files) - journal_file_close(j->files); + if (j->files) { + JournalFile *f; + + while ((f = hashmap_steal_first(j->files))) + journal_file_close(f); + + hashmap_free(j->files); + } free(j); } diff --git a/src/journal/test-journal.c b/src/journal/test-journal.c index 92bef5f3..e0aedc7b 100644 --- a/src/journal/test-journal.c +++ b/src/journal/test-journal.c @@ -33,7 +33,7 @@ int main(int argc, char *argv[]) { log_set_max_level(LOG_DEBUG); - assert_se(journal_file_open(NULL, "test", O_RDWR|O_CREAT, 0666, &f) == 0); + assert_se(journal_file_open("test", O_RDWR|O_CREAT, 0666, &f) == 0); dual_timestamp_get(&ts); -- 2.39.5