From 5a6575c2d42c891965cc7639d212cb860f698bd2 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Thu, 2 Jul 2009 13:56:52 -0400 Subject: Don't set unreachable from dirvote unless we've been running a while. This is a possible fix for bug 1023, where if we vote (or make a v2 consensus networkstatus) right after we come online, we can call rep_hist_note_router_unreachable() on every router we haven't connected to yet, and thereby make all their uptime values reset. --- src/or/dirserv.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'src/or/dirserv.c') diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 5deb0ea413..47dc038454 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -896,6 +896,13 @@ list_single_server_status(routerinfo_t *desc, int is_live) return tor_strdup(buf); } +static INLINE int +running_long_enough_to_decide_unreachable(void) +{ + return time_of_process_start + + get_options()->TestingAuthDirTimeToLearnReachability < approx_time(); +} + /** Each server needs to have passed a reachability test no more * than this number of seconds ago, or he is listed as down in * the directory. */ @@ -907,6 +914,10 @@ list_single_server_status(routerinfo_t *desc, int is_live) void dirserv_set_router_is_running(routerinfo_t *router, time_t now) { + /*XXXX022 This function is a mess. Separate out the part that calculates + whether it's reachable and the part that tells rephist that the router was + unreachable. + */ int answer; if (router_is_me(router) && !we_are_hibernating()) @@ -915,7 +926,7 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) answer = get_options()->AssumeReachable || now < router->last_reachable + REACHABLE_TIMEOUT; - if (!answer) { + if (!answer && running_long_enough_to_decide_unreachable()) { /* not considered reachable. tell rephist. */ rep_hist_note_router_unreachable(router->cache_info.identity_digest, now); } @@ -2420,15 +2431,11 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key, networkstatus_voter_info_t *voter = NULL; vote_timing_t timing; digestmap_t *omit_as_sybil = NULL; - int vote_on_reachability = 1; + const int vote_on_reachability = running_long_enough_to_decide_unreachable(); tor_assert(private_key); tor_assert(cert); - if (now - time_of_process_start < - options->TestingAuthDirTimeToLearnReachability) - vote_on_reachability = 0; - if (resolve_my_address(LOG_WARN, options, &addr, &hostname)<0) { log_warn(LD_NET, "Couldn't resolve my hostname"); return NULL; -- cgit v1.2.3-54-g00ecf