|
@@ -306,6 +306,7 @@ circuit_build_times_init(circuit_build_times_t *cbt)
|
|
|
control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESET);
|
|
|
}
|
|
|
|
|
|
+#if 0
|
|
|
/**
|
|
|
* Rewind our build time history by n positions.
|
|
|
*/
|
|
@@ -332,6 +333,7 @@ circuit_build_times_rewind_history(circuit_build_times_t *cbt, int n)
|
|
|
"Rewound history by %d places. Current index: %d. "
|
|
|
"Total: %d", n, cbt->build_times_idx, cbt->total_build_times);
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
/**
|
|
|
* Add a new build time value <b>time</b> to the set of build times. Time
|
|
@@ -941,8 +943,16 @@ circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt)
|
|
|
void
|
|
|
circuit_build_times_network_is_live(circuit_build_times_t *cbt)
|
|
|
{
|
|
|
- cbt->liveness.network_last_live = approx_time();
|
|
|
- cbt->liveness.nonlive_discarded = 0;
|
|
|
+ time_t now = approx_time();
|
|
|
+ if (cbt->liveness.nonlive_timeouts > 0) {
|
|
|
+ log_notice(LD_CIRC,
|
|
|
+ "Tor now sees network activity. Restoring circuit build "
|
|
|
+ "timeout recording. Network was down for %ld seconds "
|
|
|
+ "during %d circuit attempts.",
|
|
|
+ (long int)now - cbt->liveness.network_last_live,
|
|
|
+ cbt->liveness.nonlive_timeouts);
|
|
|
+ }
|
|
|
+ cbt->liveness.network_last_live = now;
|
|
|
cbt->liveness.nonlive_timeouts = 0;
|
|
|
}
|
|
|
|
|
@@ -1002,9 +1012,16 @@ circuit_build_times_network_close(circuit_build_times_t *cbt,
|
|
|
now_buf);
|
|
|
}
|
|
|
cbt->liveness.nonlive_timeouts++;
|
|
|
- log_info(LD_CIRC,
|
|
|
+ if (cbt->liveness.nonlive_timeouts == 1) {
|
|
|
+ log_notice(LD_CIRC,
|
|
|
+ "Tor has not observed any network activity for the past %ld "
|
|
|
+ "seconds. Disabling circuit build timeout code.",
|
|
|
+ (long int)now - cbt->liveness.network_last_live);
|
|
|
+ } else {
|
|
|
+ log_info(LD_CIRC,
|
|
|
"Got non-live timeout. Current count is: %d",
|
|
|
cbt->liveness.nonlive_timeouts);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1018,54 +1035,8 @@ circuit_build_times_network_close(circuit_build_times_t *cbt,
|
|
|
int
|
|
|
circuit_build_times_network_check_live(circuit_build_times_t *cbt)
|
|
|
{
|
|
|
- time_t now = approx_time();
|
|
|
- if (cbt->liveness.nonlive_timeouts >= CBT_NETWORK_NONLIVE_DISCARD_COUNT) {
|
|
|
- if (!cbt->liveness.nonlive_discarded) {
|
|
|
- cbt->liveness.nonlive_discarded = 1;
|
|
|
- log_notice(LD_CIRC, "Network is no longer live (too many recent "
|
|
|
- "circuit timeouts). Dead for %ld seconds.",
|
|
|
- (long int)(now - cbt->liveness.network_last_live));
|
|
|
- /* Only discard NETWORK_NONLIVE_TIMEOUT_COUNT-1 because we stopped
|
|
|
- * counting after that */
|
|
|
- circuit_build_times_rewind_history(cbt,
|
|
|
- CBT_NETWORK_NONLIVE_TIMEOUT_COUNT-1);
|
|
|
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_DISCARD);
|
|
|
- }
|
|
|
- return 0;
|
|
|
- } else if (cbt->liveness.nonlive_timeouts >=
|
|
|
- CBT_NETWORK_NONLIVE_TIMEOUT_COUNT) {
|
|
|
- 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(cbt->timeout_ms/1000));
|
|
|
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_SUSPENDED);
|
|
|
- }
|
|
|
-
|
|
|
+ if (cbt->liveness.nonlive_timeouts > 0) {
|
|
|
return 0;
|
|
|
- } else if (cbt->liveness.suspended_timeout > 0) {
|
|
|
- log_notice(LD_CIRC,
|
|
|
- "Network activity has resumed. "
|
|
|
- "Resuming circuit timeout calculations.");
|
|
|
- cbt->timeout_ms = cbt->liveness.suspended_timeout;
|
|
|
- cbt->close_ms = cbt->liveness.suspended_close_timeout;
|
|
|
- cbt->liveness.suspended_timeout = 0;
|
|
|
- cbt->liveness.suspended_close_timeout = 0;
|
|
|
- control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_RESUME);
|
|
|
}
|
|
|
|
|
|
return 1;
|