[systemd-commits] 2 commits - TODO src/journal src/shared src/systemd

Lennart Poettering lennart at kemper.freedesktop.org
Mon Sep 17 15:00:52 PDT 2012


 TODO                          |    6 ++----
 src/journal/journald-syslog.c |   29 +++++++++++++++++++++++++++--
 src/journal/journald-syslog.h |    2 ++
 src/journal/journald.c        |    1 +
 src/journal/journald.h        |    3 +++
 src/shared/log.c              |   19 ++-----------------
 src/systemd/sd-messages.h     |    2 ++
 7 files changed, 39 insertions(+), 23 deletions(-)

New commits:
commit 178cc7700c23ac088cd7190d7854282075028d91
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Sep 17 23:59:26 2012 +0200

    journald: log when we fail to forward messages to syslog
    
    https://bugzilla.redhat.com/show_bug.cgi?id=847207

diff --git a/TODO b/TODO
index ec31f1d..0a2ced4 100644
--- a/TODO
+++ b/TODO
@@ -24,18 +24,16 @@ Bugfixes:
 
 F18:
 
-* journald: warn if we drop messages we forward to the syslog socket
-
 * refuse automount triggers when automount is queued for stop, much like we refuse socket triggers when sockets are queued for stop
 
-* There's something wrong with escaping unit names: http://lists.freedesktop.org/archives/systemd-devel/2012-August/006292.html
-
 * logind: different policy actions for idle, suspend, shutdown blockers: allow idle blockers by default, don't allow suspend blockers by default
 
 * selinux: merge systemd selinux access controls (dwalsh)
 
 Features:
 
+* instantiated target units
+
 * support *static* (/run) hibernate inhibitors. All rpm -i actions should completely prevent any
   sort of hibernate action until the next reboot. If the kernel or any other base tool is replaced
   by rpm, the resume path might fail, the for resume needed kernel might even be uninstalled, and
diff --git a/src/journal/journald-syslog.c b/src/journal/journald-syslog.c
index 9db9198..d3e0f6f 100644
--- a/src/journal/journald-syslog.c
+++ b/src/journal/journald-syslog.c
@@ -23,12 +23,16 @@
 #include <stddef.h>
 #include <sys/epoll.h>
 
+#include "systemd/sd-messages.h"
 #include "socket-util.h"
 #include "journald.h"
 #include "journald-syslog.h"
 #include "journald-kmsg.h"
 #include "journald-console.h"
 
