chiark / gitweb /
journald: log when we fail to forward messages to syslog
authorLennart Poettering <lennart@poettering.net>
Mon, 17 Sep 2012 21:59:26 +0000 (23:59 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 17 Sep 2012 21:59:26 +0000 (23:59 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=847207

TODO
src/journal/journald-syslog.c
src/journal/journald-syslog.h
src/journal/journald.c
src/journal/journald.h
src/systemd/sd-messages.h

diff --git a/TODO b/TODO
index ec31f1d466e946a289e6a970e85856b8b5cc5a57..0a2ced4762d6111a2fc80441a62dfe6c87a8f66d 100644 (file)
--- 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
index 9db9198a49a082829e25e74ade9e1b6ecf579c0e..d3e0f6f6c11868e4dcf5a9bd8c88f4d063a170c0 100644 (file)
 #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;
+}
index 8845d28df2e95a1607400ead9213c0ea6e392c77..e009ab7e721b4570626826a3e3efa7a60c2aa4ff 100644 (file)
@@ -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);
index 871bbb636f981a8194d190f6cb230c3ef52457d7..74c80f5a085a8b0b765656cfcb8c0ce4ca525127 100644 (file)
@@ -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());
index c126d198b10ad036ac26a4b14b0260fcdd1e54c1..cd06b40c2fa97a79a5e7b2262e9f20413d81d8f1 100644 (file)
@@ -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;
 
index 91f928c00ba8d63470c4e1b4d06f38733d8b52f8..698aa60eb75519d00073bf4cd64eff38c7f70d51 100644 (file)
@@ -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