mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Add a TIMEOUT_RATE keyword to buildtimeout event.
This commit is contained in:
parent
3bbc3e2137
commit
835ab53102
@ -1670,13 +1670,14 @@
|
|||||||
The syntax is:
|
The syntax is:
|
||||||
"650" SP "BUILDTIMEOUT_SET" SP Type SP "TOTAL_TIMES=" Total SP
|
"650" SP "BUILDTIMEOUT_SET" SP Type SP "TOTAL_TIMES=" Total SP
|
||||||
"TIMEOUT_MS=" Timeout SP "XM=" Xm SP "ALPHA=" Alpha SP
|
"TIMEOUT_MS=" Timeout SP "XM=" Xm SP "ALPHA=" Alpha SP
|
||||||
"CUTOFF_QUANTILE=" Quantile CRLF
|
"CUTOFF_QUANTILE=" Quantile SP "TIMEOUT_RATE=" Rate CRLF
|
||||||
Type = "COMPUTED" / "RESET" / "SUSPENDED" / "DISCARD" / "RESUME"
|
Type = "COMPUTED" / "RESET" / "SUSPENDED" / "DISCARD" / "RESUME"
|
||||||
Total = Integer count of timeouts stored
|
Total = Integer count of timeouts stored
|
||||||
Timeout = Integer timeout in milliseconds
|
Timeout = Integer timeout in milliseconds
|
||||||
Xm = Estimated integer Pareto parameter Xm in milliseconds
|
Xm = Estimated integer Pareto parameter Xm in milliseconds
|
||||||
Alpha = Estimated floating point Paredo paremter alpha
|
Alpha = Estimated floating point Paredo paremter alpha
|
||||||
Quantile = Floating point CDF quantile cutoff point for this timeout
|
Quantile = Floating point CDF quantile cutoff point for this timeout
|
||||||
|
Rate = Floating point ratio of circuits that timeout
|
||||||
|
|
||||||
A new circuit build timeout time has been set. If Type is "COMPUTED",
|
A new circuit build timeout time has been set. If Type is "COMPUTED",
|
||||||
Tor has computed the value based on historical data. If Type is "RESET",
|
Tor has computed the value based on historical data. If Type is "RESET",
|
||||||
|
@ -306,8 +306,7 @@ circuit_build_times_add_time(circuit_build_times_t *cbt, build_time_t time)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: Probably want to demote this to debug for the release.
|
log_debug(LD_CIRC, "Adding circuit build time %u", time);
|
||||||
log_info(LD_CIRC, "Adding circuit build time %u", time);
|
|
||||||
|
|
||||||
cbt->circuit_build_times[cbt->build_times_idx] = time;
|
cbt->circuit_build_times[cbt->build_times_idx] = time;
|
||||||
cbt->build_times_idx = (cbt->build_times_idx + 1) % CBT_NCIRCUITS_TO_OBSERVE;
|
cbt->build_times_idx = (cbt->build_times_idx + 1) % CBT_NCIRCUITS_TO_OBSERVE;
|
||||||
@ -733,9 +732,6 @@ void
|
|||||||
circuit_build_times_add_timeout_worker(circuit_build_times_t *cbt,
|
circuit_build_times_add_timeout_worker(circuit_build_times_t *cbt,
|
||||||
double quantile_cutoff)
|
double quantile_cutoff)
|
||||||
{
|
{
|
||||||
// XXX: This may be failing when the number of samples is small?
|
|
||||||
// Keep getting values for the largest timeout bucket over and over
|
|
||||||
// again... Probably because alpha is very very large in that case..
|
|
||||||
build_time_t gentime = circuit_build_times_generate_sample(cbt,
|
build_time_t gentime = circuit_build_times_generate_sample(cbt,
|
||||||
quantile_cutoff, CBT_MAX_SYNTHETIC_QUANTILE);
|
quantile_cutoff, CBT_MAX_SYNTHETIC_QUANTILE);
|
||||||
|
|
||||||
@ -988,6 +984,22 @@ circuit_build_times_network_check_changed(circuit_build_times_t *cbt)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Count the number of timeouts in a set of cbt data.
|
||||||
|
*/
|
||||||
|
double
|
||||||
|
circuit_build_times_timeout_rate(const circuit_build_times_t *cbt)
|
||||||
|
{
|
||||||
|
int i=0,timeouts=0;
|
||||||
|
for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) {
|
||||||
|
if (cbt->circuit_build_times[i] >= cbt->timeout_ms) {
|
||||||
|
timeouts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((double)timeouts)/cbt->total_build_times;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store a timeout as a synthetic value.
|
* Store a timeout as a synthetic value.
|
||||||
*
|
*
|
||||||
@ -1024,7 +1036,7 @@ circuit_build_times_add_timeout(circuit_build_times_t *cbt,
|
|||||||
|
|
||||||
circuit_build_times_count_pretimeouts(cbt);
|
circuit_build_times_count_pretimeouts(cbt);
|
||||||
circuit_build_times_add_timeout_worker(cbt,
|
circuit_build_times_add_timeout_worker(cbt,
|
||||||
circuit_build_times_quantile_cutoff());
|
circuit_build_times_quantile_cutoff());
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1033,7 +1045,8 @@ static int
|
|||||||
circuit_build_times_filter_timeouts(circuit_build_times_t *cbt)
|
circuit_build_times_filter_timeouts(circuit_build_times_t *cbt)
|
||||||
{
|
{
|
||||||
int num_filtered=0, i=0;
|
int num_filtered=0, i=0;
|
||||||
build_time_t max_timeout;
|
double timeout_rate = 0;
|
||||||
|
build_time_t max_timeout = 0;
|
||||||
|
|
||||||
/* If we replace high timeouts when the curve is really steep
|
/* If we replace high timeouts when the curve is really steep
|
||||||
* (alpha is above ~1.5), we can end up with a lot of timeouts clustered
|
* (alpha is above ~1.5), we can end up with a lot of timeouts clustered
|
||||||
@ -1045,6 +1058,7 @@ circuit_build_times_filter_timeouts(circuit_build_times_t *cbt)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timeout_rate = circuit_build_times_timeout_rate(cbt);
|
||||||
max_timeout = tor_lround(circuit_build_times_calculate_timeout(cbt,
|
max_timeout = tor_lround(circuit_build_times_calculate_timeout(cbt,
|
||||||
CBT_MAX_SYNTHETIC_QUANTILE));
|
CBT_MAX_SYNTHETIC_QUANTILE));
|
||||||
|
|
||||||
@ -1054,15 +1068,21 @@ circuit_build_times_filter_timeouts(circuit_build_times_t *cbt)
|
|||||||
num_filtered++;
|
num_filtered++;
|
||||||
cbt->circuit_build_times[i] =
|
cbt->circuit_build_times[i] =
|
||||||
MIN(circuit_build_times_generate_sample(cbt,
|
MIN(circuit_build_times_generate_sample(cbt,
|
||||||
circuit_build_times_quantile_cutoff(),
|
circuit_build_times_quantile_cutoff(),
|
||||||
CBT_MAX_SYNTHETIC_QUANTILE),
|
CBT_MAX_SYNTHETIC_QUANTILE),
|
||||||
CBT_BUILD_TIME_MAX);
|
CBT_BUILD_TIME_MAX);
|
||||||
|
|
||||||
log_info(LD_CIRC, "Replaced timeout %d with %d", replaced,
|
log_debug(LD_CIRC, "Replaced timeout %d with %d", replaced,
|
||||||
cbt->circuit_build_times[i]);
|
cbt->circuit_build_times[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log_info(LD_CIRC,
|
||||||
|
"We had %d timeouts out of %d build times, "
|
||||||
|
"and filtered %d above the max of %u",
|
||||||
|
(int)(cbt->total_build_times*timeout_rate),
|
||||||
|
cbt->total_build_times, num_filtered, max_timeout);
|
||||||
|
|
||||||
return num_filtered;
|
return num_filtered;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1094,13 +1114,12 @@ void
|
|||||||
circuit_build_times_set_timeout(circuit_build_times_t *cbt)
|
circuit_build_times_set_timeout(circuit_build_times_t *cbt)
|
||||||
{
|
{
|
||||||
int filtered=0,timeouts=0,i=0;
|
int filtered=0,timeouts=0,i=0;
|
||||||
|
double timeout_rate;
|
||||||
|
|
||||||
if (!circuit_build_times_set_timeout_worker(cbt))
|
if (!circuit_build_times_set_timeout_worker(cbt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((filtered = circuit_build_times_filter_timeouts(cbt)) > 0) {
|
if ((filtered = circuit_build_times_filter_timeouts(cbt)) > 0) {
|
||||||
log_info(LD_CIRC, "Filtered out %d timeouts. Recomputing timeout.",
|
|
||||||
filtered);
|
|
||||||
circuit_build_times_set_timeout_worker(cbt);
|
circuit_build_times_set_timeout_worker(cbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1112,11 +1131,7 @@ circuit_build_times_set_timeout(circuit_build_times_t *cbt)
|
|||||||
|
|
||||||
control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
|
control_event_buildtimeout_set(cbt, BUILDTIMEOUT_SET_EVENT_COMPUTED);
|
||||||
|
|
||||||
for (i = 0; i < CBT_NCIRCUITS_TO_OBSERVE; i++) {
|
timeout_rate = circuit_build_times_timeout_rate(cbt);
|
||||||
if (cbt->circuit_build_times[i] >= cbt->timeout_ms) {
|
|
||||||
timeouts++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log_info(LD_CIRC,
|
log_info(LD_CIRC,
|
||||||
"Set circuit build timeout to %lds (%lfms, Xm: %d, a: %lf, r: "
|
"Set circuit build timeout to %lds (%lfms, Xm: %d, a: %lf, r: "
|
||||||
|
@ -3529,10 +3529,12 @@ control_event_buildtimeout_set(const circuit_build_times_t *cbt,
|
|||||||
|
|
||||||
send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS,
|
send_control_event(EVENT_BUILDTIMEOUT_SET, ALL_FORMATS,
|
||||||
"650 BUILDTIMEOUT_SET %s TOTAL_TIMES=%lu "
|
"650 BUILDTIMEOUT_SET %s TOTAL_TIMES=%lu "
|
||||||
"TIMEOUT_MS=%lu XM=%lu ALPHA=%lf CUTOFF_QUANTILE=%lf\r\n",
|
"TIMEOUT_MS=%lu XM=%lu ALPHA=%lf CUTOFF_QUANTILE=%lf "
|
||||||
|
"TIMEOUT_RATE=%lf\r\n",
|
||||||
type_string, (unsigned long)cbt->total_build_times,
|
type_string, (unsigned long)cbt->total_build_times,
|
||||||
(unsigned long)cbt->timeout_ms,
|
(unsigned long)cbt->timeout_ms,
|
||||||
(unsigned long)cbt->Xm, cbt->alpha, qnt);
|
(unsigned long)cbt->Xm, cbt->alpha, qnt,
|
||||||
|
circuit_build_times_timeout_rate(cbt));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3152,6 +3152,7 @@ int circuit_build_times_needs_circuits_now(circuit_build_times_t *cbt);
|
|||||||
void circuit_build_times_init(circuit_build_times_t *cbt);
|
void circuit_build_times_init(circuit_build_times_t *cbt);
|
||||||
void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
|
void circuit_build_times_new_consensus_params(circuit_build_times_t *cbt,
|
||||||
networkstatus_t *ns);
|
networkstatus_t *ns);
|
||||||
|
double circuit_build_times_timeout_rate(const circuit_build_times_t *cbt);
|
||||||
|
|
||||||
#ifdef CIRCUIT_PRIVATE
|
#ifdef CIRCUIT_PRIVATE
|
||||||
double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
|
double circuit_build_times_calculate_timeout(circuit_build_times_t *cbt,
|
||||||
|
Loading…
Reference in New Issue
Block a user