瀏覽代碼

be more aggressive about trying to make circuits:
try once a second for 30 seconds, and only when the entire previous
period has failed do we pause after MAX_CIRCUIT_FAILURES failures.


svn:r2281

Roger Dingledine 21 年之前
父節點
當前提交
765530421e
共有 3 個文件被更改,包括 11 次插入5 次删除
  1. 1 1
      src/or/circuitbuild.c
  2. 9 3
      src/or/circuituse.c
  3. 1 1
      src/or/or.h

+ 1 - 1
src/or/circuitbuild.c

@@ -386,7 +386,7 @@ int circuit_send_next_onion_skin(circuit_t *circ) {
       /* done building the circuit. whew. */
       circ->state = CIRCUIT_STATE_OPEN;
       log_fn(LOG_INFO,"circuit built!");
-      circuit_reset_failure_count();
+      circuit_reset_failure_count(0);
       if(!has_completed_circuit) {
         has_completed_circuit=1;
         log_fn(LOG_NOTICE,"Tor has successfully opened a circuit. Looks like it's working.");

+ 9 - 3
src/or/circuituse.c

@@ -298,7 +298,7 @@ void circuit_build_needed_circs(time_t now) {
   circ = circuit_get_youngest_clean_open(CIRCUIT_PURPOSE_C_GENERAL);
 
   if(time_to_new_circuit < now) {
-    circuit_reset_failure_count();
+    circuit_reset_failure_count(1);
     time_to_new_circuit = now + options.NewCircuitPeriod;
     if(proxy_mode())
       client_dns_clean();
@@ -585,6 +585,7 @@ void circuit_build_failed(circuit_t *circ) {
  * circuit_launch_new and circuit_*_failure_count.
  */
 static int n_circuit_failures = 0;
+static int did_circs_fail_last_period = 0;
 
 /** Don't retry launching a new circuit if we try this many times with no
  * success. */
@@ -597,7 +598,8 @@ circuit_t *circuit_launch_by_identity(uint8_t purpose, const char *exit_digest)
     return NULL;
   }
 
-  if (n_circuit_failures > MAX_CIRCUIT_FAILURES) {
+  if (did_circs_fail_last_period &&
+      n_circuit_failures > MAX_CIRCUIT_FAILURES) {
     /* too many failed circs in a row. don't try. */
 //    log_fn(LOG_INFO,"%d failures so far, not trying.",n_circuit_failures);
     return NULL;
@@ -635,7 +637,11 @@ static void circuit_increment_failure_count(void) {
  * we will try MAX_CIRCUIT_FAILURES times more (if necessary) before
  * stopping again.
  */
-void circuit_reset_failure_count(void) {
+void circuit_reset_failure_count(int timeout) {
+  if(timeout && n_circuit_failures > MAX_CIRCUIT_FAILURES)
+    did_circs_fail_last_period = 1;
+  else
+    did_circs_fail_last_period = 0;
   n_circuit_failures = 0;
 }
 

+ 1 - 1
src/or/or.h

@@ -1003,7 +1003,7 @@ void circuit_has_opened(circuit_t *circ);
 void circuit_build_failed(circuit_t *circ);
 circuit_t *circuit_launch_by_nickname(uint8_t purpose, const char *exit_nickname);
 circuit_t *circuit_launch_by_identity(uint8_t purpose, const char *exit_digest);
-void circuit_reset_failure_count(void);
+void circuit_reset_failure_count(int timeout);
 int connection_ap_handshake_attach_circuit(connection_t *conn);
 
 int circuit_init_cpath_crypto(crypt_path_t *cpath, char *key_data,int reverse);