summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-05-09 14:04:30 -0400
committerNick Mathewson <nickm@torproject.org>2018-05-09 14:04:30 -0400
commitd972a8a9440d89143d58b5d0bd57155c38651ee6 (patch)
tree0efdeb235b40bb0687e1fed2bcc2b68c7cd96cc0 /src
parentf684b48b5be5515395846d089a386167e76f895a (diff)
parentb0e5757710c476a1a79dfc8a706f566ce515c495 (diff)
downloadtor-d972a8a9440d89143d58b5d0bd57155c38651ee6.tar.gz
tor-d972a8a9440d89143d58b5d0bd57155c38651ee6.zip
Merge branch 'ticket26016'
Diffstat (limited to 'src')
-rw-r--r--src/or/main.c33
1 files changed, 10 insertions, 23 deletions
diff --git a/src/or/main.c b/src/or/main.c
index 2497c277a2..c4a42569d9 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -2495,9 +2495,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 update_current_time was called. */
static time_t current_second = 0;
/** Last time that update_current_time updated current_second. */
@@ -2576,8 +2573,6 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
(void)timer;
(void)arg;
- n_libevent_errors = 0;
-
now = time(NULL);
/* We don't need to do this once-per-second any more: time-updating is
@@ -2615,21 +2610,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>
@@ -2971,6 +2951,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."
@@ -3036,9 +3021,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));
@@ -3721,7 +3709,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;
memset(&current_second_last_changed, 0,
sizeof(current_second_last_changed));