浏览代码

If a directory authority is down, skip it when deciding where to get
networkstatus objects or descriptors. Otherwise we keep asking
every 10 seconds forever.
(adapted from r9880)


svn:r10175

Roger Dingledine 18 年之前
父节点
当前提交
346826d97b
共有 2 个文件被更改,包括 13 次插入7 次删除
  1. 5 0
      ChangeLog
  2. 8 7
      src/or/routerlist.c

+ 5 - 0
ChangeLog

@@ -37,6 +37,11 @@ Changes in version 0.2.0.1-alpha - 2007-??-??
     - Fix a bug in dirserv_remove_invalid() that would cause authorities
       to corrupt memory under some really unlikely scenarios.
 
+  o Major bugfixes:
+    - If a directory authority is down, skip it when deciding where to get
+      networkstatus objects or descriptors. Otherwise we keep asking
+      every 10 seconds forever.
+
   o Minor fixes (resource management):
     - Count the number of open sockets separately from the number
       of active connection_t objects. This will let us avoid underusing

+ 8 - 7
src/or/routerlist.c

@@ -4317,6 +4317,7 @@ update_router_descriptor_cache_downloads(time_t now)
   n_download = 0;
   SMARTLIST_FOREACH(networkstatus_list, networkstatus_t *, ns,
     {
+      trusted_dir_server_t *ds;
       smartlist_t *dl;
       dl = downloadable[ns_sl_idx] = smartlist_create();
       download_from[ns_sl_idx] = smartlist_create();
@@ -4330,13 +4331,13 @@ update_router_descriptor_cache_downloads(time_t now)
          * we take this clause out. -RD */
         continue;
       }
-      { /* XXX temporary hack so I can debug other stuff without bug 384
-         * filling up my logs. */
-        trusted_dir_server_t *ds;
-        ds = router_get_trusteddirserver_by_digest(ns->identity_digest);
-        if (ds && !ds->is_running)
-          continue;
-      }
+
+      /* Don't try dirservers that we think are down -- we might have
+       * just tried them and just marked them as down. */
+      ds = router_get_trusteddirserver_by_digest(ns->identity_digest);
+      if (ds && !ds->is_running)
+        continue;
+
       SMARTLIST_FOREACH(ns->entries, routerstatus_t * , rs,
         {
           if (!rs->need_to_mirror)