Browse Source

If we're using bridges and our network goes away, be more willing
to forgive our bridges and try again when we get an application
request. Bugfix on 0.2.0.x.


svn:r18396

Roger Dingledine 16 years ago
parent
commit
decdf4537a
7 changed files with 26 additions and 15 deletions
  1. 3 0
      ChangeLog
  2. 1 1
      doc/TODO.021
  3. 12 1
      src/or/circuitbuild.c
  4. 1 1
      src/or/circuituse.c
  5. 2 3
      src/or/connection.c
  6. 6 8
      src/or/connection_or.c
  7. 1 1
      src/or/or.h

+ 3 - 0
ChangeLog

@@ -29,6 +29,9 @@ Changes in version 0.2.1.12-alpha - 2009-02-??
       probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha.
       probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha.
     - Support changing value of ServerDNSRandomizeCase during SIGHUP.
     - Support changing value of ServerDNSRandomizeCase during SIGHUP.
       Bugfix on 0.2.1.7-alpha.
       Bugfix on 0.2.1.7-alpha.
+    - If we're using bridges and our network goes away, be more willing
+      to forgive our bridges and try again when we get an application
+      request. Bugfix on 0.2.0.x.
 
 
   o Minor features:
   o Minor features:
     - Support platforms where time_t is 64 bits long. (Congratulations,
     - Support platforms where time_t is 64 bits long. (Congratulations,

+ 1 - 1
doc/TODO.021

@@ -126,7 +126,7 @@ R d bug: if we launch using bridges, and then stop using bridges, we
     so vidalia can say "recent activity (1-8 users) from sa".
     so vidalia can say "recent activity (1-8 users) from sa".
 R - investigate: it looks like if the bridge authority is unreachable,
 R - investigate: it looks like if the bridge authority is unreachable,
     we're not falling back on querying bridges directly?
     we're not falling back on querying bridges directly?
-R - if "no running bridges known", an application request should make
+  o if "no running bridges known", an application request should make
     us retry all our bridges.
     us retry all our bridges.
 
 
 For 0.2.1.x:
 For 0.2.1.x:

+ 12 - 1
src/or/circuitbuild.c

@@ -2260,10 +2260,15 @@ entry_guards_compute_status(void)
  * is established (<b>succeeded</b>==1) or has failed (<b>succeeded</b>==0).
  * is established (<b>succeeded</b>==1) or has failed (<b>succeeded</b>==0).
  * If the OR is an entry, change that entry's up/down status.
  * If the OR is an entry, change that entry's up/down status.
  * Return 0 normally, or -1 if we want to tear down the new connection.
  * Return 0 normally, or -1 if we want to tear down the new connection.
+ *
+ * If <b>mark_relay_status</b>, also call router_set_status() on this
+ * relay.
+ *
+ * XXX022 change succeeded and mark_relay_status into 'int flags'.
  */
  */
 int
 int
 entry_guard_register_connect_status(const char *digest, int succeeded,
 entry_guard_register_connect_status(const char *digest, int succeeded,
-                                    time_t now)
+                                    int mark_relay_status, time_t now)
 {
 {
   int changed = 0;
   int changed = 0;
   int refuse_conn = 0;
   int refuse_conn = 0;
@@ -2333,6 +2338,11 @@ entry_guard_register_connect_status(const char *digest, int succeeded,
     }
     }
   }
   }
 
 
+  /* if the caller asked us to, also update the is_running flags for this
+   * relay */
+  if (mark_relay_status)
+    router_set_status(digest, succeeded);
+
   if (first_contact) {
   if (first_contact) {
     /* We've just added a new long-term entry guard. Perhaps the network just
     /* We've just added a new long-term entry guard. Perhaps the network just
      * came back? We should give our earlier entries another try too,
      * came back? We should give our earlier entries another try too,
@@ -3139,6 +3149,7 @@ bridges_retry_helper(int act)
         }
         }
       }
       }
     });
     });
+  log_debug(LD_DIR, "any_known %d, any_running %d", any_known, any_running);
   return any_known && !any_running;
   return any_known && !any_running;
 }
 }
 
 

+ 1 - 1
src/or/circuituse.c

@@ -812,7 +812,7 @@ circuit_build_failed(origin_circuit_t *circ)
       n_conn->is_bad_for_new_circs = 1;
       n_conn->is_bad_for_new_circs = 1;
     }
     }
     if (n_conn_id) {
     if (n_conn_id) {
-      entry_guard_register_connect_status(n_conn_id, 0, time(NULL));
+      entry_guard_register_connect_status(n_conn_id, 0, 1, time(NULL));
       /* if there are any one-hop streams waiting on this circuit, fail
       /* if there are any one-hop streams waiting on this circuit, fail
        * them now so they can retry elsewhere. */
        * them now so they can retry elsewhere. */
       connection_ap_fail_onehop(n_conn_id, circ->build_state);
       connection_ap_fail_onehop(n_conn_id, circ->build_state);

+ 2 - 3
src/or/connection.c

@@ -572,9 +572,8 @@ connection_about_to_close_connection(connection_t *conn)
         if (connection_or_nonopen_was_started_here(or_conn)) {
         if (connection_or_nonopen_was_started_here(or_conn)) {
           or_options_t *options = get_options();
           or_options_t *options = get_options();
           rep_hist_note_connect_failed(or_conn->identity_digest, now);
           rep_hist_note_connect_failed(or_conn->identity_digest, now);
-          entry_guard_register_connect_status(or_conn->identity_digest,0,now);
-          if (!options->HttpsProxy)
-            router_set_status(or_conn->identity_digest, 0);
+          entry_guard_register_connect_status(or_conn->identity_digest,0,
+                                              !options->HttpsProxy, now);
           if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) {
           if (conn->state >= OR_CONN_STATE_TLS_HANDSHAKING) {
             int reason = tls_error_to_orconn_end_reason(or_conn->tls_error);
             int reason = tls_error_to_orconn_end_reason(or_conn->tls_error);
             control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED,
             control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED,

+ 6 - 8
src/or/connection_or.c

@@ -783,11 +783,9 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port,
       /* If the connection failed immediately, and we're using
       /* If the connection failed immediately, and we're using
        * an https proxy, our https proxy is down. Don't blame the
        * an https proxy, our https proxy is down. Don't blame the
        * Tor server. */
        * Tor server. */
-      if (!options->HttpsProxy) {
-        entry_guard_register_connect_status(conn->identity_digest, 0,
-                                            time(NULL));
-        router_set_status(conn->identity_digest, 0);
-      }
+      if (!options->HttpsProxy)
+        entry_guard_register_connect_status(conn->identity_digest,
+                                            0, 1, time(NULL));
       connection_or_connect_failed(conn,
       connection_or_connect_failed(conn,
                                    errno_to_orconn_end_reason(socket_error),
                                    errno_to_orconn_end_reason(socket_error),
                                    tor_socket_strerror(socket_error));
                                    tor_socket_strerror(socket_error));
@@ -1036,8 +1034,8 @@ connection_or_check_valid_tls_handshake(or_connection_t *conn,
              "Tried connecting to router at %s:%d, but identity key was not "
              "Tried connecting to router at %s:%d, but identity key was not "
              "as expected: wanted %s but got %s.",
              "as expected: wanted %s but got %s.",
              conn->_base.address, conn->_base.port, expected, seen);
              conn->_base.address, conn->_base.port, expected, seen);
-      entry_guard_register_connect_status(conn->identity_digest,0,time(NULL));
-      router_set_status(conn->identity_digest, 0);
+      entry_guard_register_connect_status(conn->identity_digest, 0, 1,
+                                          time(NULL));
       control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED,
       control_event_or_conn_status(conn, OR_CONN_EVENT_FAILED,
               END_OR_CONN_REASON_OR_IDENTITY);
               END_OR_CONN_REASON_OR_IDENTITY);
       if (!authdir_mode_tests_reachability(options))
       if (!authdir_mode_tests_reachability(options))
@@ -1136,7 +1134,7 @@ connection_or_set_state_open(or_connection_t *conn)
   if (started_here) {
   if (started_here) {
     rep_hist_note_connect_succeeded(conn->identity_digest, now);
     rep_hist_note_connect_succeeded(conn->identity_digest, now);
     if (entry_guard_register_connect_status(conn->identity_digest,
     if (entry_guard_register_connect_status(conn->identity_digest,
-                                            1, now) < 0) {
+                                            1, 0, now) < 0) {
       /* Close any circuits pending on this conn. We leave it in state
       /* Close any circuits pending on this conn. We leave it in state
        * 'open' though, because it didn't actually *fail* -- we just
        * 'open' though, because it didn't actually *fail* -- we just
        * chose not to use it. (Otherwise
        * chose not to use it. (Otherwise

+ 1 - 1
src/or/or.h

@@ -2741,7 +2741,7 @@ const char *build_state_get_exit_nickname(cpath_build_state_t *state);
 
 
 void entry_guards_compute_status(void);
 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);
+                                        int mark_relay_status, 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);
 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);