Bug 29085: Avoid monotime usage for rtt estimates if it is not in use.

This commit is contained in:
Mike Perry 2019-05-08 00:40:49 +00:00 committed by George Kadianakis
parent 5c2d2b5d11
commit 14ec8b89f8
2 changed files with 22 additions and 4 deletions

View File

@ -1548,9 +1548,25 @@ circpad_estimate_circ_rtt_on_received(circuit_t *circ,
circ->n_chan ? circ->n_chan->global_identifier : 0,
circ->n_circ_id, mi->rtt_estimate_usec);
mi->stop_rtt_update = 1;
if (!mi->rtt_estimate_usec) {
static ratelim_t rtt_lim = RATELIM_INIT(600);
log_fn_ratelim(&rtt_lim,LOG_NOTICE,LD_BUG,
"Circuit got two cells back to back before estimating RTT.");
}
}
} else {
const circpad_state_t *state = circpad_machine_current_state(mi);
/* Since monotime is unpredictably expensive, only update this field
* if rtt estimates are needed. Otherwise, stop the rtt update. */
if (state->use_rtt_estimate) {
mi->last_received_time_usec = monotime_absolute_usec();
} else {
/* Let's fast-path future decisions not to update rtt if the
* feature is not in use. */
mi->stop_rtt_update = 1;
}
}
}
@ -1610,8 +1626,9 @@ circpad_estimate_circ_rtt_on_send(circuit_t *circ,
mi->stop_rtt_update = 1;
if (!mi->rtt_estimate_usec) {
log_fn(LOG_NOTICE, LD_CIRC,
"Got two cells back to back on a circuit before estimating RTT.");
static ratelim_t rtt_lim = RATELIM_INIT(600);
log_fn_ratelim(&rtt_lim,LOG_NOTICE,LD_BUG,
"Circuit sent two cells back to back before estimating RTT.");
}
}
}

View File

@ -415,6 +415,7 @@ helper_create_basic_machine(void)
circ_client_machine.states[CIRCPAD_STATE_START].
next_state[CIRCPAD_EVENT_NONPADDING_RECV] = CIRCPAD_STATE_BURST;
circ_client_machine.states[CIRCPAD_STATE_START].use_rtt_estimate = 1;
circ_client_machine.states[CIRCPAD_STATE_BURST].
next_state[CIRCPAD_EVENT_PADDING_RECV] = CIRCPAD_STATE_BURST;