From: Lennart Poettering Date: Fri, 5 Apr 2019 16:20:25 +0000 (+0200) Subject: journald: add API to move logging from /var to /run again X-Git-Tag: v243-rc1~461^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b4e26d1d8e582d78e67ed766177f10e8e194404c;p=thirdparty%2Fsystemd.git journald: add API to move logging from /var to /run again We now have this nice little Varlink API, let's beef it up a bit. --- diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 8ee7d78bae0..51e7dedad59 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -286,13 +286,14 @@ static bool flushed_flag_is_set(void) { return access("/run/systemd/journal/flushed", F_OK) >= 0; } -static int system_journal_open(Server *s, bool flush_requested) { +static int system_journal_open(Server *s, bool flush_requested, bool relinquish_requested) { const char *fn; int r = 0; if (!s->system_journal && IN_SET(s->storage, STORAGE_PERSISTENT, STORAGE_AUTO) && - (flush_requested || flushed_flag_is_set())) { + (flush_requested || flushed_flag_is_set()) && + !relinquish_requested) { /* If in auto mode: first try to create the machine * path, but not the prefix. @@ -334,7 +335,7 @@ static int system_journal_open(Server *s, bool flush_requested) { fn = strjoina(s->runtime_storage.path, "/system.journal"); - if (s->system_journal) { + if (s->system_journal && !relinquish_requested) { /* Try to open the runtime journal, but only * if it already exists, so that we can flush @@ -389,7 +390,7 @@ static JournalFile* find_journal(Server *s, uid_t uid) { * else that's left the journals as NULL). * * Fixes https://github.com/systemd/systemd/issues/3968 */ - (void) system_journal_open(s, false); + (void) system_journal_open(s, false, false); /* We split up user logs only on /var, not on /run. If the * runtime file is open, we write to it exclusively, in order @@ -1117,7 +1118,7 @@ int server_flush_to_var(Server *s, bool require_flag_file) { char ts[FORMAT_TIMESPAN_MAX]; usec_t start; unsigned n = 0; - int r; + int r, k; assert(s); @@ -1130,7 +1131,7 @@ int server_flush_to_var(Server *s, bool require_flag_file) { if (require_flag_file && !flushed_flag_is_set()) return 0; - (void) system_journal_open(s, true); + (void) system_journal_open(s, true, false); if (!s->system_journal) return 0; @@ -1209,9 +1210,36 @@ finish: n), NULL); + k = touch("/run/systemd/journal/flushed"); + if (k < 0) + log_warning_errno(k, "Failed to touch /run/systemd/journal/flushed, ignoring: %m"); + return r; } +static int server_relinquish_var(Server *s) { + assert(s); + + if (s->storage == STORAGE_NONE) + return 0; + + if (s->runtime_journal && !s->system_journal) + return 0; + + log_debug("Relinquishing /var..."); + + (void) system_journal_open(s, false, true); + + s->system_journal = journal_file_close(s->system_journal); + ordered_hashmap_clear_with_destructor(s->user_journals, journal_file_close); + set_clear_with_destructor(s->deferred_closes, journal_file_close); + + if (unlink("/run/systemd/journal/flushed") < 0 && errno != ENOENT) + log_warning_errno(errno, "Failed to unlink /run/systemd/journal/flushed, ignoring: %m"); + + return 0; +} + int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void *userdata) { Server *s = userdata; struct ucred *ucred = NULL; @@ -1331,18 +1359,12 @@ int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void } static void server_full_flush(Server *s) { - int r; - assert(s); (void) server_flush_to_var(s, false); server_sync(s); server_vacuum(s, false); - r = touch("/run/systemd/journal/flushed"); - if (r < 0) - log_warning_errno(r, "Failed to touch /run/systemd/journal/flushed, ignoring: %m"); - server_space_usage_message(s, NULL); } @@ -1351,7 +1373,7 @@ static int dispatch_sigusr1(sd_event_source *es, const struct signalfd_siginfo * assert(s); - log_info("Received request to flush runtime journal from PID " PID_FMT, si->ssi_pid); + log_info("Received SIGUSR1 signal from PID " PID_FMT ", as request to flush runtime journal.", si->ssi_pid); server_full_flush(s); return 0; @@ -1381,7 +1403,7 @@ static int dispatch_sigusr2(sd_event_source *es, const struct signalfd_siginfo * assert(s); - log_info("Received request to rotate journal from PID " PID_FMT, si->ssi_pid); + log_info("Received SIGUSR2 signal from PID " PID_FMT ", as request to rotate journal.", si->ssi_pid); server_full_rotate(s); return 0; @@ -1418,7 +1440,7 @@ static int dispatch_sigrtmin1(sd_event_source *es, const struct signalfd_siginfo assert(s); - log_debug("Received request to sync from PID " PID_FMT, si->ssi_pid); + log_debug("Received SIGRTMIN1 signal from PID " PID_FMT ", as request to sync.", si->ssi_pid ); server_full_sync(s); return 0; @@ -1924,6 +1946,21 @@ static int vl_method_flush_to_var(Varlink *link, JsonVariant *parameters, Varlin return varlink_reply(link, NULL); } +static int vl_method_relinquish_var(Varlink *link, JsonVariant *parameters, VarlinkMethodFlags flags, void *userdata) { + Server *s = userdata; + + assert(link); + assert(s); + + if (json_variant_elements(parameters) > 0) + return varlink_error_invalid_parameter(link, parameters); + + log_info("Received client request to relinquish /var access."); + server_relinquish_var(s); + + return varlink_reply(link, NULL); +} + static int server_open_varlink(Server *s) { int r; @@ -1937,9 +1974,10 @@ static int server_open_varlink(Server *s) { r = varlink_server_bind_method_many( s->varlink_server, - "io.systemd.Journal.Synchronize", vl_method_synchronize, - "io.systemd.Journal.Rotate", vl_method_rotate, - "io.systemd.Journal.FlushToVar", vl_method_flush_to_var); + "io.systemd.Journal.Synchronize", vl_method_synchronize, + "io.systemd.Journal.Rotate", vl_method_rotate, + "io.systemd.Journal.FlushToVar", vl_method_flush_to_var, + "io.systemd.Journal.RelinquishVar", vl_method_relinquish_var); if (r < 0) return r; @@ -2161,7 +2199,7 @@ int server_init(Server *s) { (void) client_context_acquire_default(s); - return system_journal_open(s, false); + return system_journal_open(s, false, false); } void server_maybe_append_tags(Server *s) {