chiark / gitweb /
journald: cache hostname, boot_id and machine_id fields instead of generating them...
authorLennart Poettering <lennart@poettering.net>
Wed, 11 Dec 2013 21:55:57 +0000 (22:55 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 11 Dec 2013 21:55:57 +0000 (22:55 +0100)
src/journal/journald-server.c
src/journal/journald-server.h

index dd14493db590b40b0d0906e81bea122e3d0086d4..a4fa394bc70629ccac30c34db543f782e994ecf4 100644 (file)
@@ -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);
 
index 2c3e2c239dc13c5009a20bf869c8d3b4dd62607a..86c4be4ba260a960d281e42d6f40315e7a6f3e23 100644 (file)
@@ -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