summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-03-14 15:29:02 -0400
committerNick Mathewson <nickm@torproject.org>2011-03-14 15:29:02 -0400
commitb639add1a010d5816ceb693c68ddc3b48655b752 (patch)
treecb1f817e989e2cb48615bb6352743590a819f2fb
parentd34a5cdc597824e72453009ed209e5644f158e90 (diff)
parent61f648ae3764daacb3865c8344f0381fd09a8e45 (diff)
downloadtor-b639add1a010d5816ceb693c68ddc3b48655b752.tar.gz
tor-b639add1a010d5816ceb693c68ddc3b48655b752.zip
Merge remote branch 'arma/bug2716' into maint-0.2.2
-rw-r--r--changes/bug27165
-rw-r--r--src/or/dirserv.c22
-rw-r--r--src/or/dirserv.h12
-rw-r--r--src/or/main.c7
4 files changed, 38 insertions, 8 deletions
diff --git a/changes/bug2716 b/changes/bug2716
new file mode 100644
index 0000000000..4663ed3184
--- /dev/null
+++ b/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.
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 40136a18e3..18abd1865f 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -971,8 +971,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);
}
router->is_running = answer;
@@ -3204,8 +3214,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)
@@ -3231,11 +3241,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
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index 56ad7a6a56..569abfca2e 100644
--- a/src/or/dirserv.h
+++ b/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
diff --git a/src/or/main.c b/src/or/main.c
index 979a2bec5c..214a4fad5d 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -872,6 +872,7 @@ run_scheduled_events(time_t now)
static time_t time_to_check_for_expired_networkstatus = 0;
static time_t time_to_write_stats_files = 0;
static time_t time_to_write_bridge_stats = 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;
or_options_t *options = get_options();
@@ -962,8 +963,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);
}