]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
implement weasel's suggestion to fix the bug that newly bootstrapped
authorRoger Dingledine <arma@torproject.org>
Thu, 15 Dec 2005 09:53:00 +0000 (09:53 +0000)
committerRoger Dingledine <arma@torproject.org>
Thu, 15 Dec 2005 09:53:00 +0000 (09:53 +0000)
tor networks couldn't do hidden services until they had nodes with high
uptime: if you're trying to pick a node for your circuit and you demand
uptime or capacity and nothing works, then abandon your need for uptime
and capacity.

svn:r5589

src/or/routerlist.c

index 44033a15c48c5677f731b62054e9ea0ef5ae6b9b..408a7123509b53d1fdec6852e13e18794294f135 100644 (file)
@@ -794,8 +794,8 @@ routerlist_sl_choose_by_bandwidth(smartlist_t *sl)
  * <b>excludedsmartlist</b>, even if they are the only nodes
  * available.  If <b>strict</b> is true, never pick any node besides
  * those in <b>preferred</b>.
- * If <b>need_uptime</b> is non-zero, don't return a router with less
- * than a minimum uptime.
+ * If <b>need_uptime</b> is non-zero and any router has more than
+ * a minimum uptime, return one of those.
  * If <b>need_capacity</b> is non-zero, weight your choice by the
  * advertised capacity of each router.
  */
@@ -837,6 +837,15 @@ router_choose_random_node(const char *preferred,
     else
       choice = smartlist_choose(sl);
     smartlist_free(sl);
+    if (!choice && (need_uptime || need_capacity)) {
+      /* try once more -- recurse but with fewer restrictions. */
+      info(LD_CIRC, "We couldn't find any live%s%s routers; falling back "
+           "to list of all routers.",
+           need_capacity?", fast":"",
+           need_uptime?", stable":"");
+      choice = router_choose_random_node(
+        NULL, excluded, excludedsmartlist, 0, 0, allow_unverified, 0);
+    }
   }
   smartlist_free(excludednodes);
   if (!choice)