Merge remote branch 'origin/maint-0.2.2'

Fix trivial add/add conflict in main.c

Conflicts:
	src/or/main.c
This commit is contained in:
Nick Mathewson 2011-03-14 15:31:24 -04:00
commit f1c365b032
4 changed files with 38 additions and 8 deletions

5
changes/bug2716 Normal file
View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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);
}