[tor-commits] [tor/master] Refactor to remove n_libevent_errors

nickm at torproject.org nickm at torproject.org
Wed May 9 18:05:11 UTC 2018


commit b0e5757710c476a1a79dfc8a706f566ce515c495
Author: Nick Mathewson <nickm at torproject.org>
Date:   Thu May 3 12:44:00 2018 -0400

    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.
---
 changes/ticket26016 |  4 ++++
 src/or/main.c       | 32 ++++++++++----------------------
 2 files changed, 14 insertions(+), 22 deletions(-)

diff --git a/changes/ticket26016 b/changes/ticket26016
new file mode 100644
index 000000000..f0eb56d32
--- /dev/null
+++ b/changes/ticket26016
@@ -0,0 +1,4 @@
+  o Code simplification and refactoring:
+    - Use our standard rate-limiting code to deal with excessive libevent
+      failures, rather than the hand-rolled logic we had before.
+      Closes ticket 26016.
diff --git a/src/or/main.c b/src/or/main.c
index 8cdf27ed4..849101906 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) {





More information about the tor-commits mailing list