summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-12-11 22:55:57 +0100
committerLennart Poettering <lennart@poettering.net>2013-12-11 22:55:57 +0100
commit0c24bb2346b6b6232d67aacd5236b56ea4989de4 (patch)
treedf86ad10ed1ec355da17dae88bac7752eaf6de22 /src
parent91bf3b3e124575f6f647bff29766e9d992f55b32 (diff)
journald: cache hostname, boot_id and machine_id fields instead of generating them fresh for each log entry
Diffstat (limited to 'src')
-rw-r--r--src/journal/journald-server.c118
-rw-r--r--src/journal/journald-server.h6
2 files changed, 104 insertions, 20 deletions
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index dd14493db5..a4fa394bc7 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -395,6 +395,50 @@ void server_vacuum(Server *s) {
s->cached_available_space_timestamp = 0;
}
+static void server_cache_machine_id(Server *s) {
+ sd_id128_t id;
+ int r;
+
+ assert(s);
+
+ r = sd_id128_get_machine(&id);
+ if (r < 0)
+ return;
+
+ sd_id128_to_string(id, stpcpy(s->machine_id_field, "_MACHINE_ID="));
+}
+
+static void server_cache_boot_id(Server *s) {
+ sd_id128_t id;
+ int r;
+
+ assert(s);
+
+ r = sd_id128_get_boot(&id);
+ if (r < 0)
+ return;
+
+ sd_id128_to_string(id, stpcpy(s->boot_id_field, "_BOOT_ID="));
+}
+
+static void server_cache_hostname(Server *s) {
+ _cleanup_free_ char *t = NULL;
+ char *x;
+
+ assert(s);
+
+ t = gethostname_malloc();
+ if (!t)
+ return;
+
+ x = strappend("_HOSTNAME=", t);
+ if (!x)
+ return;
+
+ free(s->hostname_field);
+ s->hostname_field = x;
+}
+
bool shall_try_append_again(JournalFile *f, int r) {
/* -E2BIG Hit configured limit
@@ -499,15 +543,12 @@ static void dispatch_message_real(
gid[sizeof("_GID=") + DECIMAL_STR_MAX(gid_t)],
owner_uid[sizeof("_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)],
source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)],
- boot_id[sizeof("_BOOT_ID=") + 32] = "_BOOT_ID=",
- machine_id[sizeof("_MACHINE_ID=") + 32] = "_MACHINE_ID=",
o_uid[sizeof("OBJECT_UID=") + DECIMAL_STR_MAX(uid_t)],
o_gid[sizeof("OBJECT_GID=") + DECIMAL_STR_MAX(gid_t)],
o_owner_uid[sizeof("OBJECT_SYSTEMD_OWNER_UID=") + DECIMAL_STR_MAX(uid_t)];
uid_t object_uid;
gid_t object_gid;
char *x;
- sd_id128_t id;
int r;
char *t, *c;
uid_t realuid = 0, owner = 0, journal_uid;
@@ -744,24 +785,14 @@ static void dispatch_message_real(
/* Note that strictly speaking storing the boot id here is
* redundant since the entry includes this in-line
* anyway. However, we need this indexed, too. */
- r = sd_id128_get_boot(&id);
- if (r >= 0) {
- sd_id128_to_string(id, boot_id + strlen("_BOOT_ID="));
- IOVEC_SET_STRING(iovec[n++], boot_id);
- }
+ if (!isempty(s->boot_id_field))
+ IOVEC_SET_STRING(iovec[n++], s->boot_id_field);
- r = sd_id128_get_machine(&id);
- if (r >= 0) {
- sd_id128_to_string(id, machine_id + strlen("_MACHINE_ID="));
- IOVEC_SET_STRING(iovec[n++], machine_id);
- }
+ if (!isempty(s->machine_id_field))
+ IOVEC_SET_STRING(iovec[n++], s->machine_id_field);
- t = gethostname_malloc();
- if (t) {
- x = strappenda("_HOSTNAME=", t);
- free(t);
- IOVEC_SET_STRING(iovec[n++], x);
- }
+ if (!isempty(s->hostname_field))
+ IOVEC_SET_STRING(iovec[n++], s->hostname_field);
assert(n <= m);
@@ -1367,13 +1398,48 @@ int server_schedule_sync(Server *s, int priority) {
return 0;
}
+static int dispatch_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
+ Server *s = userdata;
+
+ assert(s);
+
+ server_cache_hostname(s);
+ return 0;
+}
+
+static int server_open_hostname(Server *s) {
+ int r;
+
+ assert(s);
+
+ s->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
+ if (s->hostname_fd < 0) {
+ log_error("Failed to open /proc/sys/kernel/hostname: %m");
+ return -errno;
+ }
+
+ r = sd_event_add_io(s->event, s->hostname_fd, 0, dispatch_hostname_change, s, &s->hostname_event_source);
+ if (r < 0) {
+ log_error("Failed to register hostname fd in event loop: %s", strerror(-r));
+ return r;
+ }
+
+ r = sd_event_source_set_priority(s->hostname_event_source, SD_EVENT_PRIORITY_IMPORTANT-10);
+ if (r < 0) {
+ log_error("Failed to adjust priority of host name event source: %s", strerror(-r));
+ return r;
+ }
+
+ return 0;
+}
+
int server_init(Server *s) {
int n, r, fd;
assert(s);
zero(*s);
- s->syslog_fd = s->native_fd = s->stdout_fd = s->dev_kmsg_fd = -1;
+ s->syslog_fd = s->native_fd = s->stdout_fd = s->dev_kmsg_fd = s->hostname_fd = -1;
s->compress = true;
s->seal = true;
@@ -1481,6 +1547,10 @@ int server_init(Server *s) {
if (r < 0)
return r;
+ r = server_open_hostname(s);
+ if (r < 0)
+ return r;
+
r = setup_signals(s);
if (r < 0)
return r;
@@ -1493,6 +1563,10 @@ int server_init(Server *s) {
if (!s->rate_limit)
return -ENOMEM;
+ server_cache_hostname(s);
+ server_cache_boot_id(s);
+ server_cache_machine_id(s);
+
r = system_journal_open(s);
if (r < 0)
return r;
@@ -1543,6 +1617,7 @@ void server_done(Server *s) {
sd_event_source_unref(s->sigusr2_event_source);
sd_event_source_unref(s->sigterm_event_source);
sd_event_source_unref(s->sigint_event_source);
+ sd_event_source_unref(s->hostname_event_source);
sd_event_unref(s->event);
if (s->syslog_fd >= 0)
@@ -1557,6 +1632,9 @@ void server_done(Server *s) {
if (s->dev_kmsg_fd >= 0)
close_nointr_nofail(s->dev_kmsg_fd);
+ if (s->hostname_fd >= 0)
+ close_nointr_nofail(s->hostname_fd);
+
if (s->rate_limit)
journal_rate_limit_free(s->rate_limit);
diff --git a/src/journal/journald-server.h b/src/journal/journald-server.h
index 2c3e2c239d..86c4be4ba2 100644
--- a/src/journal/journald-server.h
+++ b/src/journal/journald-server.h
@@ -59,6 +59,7 @@ typedef struct Server {
int native_fd;
int stdout_fd;
int dev_kmsg_fd;
+ int hostname_fd;
sd_event *event;
@@ -71,6 +72,7 @@ typedef struct Server {
sd_event_source *sigusr2_event_source;
sd_event_source *sigterm_event_source;
sd_event_source *sigint_event_source;
+ sd_event_source *hostname_event_source;
JournalFile *runtime_journal;
JournalFile *system_journal;
@@ -130,6 +132,10 @@ typedef struct Server {
struct udev *udev;
bool sync_scheduled;
+
+ char machine_id_field[sizeof("_MACHINE_ID=") + 32];
+ char boot_id_field[sizeof("_BOOT_ID=") + 32];
+ char *hostname_field;
} Server;
#define N_IOVEC_META_FIELDS 20