5d6eedd
From 53ae6296386a754ed74a1d3fbd88f39ab7a89f0d Mon Sep 17 00:00:00 2001
03e93e2
From: Lennart Poettering <lennart@poettering.net>
03e93e2
Date: Mon, 12 Dec 2016 20:54:45 +0100
03e93e2
Subject: [PATCH] journald: don't flush to /var/log/journal before we get asked
03e93e2
 to
03e93e2
03e93e2
This changes journald to not write to /var/log/journal until it received
03e93e2
SIGUSR1 for the first time, thus having been requested to flush the runtime
03e93e2
journal to disk.
03e93e2
03e93e2
This makes the journal work nicer with systems which have the root file system
03e93e2
writable early, but still need to rearrange /var before journald should start
03e93e2
writing and creating files to it, for example because ACLs need to be applied
03e93e2
first, or because /var is to be mounted from another file system, NFS or tmpfs
03e93e2
(as is the case for systemd.volatile=state).
03e93e2
03e93e2
Before this change we required setupts with /var split out to mount the root
03e93e2
disk read-only early on, and ship an /etc/fstab that remounted it writable only
03e93e2
after having placed /var at the right place. But even that was racy for various
03e93e2
preparations as journald might end up accessing the file system before it was
03e93e2
entirely set up, as soon as it was writable.
03e93e2
03e93e2
With this change we make scheduling when to start writing to /var/log/journal
03e93e2
explicit. This means persistent mode now requires
03e93e2
systemd-journal-flush.service in the mix to work, as otherwise journald would
03e93e2
never write to the directory.
03e93e2
03e93e2
See: #1397
03e93e2
(cherry picked from commit f78273c8dacf678cc8fd7387f678e6344a99405c)
03e93e2
---
03e93e2
 src/journal/journald-server.c | 21 +++++++++++----------
03e93e2
 src/journal/journald-server.h |  2 +-
03e93e2
 src/journal/journald.c        |  2 +-
03e93e2
 3 files changed, 13 insertions(+), 12 deletions(-)
03e93e2
03e93e2
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
03e93e2
index 1d2fce8dc7..ced0ad6f21 100644
03e93e2
--- a/src/journal/journald-server.c
03e93e2
+++ b/src/journal/journald-server.c
03e93e2
@@ -283,17 +283,16 @@ static int open_journal(
03e93e2
 }
03e93e2
 
03e93e2
 static bool flushed_flag_is_set(void) {
03e93e2
-        return (access("/run/systemd/journal/flushed", F_OK) >= 0);
03e93e2
+        return access("/run/systemd/journal/flushed", F_OK) >= 0;
03e93e2
 }
03e93e2
 
03e93e2
 static int system_journal_open(Server *s, bool flush_requested) {
03e93e2
-        bool flushed = false;
03e93e2
         const char *fn;
03e93e2
         int r = 0;
03e93e2
 
03e93e2
         if (!s->system_journal &&
03e93e2
-            (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
03e93e2
-            (flush_requested || (flushed = flushed_flag_is_set()))) {
03e93e2
+            IN_SET(s->storage, STORAGE_PERSISTENT, STORAGE_AUTO) &&
03e93e2
+            (flush_requested || flushed_flag_is_set())) {
03e93e2
 
03e93e2
                 /* If in auto mode: first try to create the machine
03e93e2
                  * path, but not the prefix.
03e93e2
@@ -326,8 +325,8 @@ static int system_journal_open(Server *s, bool flush_requested) {
03e93e2
                  * Perform an implicit flush to var, leaving the runtime
03e93e2
                  * journal closed, now that the system journal is back.
03e93e2
                  */
03e93e2
-                if (s->runtime_journal && flushed)
03e93e2
-                        (void) server_flush_to_var(s);
03e93e2
+                if (!flush_requested)
03e93e2
+                        (void) server_flush_to_var(s, true);
03e93e2
         }
03e93e2
 
03e93e2
         if (!s->runtime_journal &&
03e93e2
@@ -1183,7 +1182,7 @@ finish:
03e93e2
         dispatch_message_real(s, iovec, n, m, ucred, tv, label, label_len, unit_id, priority, object_pid);
03e93e2
 }
03e93e2
 
03e93e2
-int server_flush_to_var(Server *s) {
03e93e2
+int server_flush_to_var(Server *s, bool require_flag_file) {
03e93e2
         sd_id128_t machine;
03e93e2
         sd_journal *j = NULL;
03e93e2
         char ts[FORMAT_TIMESPAN_MAX];
03e93e2
@@ -1193,13 +1192,15 @@ int server_flush_to_var(Server *s) {
03e93e2
 
03e93e2
         assert(s);
03e93e2
 
03e93e2
-        if (s->storage != STORAGE_AUTO &&
03e93e2
-            s->storage != STORAGE_PERSISTENT)
03e93e2
+        if (!IN_SET(s->storage, STORAGE_AUTO, STORAGE_PERSISTENT))
03e93e2
                 return 0;
03e93e2
 
03e93e2
         if (!s->runtime_journal)
03e93e2
                 return 0;
03e93e2
 
03e93e2
+        if (require_flag_file && !flushed_flag_is_set())
03e93e2
+                return 0;
03e93e2
+
03e93e2
         (void) system_journal_open(s, true);
03e93e2
 
03e93e2
         if (!s->system_journal)
03e93e2
@@ -1411,7 +1412,7 @@ static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *
03e93e2
 
03e93e2
         log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid);
03e93e2
 
03e93e2
-        (void) server_flush_to_var(s);
03e93e2
+        (void) server_flush_to_var(s, false);
03e93e2
         server_sync(s);
03e93e2
         server_vacuum(s, false);
03e93e2
 
03e93e2
diff --git a/src/journal/journald-server.h b/src/journal/journald-server.h
03e93e2
index 99d91496be..de1c48f805 100644
03e93e2
--- a/src/journal/journald-server.h
03e93e2
+++ b/src/journal/journald-server.h
03e93e2
@@ -197,7 +197,7 @@ void server_sync(Server *s);
03e93e2
 int server_vacuum(Server *s, bool verbose);
03e93e2
 void server_rotate(Server *s);
03e93e2
 int server_schedule_sync(Server *s, int priority);
03e93e2
-int server_flush_to_var(Server *s);
03e93e2
+int server_flush_to_var(Server *s, bool require_flag_file);
03e93e2
 void server_maybe_append_tags(Server *s);
03e93e2
 int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata);
03e93e2
 void server_space_usage_message(Server *s, JournalStorage *storage);
03e93e2
diff --git a/src/journal/journald.c b/src/journal/journald.c
03e93e2
index 7f47ca22dd..9ac21457f6 100644
03e93e2
--- a/src/journal/journald.c
03e93e2
+++ b/src/journal/journald.c
03e93e2
@@ -52,7 +52,7 @@ int main(int argc, char *argv[]) {
03e93e2
                 goto finish;
03e93e2
 
03e93e2
         server_vacuum(&server, false);
03e93e2
-        server_flush_to_var(&server);
03e93e2
+        server_flush_to_var(&server, true);
03e93e2
         server_flush_dev_kmsg(&server);
03e93e2
 
03e93e2
         log_debug("systemd-journald running as pid "PID_FMT, getpid());