ratelim.h (1762B)
1 /* Copyright (c) 2003-2004, Roger Dingledine 2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. 3 * Copyright (c) 2007-2021, The Tor Project, Inc. */ 4 /* See LICENSE for licensing information */ 5 6 /** 7 * \file ratelim.h 8 * \brief Summarize similar messages that would otherwise flood the logs. 9 **/ 10 11 #ifndef TOR_RATELIM_H 12 #define TOR_RATELIM_H 13 14 #include <time.h> 15 16 /* Rate-limiter */ 17 18 /** A ratelim_t remembers how often an event is occurring, and how often 19 * it's allowed to occur. Typical usage is something like: 20 * 21 <pre> 22 if (possibly_very_frequent_event()) { 23 const int INTERVAL = 300; 24 static ratelim_t warning_limit = RATELIM_INIT(INTERVAL); 25 char *m; 26 if ((m = rate_limit_log(&warning_limit, approx_time()))) { 27 log_warn(LD_GENERAL, "The event occurred!%s", m); 28 tor_free(m); 29 } 30 } 31 </pre> 32 33 As a convenience wrapper for logging, you can replace the above with: 34 <pre> 35 if (possibly_very_frequent_event()) { 36 static ratelim_t warning_limit = RATELIM_INIT(300); 37 log_fn_ratelim(&warning_limit, LOG_WARN, LD_GENERAL, 38 "The event occurred!"); 39 } 40 </pre> 41 */ 42 typedef struct ratelim_t { 43 /** How many seconds must elapse between log messages? */ 44 int rate; 45 /** When did this limiter last allow a message to appear? */ 46 time_t last_allowed; 47 /** When did this limiter start suppressing messages? */ 48 time_t started_limiting; 49 /** How many messages has this limiter suppressed since it last allowed 50 * one to appear? */ 51 int n_calls_since_last_time; 52 } ratelim_t; 53 54 #ifndef COCCI 55 #define RATELIM_INIT(r) { (r), 0, 0, 0 } 56 #endif 57 #define RATELIM_TOOMANY (16*1000*1000) 58 59 char *rate_limit_log(ratelim_t *lim, time_t now); 60 61 #endif /* !defined(TOR_RATELIM_H) */