diff options
author | Marco Pfatschbacher <mpf@cvs.openbsd.org> | 2008-04-21 22:09:52 +0000 |
---|---|---|
committer | Marco Pfatschbacher <mpf@cvs.openbsd.org> | 2008-04-21 22:09:52 +0000 |
commit | a8d9228346d561fed911e3fb0a93fc8d2f10d94b (patch) | |
tree | d99b33e230a774fc70e7b6a4a22b1badd75f7d60 /usr.sbin | |
parent | 2eb896a3c2545b2c1f068c4a4ea865cba56418a4 (diff) |
If a |program is too slow to process the input,
drop messages rather than to kill and restart it.
Also log this error, but limited at a 2 minute rate.
Discussed with henning.
OK henning@
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/syslogd/syslogd.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index f827adbec7c..bab13ff2148 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: syslogd.c,v 1.100 2007/10/17 20:10:44 chl Exp $ */ +/* $OpenBSD: syslogd.c,v 1.101 2008/04/21 22:09:51 mpf Exp $ */ /* * Copyright (c) 1983, 1988, 1993, 1994 @@ -39,7 +39,7 @@ static const char copyright[] = #if 0 static const char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94"; #else -static const char rcsid[] = "$OpenBSD: syslogd.c,v 1.100 2007/10/17 20:10:44 chl Exp $"; +static const char rcsid[] = "$OpenBSD: syslogd.c,v 1.101 2008/04/21 22:09:51 mpf Exp $"; #endif #endif /* not lint */ @@ -161,6 +161,7 @@ struct filed { int f_prevcount; /* repetition cnt of prevline */ unsigned int f_repeatcount; /* number of "repeated" msgs */ int f_quick; /* abort when matched */ + time_t f_lasterrtime; /* last error was reported */ }; /* @@ -944,9 +945,20 @@ fprintlog(struct filed *f, int flags, char *msg) again: if (writev(f->f_file, iov, 6) < 0) { int e = errno; + + /* pipe is non-blocking. log and drop message if full */ + if (e == EAGAIN && f->f_type == F_PIPE) { + if (now - f->f_lasterrtime > 120) { + f->f_lasterrtime = now; + logerror(f->f_un.f_fname); + } + break; + } + (void)close(f->f_file); /* - * Check for errors on TTY's due to loss of tty + * Check for errors on TTY's or program pipes. + * Errors happen due to loss of tty or died programs. */ if (e == EAGAIN) { /* |