X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald-server.c;h=96ef66db5fa95b1b14c08b9a6f938e98632259bb;hb=28def94cc8fd4394b20e2155d7130166662343c4;hp=a3bacdab66a68ec930d6903f9ec0166872d79664;hpb=0371ca0dac1d70b2e5060a3c4e6fbbc2bdbd8671;p=elogind.git diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index a3bacdab6..96ef66db5 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -158,9 +158,18 @@ static uint64_t available_space(Server *s, bool verbose) { } ss_avail = ss.f_bsize * ss.f_bavail; - avail = ss_avail > m->keep_free ? ss_avail - m->keep_free : 0; - s->cached_available_space = MIN(m->max_use, avail) > sum ? MIN(m->max_use, avail) - sum : 0; + /* If we reached a high mark, we will always allow this much + * again, unless usage goes above max_use. This watermark + * value is cached so that we don't give up space on pressure, + * but hover below the maximum usage. */ + + if (m->use < sum) + m->use = sum; + + avail = LESS_BY(ss_avail, m->keep_free); + + s->cached_available_space = LESS_BY(MIN(m->max_use, avail), sum); s->cached_available_space_timestamp = ts; if (verbose) { @@ -168,13 +177,14 @@ static uint64_t available_space(Server *s, bool verbose) { fb4[FORMAT_BYTES_MAX], fb5[FORMAT_BYTES_MAX]; server_driver_message(s, SD_MESSAGE_JOURNAL_USAGE, - "%s journal is using %s (max %s, leaving %s of free %s, current limit %s).", + "%s journal is using %s (max allowed %s, " + "trying to leave %s free of %s available → current limit %s).", s->system_journal ? "Permanent" : "Runtime", format_bytes(fb1, sizeof(fb1), sum), format_bytes(fb2, sizeof(fb2), m->max_use), format_bytes(fb3, sizeof(fb3), m->keep_free), format_bytes(fb4, sizeof(fb4), ss_avail), - format_bytes(fb5, sizeof(fb5), MIN(m->max_use, avail))); + format_bytes(fb5, sizeof(fb5), s->cached_available_space + sum)); } return s->cached_available_space; @@ -379,7 +389,7 @@ void server_vacuum(Server *s) { if (s->system_journal) { char *p = strappenda("/var/log/journal/", ids); - r = journal_directory_vacuum(p, s->system_metrics.max_use, s->system_metrics.keep_free, s->max_retention_usec, &s->oldest_file_usec); + r = journal_directory_vacuum(p, s->system_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec); if (r < 0 && r != -ENOENT) log_error("Failed to vacuum %s: %s", p, strerror(-r)); } @@ -387,7 +397,7 @@ void server_vacuum(Server *s) { if (s->runtime_journal) { char *p = strappenda("/run/log/journal/", ids); - r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->runtime_metrics.keep_free, s->max_retention_usec, &s->oldest_file_usec); + r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec); if (r < 0 && r != -ENOENT) log_error("Failed to vacuum %s: %s", p, strerror(-r)); } @@ -1241,7 +1251,7 @@ static int dispatch_sigterm(sd_event_source *es, const struct signalfd_siginfo * assert(s); - log_info("Received SIG%s", signal_to_string(si->ssi_signo)); + log_received_signal(LOG_INFO, si); sd_event_exit(s->event, 0); return 0; @@ -1257,19 +1267,19 @@ static int setup_signals(Server *s) { sigset_add_many(&mask, SIGINT, SIGTERM, SIGUSR1, SIGUSR2, -1); assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0); - r = sd_event_add_signal(s->event, SIGUSR1, dispatch_sigusr1, s, &s->sigusr1_event_source); + r = sd_event_add_signal(s->event, &s->sigusr1_event_source, SIGUSR1, dispatch_sigusr1, s); if (r < 0) return r; - r = sd_event_add_signal(s->event, SIGUSR2, dispatch_sigusr2, s, &s->sigusr2_event_source); + r = sd_event_add_signal(s->event, &s->sigusr2_event_source, SIGUSR2, dispatch_sigusr2, s); if (r < 0) return r; - r = sd_event_add_signal(s->event, SIGTERM, dispatch_sigterm, s, &s->sigterm_event_source); + r = sd_event_add_signal(s->event, &s->sigterm_event_source, SIGTERM, dispatch_sigterm, s); if (r < 0) return r; - r = sd_event_add_signal(s->event, SIGINT, dispatch_sigterm, s, &s->sigint_event_source); + r = sd_event_add_signal(s->event, &s->sigint_event_source, SIGINT, dispatch_sigterm, s); if (r < 0) return r; @@ -1377,7 +1387,7 @@ int server_schedule_sync(Server *s, int priority) { when += s->sync_interval_usec; if (!s->sync_event_source) { - r = sd_event_add_monotonic(s->event, when, 0, server_dispatch_sync, s, &s->sync_event_source); + r = sd_event_add_monotonic(s->event, &s->sync_event_source, when, 0, server_dispatch_sync, s); if (r < 0) return r; @@ -1418,8 +1428,18 @@ static int server_open_hostname(Server *s) { return -errno; } - r = sd_event_add_io(s->event, s->hostname_fd, 0, dispatch_hostname_change, s, &s->hostname_event_source); + r = sd_event_add_io(s->event, &s->hostname_event_source, s->hostname_fd, 0, dispatch_hostname_change, s); if (r < 0) { + /* kernels prior to 3.2 don't support polling this file. Ignore + * the failure. */ + if (r == -EPERM) { + log_warning("Failed to register hostname fd in event loop: %s. Ignoring.", + strerror(-r)); + close_nointr_nofail(s->hostname_fd); + s->hostname_fd = -1; + return 0; + } + log_error("Failed to register hostname fd in event loop: %s", strerror(-r)); return r; }