summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/imuxsock/imuxsock.c13
-rw-r--r--tests/syslog_caller.c41
2 files changed, 44 insertions, 10 deletions
diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c
index b4ee8db0..24bcebb7 100644
--- a/plugins/imuxsock/imuxsock.c
+++ b/plugins/imuxsock/imuxsock.c
@@ -180,7 +180,7 @@ initRatelimitState(struct rs_ratelimit_state *rs, unsigned short interval, unsig
* be called concurrently.
*/
static inline int
-withinRatelimit(struct rs_ratelimit_state *rs, time_t tt)
+withinRatelimit(struct rs_ratelimit_state *rs, time_t tt, pid_t pid)
{
int ret;
uchar msgbuf[1024];
@@ -199,7 +199,8 @@ withinRatelimit(struct rs_ratelimit_state *rs, time_t tt)
if(tt > rs->begin + rs->interval) {
if(rs->missed) {
snprintf((char*)msgbuf, sizeof(msgbuf),
- "imuxsock lost %u messages due to rate-limiting", rs->missed);
+ "imuxsock lost %u messages from pid %lu due to rate-limiting",
+ rs->missed, (unsigned long) pid);
logmsgInternal(RS_RET_RATE_LIMITED, LOG_SYSLOG|LOG_INFO, msgbuf, 0);
rs->missed = 0;
}
@@ -212,6 +213,12 @@ withinRatelimit(struct rs_ratelimit_state *rs, time_t tt)
rs->done++;
ret = 1;
} else {
+ if(rs->missed == 0) {
+ snprintf((char*)msgbuf, sizeof(msgbuf),
+ "imuxsock begins to drop messages from pid %lu due to rate-limiting",
+ (unsigned long) pid);
+ logmsgInternal(RS_RET_RATE_LIMITED, LOG_SYSLOG|LOG_INFO, msgbuf, 0);
+ }
rs->missed++;
ret = 0;
}
@@ -533,7 +540,7 @@ SubmitMsg(uchar *pRcv, int lenRcv, lstn_t *pLstn, struct ucred *cred)
findRatelimiter(pLstn, cred, &ratelimiter); /* ignore error, better so than others... */
datetime.getCurrTime(&st, &tt);
- if(ratelimiter != NULL && !withinRatelimit(ratelimiter, tt)) {
+ if(ratelimiter != NULL && !withinRatelimit(ratelimiter, tt, cred->pid)) {
STATSCOUNTER_INC(ctrLostRatelimit, mutCtrLostRatelimit);
FINALIZE;
}
diff --git a/tests/syslog_caller.c b/tests/syslog_caller.c
index 60f24166..3f2702a6 100644
--- a/tests/syslog_caller.c
+++ b/tests/syslog_caller.c
@@ -5,6 +5,11 @@
* It is highly suggested NOT to "base" any derivative work
* on this tool ;)
*
+ * Options
+ *
+ * -s severity (0..7 accoding to syslog spec, r "rolling", default 6)
+ * -m number of messages to generate (default 500)
+ *
* Part of the testbench for rsyslog.
*
* Copyright 2010 Rainer Gerhards and Adiscon GmbH.
@@ -28,21 +33,43 @@
*/
#include <stdio.h>
#include <stdlib.h>
+#include <getopt.h>
#include <syslog.h>
+static void usage(void)
+{
+ fprintf(stderr, "usage: syslog_caller num-messages\n");
+ exit(1);
+}
+
+
int main(int argc, char *argv[])
{
int i;
- int sev = 0;
- if(argc != 2) {
- fprintf(stderr, "usage: syslog_caller num-messages\n");
- exit(1);
- }
+ int opt;
+ int bRollingSev = 0;
+ int sev = 6;
+ int msgs = 500;
- int msgs = atoi(argv[1]);
+ while((opt = getopt(argc, argv, "m:s:")) != -1) {
+ switch (opt) {
+ case 's': if(*optarg == 'r') {
+ bRollingSev = 1;
+ sev = 0;
+ } else
+ sev = atoi(optarg);
+ break;
+ case 'm': msgs = atoi(optarg);
+ break;
+ default: usage();
+ break;
+ }
+ }
for(i = 0 ; i < msgs ; ++i) {
syslog(sev % 8, "test message nbr %d, severity=%d", i, sev % 8);
- sev++;
+ if(bRollingSev)
+ sev++;
}
+ return(0);
}