瀏覽代碼

Fix state checks on liveness handling.

If we really want all this complexity for these stages here, we need to handle
it better for people with large timeouts. It should probably go away, though.
Mike Perry 15 年之前
父節點
當前提交
0744a175af
共有 1 個文件被更改,包括 15 次插入7 次删除
  1. 15 7
      src/or/circuitbuild.c

+ 15 - 7
src/or/circuitbuild.c

@@ -1034,17 +1034,25 @@ circuit_build_times_network_check_live(circuit_build_times_t *cbt)
     return 0;
   } else if (cbt->liveness.nonlive_timeouts >=
                 CBT_NETWORK_NONLIVE_TIMEOUT_COUNT) {
-    // XXX: We won't ever conclude the network is flaky here for poor arma...
-    if (cbt->timeout_ms < circuit_build_times_get_initial_timeout()) {
+    if (cbt->liveness.suspended_timeout <= 0) {
+      cbt->liveness.suspended_timeout = cbt->timeout_ms;
+      cbt->liveness.suspended_close_timeout = cbt->close_ms;
+
+      if (cbt->timeout_ms < circuit_build_times_get_initial_timeout())
+        cbt->timeout_ms = circuit_build_times_get_initial_timeout();
+      else
+        cbt->timeout_ms *= 2;
+
+      if (cbt->close_ms < circuit_build_times_get_initial_timeout())
+        cbt->close_ms = circuit_build_times_get_initial_timeout();
+      else
+        cbt->close_ms *= 2;
+
       log_notice(LD_CIRC,
                 "Network is flaky. No activity for %ld seconds. "
                 "Temporarily raising timeout to %lds.",
                 (long int)(now - cbt->liveness.network_last_live),
-                tor_lround(circuit_build_times_get_initial_timeout()/1000));
-      cbt->liveness.suspended_timeout = cbt->timeout_ms;
-      cbt->liveness.suspended_close_timeout = cbt->close_ms;
-      cbt->close_ms = cbt->timeout_ms
-                    = circuit_build_times_get_initial_timeout();
+                tor_lround(cbt->timeout_ms/1000));
       control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_SUSPENDED);
     }