From: Daniel Stodden Date: Mon, 23 May 2011 02:23:45 +0000 (-0700) Subject: MAR-125: Support log rate limiting. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=9d97de049a6b25f6c2ef3e390b382f173f4772f8;p=people%2Fdstodden%2Fblktap.git MAR-125: Support log rate limiting. Much like Linux's ratelimit. Allow for message bursts of some size, count messages as they pass. Drop messages once the burst size was exceeded within a given interval. Next interval resets the count. Signed-off-by: Daniel Stodden --- diff --git a/drivers/Makefile b/drivers/Makefile index 8eae6d1..036732d 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -46,6 +46,7 @@ TAP-OBJS += tapdisk-disktype.o TAP-OBJS += tapdisk-syslog.o TAP-OBJS += tapdisk-stats.o TAP-OBJS += tapdisk-storage.o +TAP-OBJS += tapdisk-loglimit.o TAP-OBJS += io-optimize.o TAP-OBJS += lock.o diff --git a/drivers/tapdisk-loglimit.c b/drivers/tapdisk-loglimit.c new file mode 100644 index 0000000..0752a46 --- /dev/null +++ b/drivers/tapdisk-loglimit.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2011, XenSource Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of XenSource Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Simple log rate limiting. Allow for bursts, then drop messages + * until some interval expired. + */ + +#include "tapdisk-loglimit.h" +#include "compiler.h" +#include "list.h" + +void +tapdisk_loglimit_init(td_loglimit_t *rl, int burst, int interval) +{ + rl->burst = burst; + rl->interval = interval; + + rl->count = 0; + rl->dropped = 0; + + gettimeofday(&rl->ts, NULL); +} + +static void +timeradd_ms(struct timeval *tv, long ms) +{ + tv->tv_usec += ms * 1000; + if (tv->tv_usec > 1000000) { + tv->tv_sec += tv->tv_usec / 1000000; + tv->tv_usec %= 1000000; + } +} + +static void +tapdisk_loglimit_update(td_loglimit_t *rl, struct timeval *now) +{ + struct timeval next = rl->ts; + int expired; + + timeradd_ms(&next, rl->interval); + + if (timercmp(&next, now, <)) { + rl->count = 0; + rl->ts = *now; + } +} + +static void +tapdisk_loglimit_update_now(td_loglimit_t *rl) +{ + struct timeval now; + + gettimeofday(&now, NULL); + + tapdisk_loglimit_update(rl, &now); +} + +int +tapdisk_loglimit_pass(td_loglimit_t *rl) +{ + if (!rl->interval) + return 1; /* unlimited */ + + if (unlikely(rl->count >= rl->burst)) { + + tapdisk_loglimit_update_now(rl); + + if (rl->count >= rl->burst) { + rl->dropped++; + return 0; + } + } + + rl->count++; + return 1; +} diff --git a/drivers/tapdisk-loglimit.h b/drivers/tapdisk-loglimit.h new file mode 100644 index 0000000..6d756c5 --- /dev/null +++ b/drivers/tapdisk-loglimit.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2011, XenSource Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of XenSource Inc. nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TAPDISK_LOGLIMIT_H__ +#define __TAPDISK_LOGLIMIT_H__ + +#include +#include "list.h" + +typedef struct td_loglimit td_loglimit_t; + +struct td_loglimit { + int burst; + int interval; + + int count; + int dropped; + + struct timeval ts; +}; + +void tapdisk_loglimit_init(td_loglimit_t *rl, int burst, int interval); + +int tapdisk_loglimit_pass(td_loglimit_t *); + +#endif /* __TAPDISK_LOGLIMIT_H__ */