diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2013-06-17 13:34:17 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2013-06-17 13:34:17 +0200 |
commit | 4357348b96e801bad73e83bc7891cd4d08b18b24 (patch) | |
tree | 0ae64f857f5248cc354d901acf866d92e7f2e15e /runtime | |
parent | 9ac7e207705a585bb4d11f4058ff7f640158c8d3 (diff) | |
download | rsyslog-4357348b96e801bad73e83bc7891cd4d08b18b24.tar.gz rsyslog-4357348b96e801bad73e83bc7891cd4d08b18b24.tar.bz2 rsyslog-4357348b96e801bad73e83bc7891cd4d08b18b24.zip |
implement new ratelimiting mode for imjournal
and make imjournal use it.
The new mode is needed, as imjournal uses journal's timestamp
as message generation time (which otherwise is when the message
entered the system, and the ratelimiter uses this as current
timestamp in order to save performance).
It is debatable if imjournal is doing the right thing here. But
it doesn't feel totally wrong. So let's safe that debate for
later ;)
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/ratelimit.c | 16 | ||||
-rw-r--r-- | runtime/ratelimit.h | 2 |
2 files changed, 17 insertions, 1 deletions
diff --git a/runtime/ratelimit.c b/runtime/ratelimit.c index 6e1df3e2..f5c75c53 100644 --- a/runtime/ratelimit.c +++ b/runtime/ratelimit.c @@ -150,6 +150,15 @@ withinRatelimit(ratelimit_t *ratelimit, time_t tt) goto finalize_it; } + /* we primarily need "NoTimeCache" mode for imjournal, as it + * sets the message generation time to the journal timestamp. + * As such, we do not get a proper indication of the actual + * message rate. To prevent this, we need to query local + * system time ourselvs. + */ + if(ratelimit->bNoTimeCache) + tt = time(NULL); + assert(ratelimit->burst != 0); if(ratelimit->begin == 0) @@ -318,6 +327,12 @@ ratelimitSetThreadSafe(ratelimit_t *ratelimit) ratelimit->bThreadSafe = 1; pthread_mutex_init(&ratelimit->mut, NULL); } +void +ratelimitSetNoTimeCache(ratelimit_t *ratelimit) +{ + ratelimit->bNoTimeCache = 1; + pthread_mutex_init(&ratelimit->mut, NULL); +} /* Severity level determines which messages are subject to * ratelimiting. Default (no value set) is all messages. @@ -368,4 +383,3 @@ ratelimitModInit(void) finalize_it: RETiRet; } - diff --git a/runtime/ratelimit.h b/runtime/ratelimit.h index a058b069..563777fd 100644 --- a/runtime/ratelimit.h +++ b/runtime/ratelimit.h @@ -35,6 +35,7 @@ struct ratelimit_s { unsigned nsupp; /**< nbr of msgs suppressed */ msg_t *pMsg; sbool bThreadSafe; /**< do we need to operate in Thread-Safe mode? */ + sbool bNoTimeCache; /**< if we shall not used cached reception time */ pthread_mutex_t mut; /**< mutex if thread-safe operation desired */ }; @@ -42,6 +43,7 @@ struct ratelimit_s { rsRetVal ratelimitNew(ratelimit_t **ppThis, char *modname, char *dynname); void ratelimitSetThreadSafe(ratelimit_t *ratelimit); void ratelimitSetLinuxLike(ratelimit_t *ratelimit, unsigned short interval, unsigned short burst); +void ratelimitSetNoTimeCache(ratelimit_t *ratelimit); void ratelimitSetSeverity(ratelimit_t *ratelimit, intTiny severity); rsRetVal ratelimitMsg(ratelimit_t *ratelimit, msg_t *pMsg, msg_t **ppRep); rsRetVal ratelimitAddMsg(ratelimit_t *ratelimit, multi_submit_t *pMultiSub, msg_t *pMsg); |