]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Allow some skew in checking when a router said it was hibernating
authorNick Mathewson <nickm@torproject.org>
Wed, 18 Aug 2010 15:38:41 +0000 (11:38 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 18 Aug 2010 15:40:22 +0000 (11:40 -0400)
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

index dd9026758c1aa22ac21b398d3dbc0f70290b781a..80831b5be0cd67045c1e5a939218a6bb2b15d84f 100644 (file)
@@ -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;