summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@gnugeneration.com>2016-08-25 08:37:57 -0700
committerLennart Poettering <lennart@poettering.net>2016-08-25 17:37:57 +0200
commit929eeb5498e8ae87e05ae683c6d3014d4b59056d (patch)
tree57a8594ebd639289555e079416988f4b8a1adf31
parent1ef72b55ba6d38f879d7ac9f0237cf8a2b53f0e6 (diff)
journal: implicitly flush to var on recovery (#4028)
When the system journal becomes re-opened post-flush with the runtime journal open, it implies we've recovered from something like an ENOSPC situation where the system journal rotate had failed, leaving the system journal closed, causing the runtime journal to be opened post-flush. For the duration of the unavailable system journal, we log to the runtime journal. But when the system journal gets opened (space made available, for example), we need to close the runtime journal before new journal writes will go to the system journal. Calling server_flush_to_var() after opening the system journal with a runtime journal present, post-flush, achieves this while preserving the runtime journal's contents in the system journal. The combination of the present flushed flag file and the runtime journal being open is a state where we should be logging to the system journal, so it's appropriate to resume doing so once we've successfully opened the system journal.
-rw-r--r--src/journal/journald-server.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index 2a043a95b1..ca47d64fe0 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -268,13 +268,14 @@ static int open_journal(
}
static int system_journal_open(Server *s, bool flush_requested) {
+ bool flushed = false;
const char *fn;
int r = 0;
if (!s->system_journal &&
(s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
(flush_requested
- || access("/run/systemd/journal/flushed", F_OK) >= 0)) {
+ || (flushed = (access("/run/systemd/journal/flushed", F_OK) >= 0)))) {
/* If in auto mode: first try to create the machine
* path, but not the prefix.
@@ -299,6 +300,16 @@ static int system_journal_open(Server *s, bool flush_requested) {
r = 0;
}
+
+ /* If the runtime journal is open, and we're post-flush, we're
+ * recovering from a failed system journal rotate (ENOSPC)
+ * for which the runtime journal was reopened.
+ *
+ * Perform an implicit flush to var, leaving the runtime
+ * journal closed, now that the system journal is back.
+ */
+ if (s->runtime_journal && flushed)
+ (void) server_flush_to_var(s);
}
if (!s->runtime_journal &&
@@ -1294,7 +1305,7 @@ static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo *
log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid);
- server_flush_to_var(s);
+ (void) server_flush_to_var(s);
server_sync(s);
server_vacuum(s, false, false);