Browse Source

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.


svn:r12755

Roger Dingledine 18 years ago
parent
commit
52363d23d7
4 changed files with 12 additions and 6 deletions
  1. 4 0
      ChangeLog
  2. 5 5
      src/or/circuitbuild.c
  3. 2 1
      src/or/directory.c
  4. 1 0
      src/or/or.h

+ 4 - 0
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
       running an obsolete version, it used the string "OLD" to describe
       it. Yet the "getinfo" interface used the string "OBSOLETE". Now use
       it. Yet the "getinfo" interface used the string "OBSOLETE". Now use
       "OBSOLETE" in both cases.
       "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:
   o Minor features:
     - On USR1, when dmalloc is in use, log the top 10 memory
     - On USR1, when dmalloc is in use, log the top 10 memory

+ 5 - 5
src/or/circuitbuild.c

@@ -2430,8 +2430,8 @@ entry_guards_prepend_from_config(void)
 
 
 /** Return 1 if we're fine adding arbitrary routers out of the
 /** Return 1 if we're fine adding arbitrary routers out of the
  * directory to our entry guard list. Else return 0. */
  * 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)
   if (options->StrictEntryNodes)
     return 0;
     return 0;
@@ -2469,7 +2469,7 @@ choose_random_entry(cpath_build_state_t *state)
   if (should_add_entry_nodes)
   if (should_add_entry_nodes)
     entry_guards_prepend_from_config();
     entry_guards_prepend_from_config();
 
 
-  if (can_grow_entry_list(options) &&
+  if (entry_list_can_grow(options) &&
       (! entry_guards ||
       (! entry_guards ||
        smartlist_len(entry_guards) < options->NumEntryGuards))
        smartlist_len(entry_guards) < options->NumEntryGuards))
     pick_entry_guards();
     pick_entry_guards();
@@ -2498,7 +2498,7 @@ choose_random_entry(cpath_build_state_t *state)
    * using him.
    * using him.
    * (We might get 2 live-but-crummy entry guards, but so be it.) */
    * (We might get 2 live-but-crummy entry guards, but so be it.) */
   if (smartlist_len(live_entry_guards) < 2) {
   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 */
       /* still no? try adding a new entry then */
       /* XXX if guard doesn't imply fast and stable, then we need
       /* 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
        * 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;
       need_capacity = 0;
       goto retry;
       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
       /* still no? if we're using bridges or have strictentrynodes
        * set, and our chosen exit is in the same family as all our
        * set, and our chosen exit is in the same family as all our
        * bridges/entry guards, then be flexible about families. */
        * bridges/entry guards, then be flexible about families. */

+ 2 - 1
src/or/directory.c

@@ -500,7 +500,8 @@ connection_dir_request_failed(dir_connection_t *conn)
                                   me->address, me->dir_port);
                                   me->address, me->dir_port);
     return; /* this was a test fetch. don't retry. */
     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 ||
   if (conn->_base.purpose == DIR_PURPOSE_FETCH_DIR ||
       conn->_base.purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) {
       conn->_base.purpose == DIR_PURPOSE_FETCH_RUNNING_LIST) {
     log_info(LD_DIR, "Giving up on directory server at '%s:%d'; retrying",
     log_info(LD_DIR, "Giving up on directory server at '%s:%d'; retrying",

+ 1 - 0
src/or/or.h

@@ -2481,6 +2481,7 @@ void entry_guards_compute_status(void);
 int entry_guard_register_connect_status(const char *digest, int succeeded,
 int entry_guard_register_connect_status(const char *digest, int succeeded,
                                         time_t now);
                                         time_t now);
 void entry_nodes_should_be_added(void);
 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);
 routerinfo_t *choose_random_entry(cpath_build_state_t *state);
 int entry_guards_parse_state(or_state_t *state, int set, char **msg);
 int entry_guards_parse_state(or_state_t *state, int set, char **msg);
 void entry_guards_update_state(or_state_t *state);
 void entry_guards_update_state(or_state_t *state);