journal: replace linked list by hashmap when merging files

This commit is contained in:
Lennart Poettering
2011-10-07 22:02:06 +02:00
parent dad503169b
commit 260a2be455
5 changed files with 47 additions and 31 deletions
+11 -1
View File
@@ -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);
+2 -2
View File
@@ -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));
+2 -2
View File
@@ -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;
+31 -25
View File
@@ -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,21 +1304,26 @@ 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 (k < 0) {
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;
}
}
}
}
if (!j->files) {
if (r >= 0)
r = -ENOENT;
goto fail;
}
*ret = j;
return 0;
@@ -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);
}
+1 -1
View File
@@ -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);