From 23fdf0b30fd9fdfe1f82e5aa1b8a196c3ca68575 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 18 Aug 2010 11:38:41 -0400 Subject: [PATCH] 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. --- src/or/dirserv.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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;