]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
If we can't expand our list of entry guards (e.g. because we're
authorRoger Dingledine <arma@torproject.org>
Mon, 10 Dec 2007 17:16:41 +0000 (17:16 +0000)
committerRoger Dingledine <arma@torproject.org>
Mon, 10 Dec 2007 17:16:41 +0000 (17:16 +0000)
using bridges or we have StrictEntryNodes set), don't mark relays
down when they fail a directory request. Otherwise we're too quick
to mark all our entry points down.

svn:r12755

ChangeLog
src/or/circuitbuild.c
src/or/directory.c
src/or/or.h

index 355b9648044f937bf104019eda5793880aafaa9b..039e55bbfe8f7c49ce7e460f9cfafbfb12036864 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -51,6 +51,10 @@ Changes in version 0.2.0.13-alpha - 2007-12-??
       running an obsolete version, it used the string "OLD" to describe
       it. Yet the "getinfo" interface used the string "OBSOLETE". Now use
       "OBSOLETE" in both cases.
+    - If we can't expand our list of entry guards (e.g. because we're
+      using bridges or we have StrictEntryNodes set), don't mark relays
+      down when they fail a directory request. Otherwise we're too quick
+      to mark all our entry points down.
 
   o Minor features:
     - On USR1, when dmalloc is in use, log the top 10 memory
index 1f1018a51a94c8bb3fdeba56c5e0e50875009535..22d9c912dc7971f8fde2253e0fa6fdd7a946538d 100644 (file)
@@ -2430,8 +2430,8 @@ entry_guards_prepend_from_config(void)
 
 /** Return 1 if we're fine adding arbitrary routers out of the
  * directory to our entry guard list. Else return 0. */
-static int
-can_grow_entry_list(or_options_t *options)
+int
+entry_list_can_grow(or_options_t *options)
 {
   if (options->StrictEntryNodes)
     return 0;
@@ -2469,7 +2469,7 @@ choose_random_entry(cpath_build_state_t *state)
   if (should_add_entry_nodes)
     entry_guards_prepend_from_config();
 
-  if (can_grow_entry_list(options) &&
+  if (entry_list_can_grow(options) &&
       (! entry_guards ||
        smartlist_len(entry_guards) < options->NumEntryGuards))
     pick_entry_guards();
@@ -2498,7 +2498,7 @@ choose_random_entry(cpath_build_state_t *state)
    * using him.
    * (We might get 2 live-but-crummy entry guards, but so be it.) */
   if (smartlist_len(live_entry_guards) < 2) {
-    if (can_grow_entry_list(options)) {
+    if (entry_list_can_grow(options)) {
       /* still no? try adding a new entry then */
       /* XXX if guard doesn't imply fast and stable, then we need
        * to tell add_an_entry_guard below what we want, or it might
@@ -2518,7 +2518,7 @@ choose_random_entry(cpath_build_state_t *state)
       need_capacity = 0;
       goto retry;
     }
-    if (!r && !can_grow_entry_list(options) && consider_exit_family) {
+    if (!r && !entry_list_can_grow(options) && consider_exit_family) {
       /* still no? if we're using bridges or have strictentrynodes
        * set, and our chosen exit is in the same family as all our
        * bridges/entry guards, then be flexible about families. */
index 39a65f50b7f3d78f3d30ad2c0db8a59702eca61a..628c94e249d97c71e7d612b3e2d1fadc5c4e2c2b 100644 (file)
@@ -500,7 +500,8 @@ connection_dir_request_failed(dir_connection_t *conn)
                                   me->address, me->dir_port);
     return; /* this was a test fetch. don't retry. */
   }
-  router_set_status(conn->identity_digest, 0); /* don't try him again */
+  if (entry_list_can_grow(get_options()))
+    router_set_status(conn->identity_digest, 0); /* don't try him again */
   if (conn->_base.purpose == DIR_PURPOSE_FETCH_DIR ||
       conn->_base.purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) {
     log_info(LD_DIR, "Giving up on directory server at '%s:%d'; retrying",
index bf56bdd9ee3e822dc02d3f543e362ce69d8c5c08..76354493387fbf7ef460d58be817c752ab0ce3e0 100644 (file)
@@ -2481,6 +2481,7 @@ void entry_guards_compute_status(void);
 int entry_guard_register_connect_status(const char *digest, int succeeded,
                                         time_t now);
 void entry_nodes_should_be_added(void);
+int entry_list_can_grow(or_options_t *options);
 routerinfo_t *choose_random_entry(cpath_build_state_t *state);
 int entry_guards_parse_state(or_state_t *state, int set, char **msg);
 void entry_guards_update_state(or_state_t *state);