Forráskód Böngészése

Merge remote branch 'origin/maint-0.2.2'

Fix trivial add/add conflict in main.c

Conflicts:
	src/or/main.c
Nick Mathewson 13 éve
szülő
commit
f1c365b032
4 módosított fájl, 38 hozzáadás és 8 törlés
  1. 5 0
      changes/bug2716
  2. 16 6
      src/or/dirserv.c
  3. 12 0
      src/or/dirserv.h
  4. 5 2
      src/or/main.c

+ 5 - 0
changes/bug2716

@@ -0,0 +1,5 @@
+  o Minor features:
+    - When a relay has failed several reachability tests, be more accurate
+      at recording when it became unreachable, so we can in turn provide
+      more accuracy at assigning Stable, Guard, HSDir, etc flags. Bugfix
+      on 0.2.0.6-alpha. Resolves bug 2716.

+ 16 - 6
src/or/dirserv.c

@@ -994,8 +994,18 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
   }
 
   if (!answer && running_long_enough_to_decide_unreachable()) {
-    /* not considered reachable. tell rephist. */
-    rep_hist_note_router_unreachable(router->cache_info.identity_digest, now);
+    /* Not considered reachable. tell rephist about that.
+
+       Because we launch a reachability test for each router every
+       REACHABILITY_TEST_CYCLE_PERIOD seconds, then the router has probably
+       been down since at least that time after we last successfully reached
+       it.
+     */
+    time_t when = now;
+    if (router->last_reachable &&
+        router->last_reachable + REACHABILITY_TEST_CYCLE_PERIOD < now)
+      when = router->last_reachable + REACHABILITY_TEST_CYCLE_PERIOD;
+    rep_hist_note_router_unreachable(router->cache_info.identity_digest, when);
   }
 
   node->is_running = answer;
@@ -3232,8 +3242,8 @@ dirserv_single_reachability_test(time_t now, routerinfo_t *router)
  * try a few connections per call.
  *
  * The load balancing is such that if we get called once every ten
- * seconds, we will cycle through all the tests in 1280 seconds (a
- * bit over 20 minutes).
+ * seconds, we will cycle through all the tests in
+ * REACHABILITY_TEST_CYCLE_PERIOD seconds (a bit over 20 minutes).
  */
 void
 dirserv_test_reachability(time_t now)
@@ -3259,11 +3269,11 @@ dirserv_test_reachability(time_t now)
       continue; /* bridge authorities only test reachability on bridges */
 //    if (router->cache_info.published_on > cutoff)
 //      continue;
-    if ((((uint8_t)id_digest[0]) % 128) == ctr) {
+    if ((((uint8_t)id_digest[0]) % REACHABILITY_MODULO_PER_TEST) == ctr) {
       dirserv_single_reachability_test(now, router);
     }
   } SMARTLIST_FOREACH_END(router);
-  ctr = (ctr + 1) % 128; /* increment ctr */
+  ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */
 }
 
 /** Given a fingerprint <b>fp</b> which is either set if we're looking for a

+ 12 - 0
src/or/dirserv.h

@@ -12,6 +12,18 @@
 #ifndef _TOR_DIRSERV_H
 #define _TOR_DIRSERV_H
 
+/** What fraction (1 over this number) of the relay ID space do we
+ * (as a directory authority) launch connections to at each reachability
+ * test? */
+#define REACHABILITY_MODULO_PER_TEST 128
+
+/** How often (in seconds) do we launch reachability tests? */
+#define REACHABILITY_TEST_INTERVAL 10
+
+/** How many seconds apart are the reachability tests for a given relay? */
+#define REACHABILITY_TEST_CYCLE_PERIOD \
+  (REACHABILITY_TEST_INTERVAL*REACHABILITY_MODULO_PER_TEST)
+
 /** Maximum length of an exit policy summary. */
 #define MAX_EXITPOLICY_SUMMARY_LEN 1000
 

+ 5 - 2
src/or/main.c

@@ -1049,6 +1049,7 @@ run_scheduled_events(time_t now)
   static time_t time_to_write_stats_files = 0;
   static time_t time_to_write_bridge_stats = 0;
   static time_t time_to_check_port_forwarding = 0;
+  static time_t time_to_launch_reachability_tests = 0;
   static int should_init_bridge_stats = 1;
   static time_t time_to_retry_dns_init = 0;
   static time_t time_to_next_heartbeat = 0;
@@ -1151,8 +1152,10 @@ run_scheduled_events(time_t now)
   if (accounting_is_enabled(options))
     accounting_run_housekeeping(now);
 
-  if (now % 10 == 0 && (authdir_mode_tests_reachability(options)) &&
-      !we_are_hibernating()) {
+  if (time_to_launch_reachability_tests < now &&
+      (authdir_mode_tests_reachability(options)) &&
+       !we_are_hibernating()) {
+    time_to_launch_reachability_tests = now + REACHABILITY_TEST_INTERVAL;
     /* try to determine reachability of the other Tor relays */
     dirserv_test_reachability(now);
   }