+/* Warn once every 30s if we missed syslog message */
+#define WARN_FORWARD_SYSLOG_MISSED_USEC (30 * USEC_PER_SEC)
+
 static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned n_iovec, struct ucred *ucred, struct timeval *tv) {
         struct msghdr msghdr;
         struct cmsghdr *cmsg;
@@ -74,8 +78,10 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned
 
         /* The socket is full? I guess the syslog implementation is
          * too slow, and we shouldn't wait for that... */
-        if (errno == EAGAIN)
+        if (errno == EAGAIN) {
+                s->n_forward_syslog_missed++;
                 return;
+        }
 
         if (ucred && errno == ESRCH) {
                 struct ucred u;
@@ -91,8 +97,10 @@ static void forward_syslog_iovec(Server *s, const struct iovec *iovec, unsigned
                 if (sendmsg(s->syslog_fd, &msghdr, MSG_NOSIGNAL) >= 0)
                         return;
 
-                if (errno == EAGAIN)
+                if (errno == EAGAIN) {
+                        s->n_forward_syslog_missed++;
                         return;
+                }
         }
 
         if (errno != ENOENT)
@@ -464,3 +472,20 @@ int server_open_syslog_socket(Server *s) {
 
         return 0;
 }
+
+void server_maybe_warn_forward_syslog_missed(Server *s) {
+        usec_t n;
+        assert(s);
+
+        if (s->n_forward_syslog_missed <= 0)
+                return;
+
+        n = now(CLOCK_MONOTONIC);
+        if (s->last_warn_forward_syslog_missed + WARN_FORWARD_SYSLOG_MISSED_USEC > n)
+                return;
+
+        server_driver_message(s, SD_MESSAGE_FORWARD_SYSLOG_MISSED, "Forwarding to syslog missed %u messages.", s->n_forward_syslog_missed);
+
+        s->n_forward_syslog_missed = 0;
+        s->last_warn_forward_syslog_missed = n;
+}
diff --git a/src/journal/journald-syslog.h b/src/journal/journald-syslog.h
index 8845d28..e009ab7 100644
--- a/src/journal/journald-syslog.h
+++ b/src/journal/journald-syslog.h
@@ -32,3 +32,5 @@ void server_forward_syslog(Server *s, int priority, const char *identifier, cons
 
 void server_process_syslog_message(Server *s, const char *buf, struct ucred *ucred, struct timeval *tv, const char *label, size_t label_len);
 int server_open_syslog_socket(Server *s);
+
+void server_maybe_warn_forward_syslog_missed(Server *s);
diff --git a/src/journal/journald.c b/src/journal/journald.c
index 871bbb6..74c80f5 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -1553,6 +1553,7 @@ int main(int argc, char *argv[]) {
                 }
 
                 server_maybe_append_tags(&server);
+                server_maybe_warn_forward_syslog_missed(&server);
         }
 
         log_debug("systemd-journald stopped as pid %lu", (unsigned long) getpid());
diff --git a/src/journal/journald.h b/src/journal/journald.h
index c126d19..cd06b40 100644
--- a/src/journal/journald.h
+++ b/src/journal/journald.h
@@ -82,6 +82,9 @@ typedef struct Server {
         bool forward_to_syslog;
         bool forward_to_console;
 
+        unsigned n_forward_syslog_missed;
+        usec_t last_warn_forward_syslog_missed;
+
         uint64_t cached_available_space;
         usec_t cached_available_space_timestamp;
 
diff --git a/src/systemd/sd-messages.h b/src/systemd/sd-messages.h
index 91f928c..698aa60 100644
--- a/src/systemd/sd-messages.h
+++ b/src/systemd/sd-messages.h
@@ -58,6 +58,8 @@ extern "C" {
 #define SD_MESSAGE_UNIT_RELOADING   SD_ID128_MAKE(d3,4d,03,7f,ff,18,47,e6,ae,66,9a,37,0e,69,47,25)
 #define SD_MESSAGE_UNIT_RELOADED    SD_ID128_MAKE(7b,05,eb,c6,68,38,42,22,ba,a8,88,11,79,cf,da,54)
 
+#define SD_MESSAGE_FORWARD_SYSLOG_MISSED SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
+
 #ifdef __cplusplus
 }
 #endif

commit cd15c4182b2e39bac51afc1c839f9a9f64d1d78f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Sep 17 22:14:24 2012 +0200

    log: avoid function loop
    
    https://bugs.freedesktop.org/show_bug.cgi?id=54766

diff --git a/src/shared/log.c b/src/shared/log.c
index 9663464..7b0a914 100644
--- a/src/shared/log.c
+++ b/src/shared/log.c
@@ -73,14 +73,9 @@ static int log_open_console(void) {
                 return 0;
 
         if (getpid() == 1) {
-
                 console_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
-                if (console_fd < 0) {
-                        log_error("Failed to open /dev/console for logging: %s", strerror(-console_fd));
+                if (console_fd < 0)
                         return console_fd;
-                }
-
-                log_debug("Successfully opened /dev/console for logging.");
         } else
                 console_fd = STDERR_FILENO;
 
@@ -102,12 +97,8 @@ static int log_open_kmsg(void) {
                 return 0;
 
         kmsg_fd = open("/dev/kmsg", O_WRONLY|O_NOCTTY|O_CLOEXEC);
-        if (kmsg_fd < 0) {
-                log_error("Failed to open /dev/kmsg for logging: %s", strerror(errno));
+        if (kmsg_fd < 0)
                 return -errno;
-        }
-
-        log_debug("Successfully opened /dev/kmsg for logging.");
 
         return 0;
 }
@@ -174,13 +165,10 @@ static int log_open_syslog(void) {
         } else
                 syslog_is_stream = false;
 
-        log_debug("Successfully opened syslog for logging.");
-
         return 0;
 
 fail:
         log_close_syslog();
-        log_debug("Failed to open syslog for logging: %s", strerror(-r));
         return r;
 }
 
@@ -215,13 +203,10 @@ static int log_open_journal(void) {
                 goto fail;
         }
 
-        log_debug("Successfully opened journal for logging.");
-
         return 0;
 
 fail:
         log_close_journal();
-        log_debug("Failed to open journal for logging: %s", strerror(-r));
         return r;
 }
 



More information about the systemd-commits mailing list