summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-07-11 02:41:16 +0200
committerLennart Poettering <lennart@poettering.net>2012-07-11 02:41:16 +0200
commitb8156be03f71c53072c7126bb418410acbef6c81 (patch)
tree04f650efd49798b9c4cadfd521952d5a91f3fb74
parent14a65d65a0c25ba4809b8d97f54ebf3e12eac84c (diff)
journal: replace implicit flushing of journal by explicit one
The old automatism that the flushing of the journal from /run to /var was triggered by the appearance of /var/log/journal is broken if that directory is mounted from another host and hence always available to be useful as mount point. To avoid probelsm with this, introduce a new unit that is explicitly orderer after all mounte files systems and triggers the flushing.
-rw-r--r--Makefile.am4
-rw-r--r--src/journal/journald.c23
-rw-r--r--units/.gitignore1
-rw-r--r--units/systemd-journal-flush.service.in18
-rw-r--r--units/systemd-journald.service.in1
5 files changed, 28 insertions, 19 deletions
diff --git a/Makefile.am b/Makefile.am
index 70b8b091e1..6b10f60577 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2331,7 +2331,8 @@ dist_systemunit_DATA += \
units/systemd-journald.socket
nodist_systemunit_DATA += \
- units/systemd-journald.service
+ units/systemd-journald.service \
+ units/systemd-journal-flush.service
dist_pkgsysconf_DATA += \
src/journal/journald.conf
@@ -2357,6 +2358,7 @@ EXTRA_DIST += \
src/journal/libsystemd-journal.pc.in \
src/journal/libsystemd-journal.sym \
units/systemd-journald.service.in \
+ units/systemd-journal-flush.service.in \
src/journal/journald-gperf.gperf
CLEANFILES += \
diff --git a/src/journal/journald.c b/src/journal/journald.c
index da9f52813d..2402f7f6d0 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -69,8 +69,6 @@
#define RECHECK_AVAILABLE_SPACE_USEC (30*USEC_PER_SEC)
-#define RECHECK_VAR_AVAILABLE_USEC (30*USEC_PER_SEC)
-
#define N_IOVEC_META_FIELDS 17
#define ENTRY_SIZE_MAX (1024*1024*32)
@@ -121,8 +119,6 @@ static const char* const storage_table[] = {
DEFINE_STRING_TABLE_LOOKUP(storage, Storage);
DEFINE_CONFIG_PARSE_ENUM(config_parse_storage, storage, Storage, "Failed to parse storage setting");
-static int server_flush_to_var(Server *s);
-
static uint64_t available_space(Server *s) {
char ids[33], *p;
const char *f;
@@ -630,8 +626,6 @@ static void dispatch_message_real(
assert(n <= m);
- server_flush_to_var(s);
-
retry:
f = find_journal(s, realuid == 0 ? 0 : loginuid);
if (f) {
@@ -1963,8 +1957,8 @@ static int system_journal_open(Server *s) {
sd_id128_to_string(machine, ids);
if (!s->system_journal &&
- (s->storage == STORAGE_PERSISTENT ||
- s->storage == STORAGE_AUTO)) {
+ (s->storage == STORAGE_PERSISTENT || s->storage == STORAGE_AUTO) &&
+ access("/run/systemd/journal/flushed", F_OK) >= 0) {
/* If in auto mode: first try to create the machine
* path, but not the prefix.
@@ -1972,7 +1966,7 @@ static int system_journal_open(Server *s) {
* If in persistent mode: create /var/log/journal and
* the machine path */
- if (s->storage & STORAGE_PERSISTENT)
+ if (s->storage == STORAGE_PERSISTENT)
(void) mkdir("/var/log/journal/", 0755);
fn = strappend("/var/log/journal/", ids);
@@ -1982,7 +1976,6 @@ static int system_journal_open(Server *s) {
(void) mkdir(fn, 0755);
free(fn);
- /* The create the system journal file */
fn = join("/var/log/journal/", ids, "/system.journal", NULL);
if (!fn)
return -ENOMEM;
@@ -2034,7 +2027,7 @@ static int system_journal_open(Server *s) {
/* OK, we really need the runtime journal, so create
* it if necessary. */
- (void) mkdir_parents_label(fn, 0755);
+ (void) mkdir_parents(fn, 0755);
r = journal_file_open_reliably(fn, O_RDWR|O_CREAT, 0640, NULL, &s->runtime_journal);
free(fn);
@@ -2062,7 +2055,6 @@ static int server_flush_to_var(Server *s) {
int r;
sd_id128_t machine;
sd_journal *j;
- usec_t ts;
assert(s);
@@ -2073,12 +2065,6 @@ static int server_flush_to_var(Server *s) {
if (!s->runtime_journal)
return 0;
- ts = now(CLOCK_MONOTONIC);
- if (s->var_available_timestamp + RECHECK_VAR_AVAILABLE_USEC > ts)
- return 0;
-
- s->var_available_timestamp = ts;
-
system_journal_open(s);
if (!s->system_journal)
@@ -2215,6 +2201,7 @@ static int process_event(Server *s, struct epoll_event *ev) {
}
if (sfsi.ssi_signo == SIGUSR1) {
+ touch("/run/systemd/journal/flushed");
server_flush_to_var(s);
return 1;
}
diff --git a/units/.gitignore b/units/.gitignore
index 544994da4d..de5117914d 100644
--- a/units/.gitignore
+++ b/units/.gitignore
@@ -1,3 +1,4 @@
+/systemd-journal-flush.service
/systemd-hibernate.service
/systemd-suspend.service
/console-getty.service
diff --git a/units/systemd-journal-flush.service.in b/units/systemd-journal-flush.service.in
new file mode 100644
index 0000000000..503e8a63b8
--- /dev/null
+++ b/units/systemd-journal-flush.service.in
@@ -0,0 +1,18 @@
+# This file is part of systemd.
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+
+[Unit]
+Description=Trigger Flushing of Journal to Persistent Storage
+Documentation=man:systemd-journald.service(8) man:journald.conf(5)
+DefaultDependencies=no
+Requires=systemd-journald.service
+After=systemd-journald.service local-fs.target remote-fs.target
+Before=systemd-user-sessions.service
+
+[Service]
+ExecStart=@rootbindir@/systemctl kill --kill-who=main --signal=SIGUSR1 systemd-journald.service
+Type=oneshot
diff --git a/units/systemd-journald.service.in b/units/systemd-journald.service.in
index 9552b454a3..3899745306 100644
--- a/units/systemd-journald.service.in
+++ b/units/systemd-journald.service.in
@@ -9,6 +9,7 @@
Description=Journal Service
Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
+Wants=systemd-journal-flush.service
Requires=systemd-journald.socket
After=systemd-journald.socket syslog.socket