diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-05-03 12:44:00 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-05-03 12:44:00 -0400 |
commit | b0e5757710c476a1a79dfc8a706f566ce515c495 (patch) | |
tree | be0f44c34cab0804ca7ae8eda682967fa2626451 /src/or | |
parent | 5e0316142f14df890e34180dba087cd0264fba70 (diff) | |
download | tor-b0e5757710c476a1a79dfc8a706f566ce515c495.tar.gz tor-b0e5757710c476a1a79dfc8a706f566ce515c495.zip |
Refactor to remove n_libevent_errors
We cleared this value in second_elapsed_callback. But what were we
using it for? For detecting if Libevent returned EINVAL too often!
We already have a way to detect too-frequent events, and that's with
a ratelim_t. Refactor the code to use that instead. Closes ticket
26016.
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/main.c | 32 |
1 files changed, 10 insertions, 22 deletions
diff --git a/src/or/main.c b/src/or/main.c index 8cdf27ed4b..8491019067 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -2493,8 +2493,6 @@ hs_service_callback(time_t now, const or_options_t *options) /** Timer: used to invoke second_elapsed_callback() once per second. */ static periodic_timer_t *second_timer = NULL; -/** Number of libevent errors in the last second: we die if we get too many. */ -static int n_libevent_errors = 0; /** Last time that second_elapsed_callback was called. */ static time_t current_second = 0; @@ -2512,8 +2510,6 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg) (void)timer; (void)arg; - n_libevent_errors = 0; - /* log_notice(LD_GENERAL, "Tick."); */ now = time(NULL); update_approx_time(now); @@ -2558,21 +2554,6 @@ systemd_watchdog_callback(periodic_timer_t *timer, void *arg) } #endif /* defined(HAVE_SYSTEMD_209) */ -#ifndef _WIN32 -/** Called when a possibly ignorable libevent error occurs; ensures that we - * don't get into an infinite loop by ignoring too many errors from - * libevent. */ -static int -got_libevent_error(void) -{ - if (++n_libevent_errors > 8) { - log_err(LD_NET, "Too many libevent errors in one second; dying"); - return -1; - } - return 0; -} -#endif /* !defined(_WIN32) */ - #define UPTIME_CUTOFF_FOR_NEW_BANDWIDTH_TEST (6*60*60) /** Called when our IP address seems to have changed. <b>at_interface</b> @@ -2914,6 +2895,11 @@ do_main_loop(void) return run_main_loop_until_done(); } +#ifndef _WIN32 +/** Rate-limiter for EINVAL-type libevent warnings. */ +static ratelim_t libevent_error_ratelim = RATELIM_INIT(10); +#endif + /** * Run the main loop a single time. Return 0 for "exit"; -1 for "exit with * error", and 1 for "run this again." @@ -2979,9 +2965,12 @@ run_main_loop_once(void) return -1; #ifndef _WIN32 } else if (e == EINVAL) { - log_warn(LD_NET, "EINVAL from libevent: should you upgrade libevent?"); - if (got_libevent_error()) + log_fn_ratelim(&libevent_error_ratelim, LOG_WARN, LD_NET, + "EINVAL from libevent: should you upgrade libevent?"); + if (libevent_error_ratelim.n_calls_since_last_time > 8) { + log_err(LD_NET, "Too many libevent errors, too fast: dying"); return -1; + } #endif /* !defined(_WIN32) */ } else { tor_assert_nonfatal_once(! ERRNO_IS_EINPROGRESS(e)); @@ -3663,7 +3652,6 @@ tor_free_all(int postfork) should_init_bridge_stats = 1; dns_honesty_first_time = 1; heartbeat_callback_first_time = 1; - n_libevent_errors = 0; current_second = 0; if (!postfork) { |