From: Nick Mathewson Date: Wed, 18 Aug 2010 15:38:41 +0000 (-0400) Subject: Allow some skew in checking when a router said it was hibernating X-Git-Tag: tor-0.2.2.16-alpha~10^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=23fdf0b30fd9fdfe1f82e5aa1b8a196c3ca68575;p=thirdparty%2Ftor.git Allow some skew in checking when a router said it was hibernating This solves the problem Roger noted as: What if the router has a clock that's 5 minutes off, so it publishes a descriptor for 5 minutes in the future, and we test it three minutes in. In this edge case, we will continue to advertise it as Running for the full 45 minute period. --- diff --git a/src/or/dirserv.c b/src/or/dirserv.c index dd9026758c..80831b5be0 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -923,6 +923,11 @@ running_long_enough_to_decide_unreachable(void) * the directory. */ #define REACHABLE_TIMEOUT (45*60) +/** If we tested a router and found it reachable _at least this long_ after it + * declared itself hibernating, it is probably done hibernating and we just + * missed a descriptor from it. */ +#define ALLOW_REACHABILITY_PUBLICATION_SKEW (60*60) + /** Treat a router as alive if * - It's me, and I'm not hibernating. * or - We've found it reachable recently. */ @@ -939,7 +944,8 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) /* We always know if we are down ourselves. */ answer = ! we_are_hibernating(); } else if (router->is_hibernating && - router->cache_info.published_on > router->last_reachable) { + (router->cache_info.published_on + + ALLOW_REACHABILITY_PUBLICATION_SKEW) > router->last_reachable) { /* A hibernating router is down unless we (somehow) had contact with it * since it declared itself to be hibernating. */ answer = 0;