]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
If a router is hibernating, never vote that it is Running.
authorNick Mathewson <nickm@torproject.org>
Sat, 31 Jul 2010 20:33:45 +0000 (16:33 -0400)
committerNick Mathewson <nickm@torproject.org>
Sat, 31 Jul 2010 20:33:45 +0000 (16:33 -0400)
Also, clean up and comment some of the logic in
dirserv_set_router_is_running.

changes/bug911_hibernate_precludes_Running [new file with mode: 0644]
src/or/dirserv.c

diff --git a/changes/bug911_hibernate_precludes_Running b/changes/bug911_hibernate_precludes_Running
new file mode 100644 (file)
index 0000000..e8f2792
--- /dev/null
@@ -0,0 +1,5 @@
+  o Minor bugfixes:
+    - Never vote for a server as "Running" if we have a descriptor for it
+      claiming to be hibernating, and that descriptor was published more
+      recently than our last contact with the server.
+
index 86cd1861110a33b5c8cee1649a1ae793803fcb80..7b469ce54b2dec2c33f1eed0d8673c0211689b84 100644 (file)
@@ -935,11 +935,21 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now)
    */
   int answer;
 
-  if (router_is_me(router) && !we_are_hibernating())
+  if (router_is_me(router))
+    /* 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)
+    /* A hibernating router is down unless we (somehow) had contact with it
+     * since it declared itself to be hibernating. */
+    answer = 0;
+  else if (get_options()->AssumeReachable)
+    /* If AssumeReachable, everybody is up! */
     answer = 1;
   else
-    answer = get_options()->AssumeReachable ||
-             now < router->last_reachable + REACHABLE_TIMEOUT;
+    /* Otherwise, a router counts as up if we found it reachable in the last
+       REACHABLE_TIMEOUT seconds. */
+    answer = (now < router->last_reachable + REACHABLE_TIMEOUT);
 
   if (!answer && running_long_enough_to_decide_unreachable()) {
     /* not considered reachable. tell rephist. */