mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
hs: Retry service rendezvous on circuit close
Move the retry from circuit_expire_building() to when the offending circuit is being closed. Fixes #40695 Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
5b44a32c59
commit
78c184d2fe
@ -759,7 +759,6 @@ circuit_expire_building(void)
|
||||
(unsigned)victim->n_circ_id,
|
||||
victim->state, circuit_state_to_string(victim->state),
|
||||
victim->purpose);
|
||||
hs_circ_retry_service_rendezvous_point(TO_ORIGIN_CIRCUIT(victim));
|
||||
/* We'll close as a timeout the victim circuit. The rendezvous point
|
||||
* won't keep both circuits, it only keeps the newest (for the same
|
||||
* cookie). */
|
||||
|
@ -209,14 +209,6 @@ struct origin_circuit_t {
|
||||
* no circuits have opened. Used to prevent spamming logs. */
|
||||
unsigned int relaxed_timeout : 1;
|
||||
|
||||
/** Set iff this is a service-side rendezvous circuit for which a
|
||||
* new connection attempt has been launched. We consider launching
|
||||
* a new service-side rend circ to a client when the previous one
|
||||
* fails; now that we don't necessarily close a service-side rend
|
||||
* circ when we launch a new one to the same client, this flag keeps
|
||||
* us from launching two retries for the same failed rend circ. */
|
||||
unsigned int hs_service_side_rend_circ_has_been_relaunched : 1;
|
||||
|
||||
/** What commands were sent over this circuit that decremented the
|
||||
* RELAY_EARLY counter? This is for debugging task 878. */
|
||||
uint8_t relay_early_commands[MAX_RELAY_EARLY_CELLS_PER_CIRCUIT];
|
||||
|
@ -433,16 +433,6 @@ can_relaunch_service_rendezvous_point(const origin_circuit_t *circ)
|
||||
|
||||
/* XXX: Retrying under certain condition. This is related to #22455. */
|
||||
|
||||
/* Avoid to relaunch twice a circuit to the same rendezvous point at the
|
||||
* same time. */
|
||||
if (circ->hs_service_side_rend_circ_has_been_relaunched) {
|
||||
log_info(LD_REND, "Rendezvous circuit to %s has already been retried. "
|
||||
"Skipping retry.",
|
||||
safe_str_client(
|
||||
extend_info_describe(circ->build_state->chosen_exit)));
|
||||
goto disallow;
|
||||
}
|
||||
|
||||
/* We check failure_count >= hs_get_service_max_rend_failures()-1 below, and
|
||||
* the -1 is because we increment the failure count for our current failure
|
||||
* *after* this clause. */
|
||||
@ -684,7 +674,7 @@ hs_circ_service_get_established_intro_circ(const hs_service_intro_point_t *ip)
|
||||
* - We've already retried this specific rendezvous circuit.
|
||||
*/
|
||||
void
|
||||
hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ)
|
||||
hs_circ_retry_service_rendezvous_point(const origin_circuit_t *circ)
|
||||
{
|
||||
tor_assert(circ);
|
||||
tor_assert(TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND);
|
||||
@ -694,10 +684,6 @@ hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Flag the circuit that we are relaunching, to avoid to relaunch twice a
|
||||
* circuit to the same rendezvous point at the same time. */
|
||||
circ->hs_service_side_rend_circ_has_been_relaunched = 1;
|
||||
|
||||
/* Legacy services don't have a hidden service ident. */
|
||||
if (circ->hs_ident) {
|
||||
retry_service_rendezvous_point(circ);
|
||||
|
@ -33,7 +33,7 @@ int hs_circ_launch_intro_point(hs_service_t *service,
|
||||
int hs_circ_launch_rendezvous_point(const hs_service_t *service,
|
||||
const curve25519_public_key_t *onion_key,
|
||||
const uint8_t *rendezvous_cookie);
|
||||
void hs_circ_retry_service_rendezvous_point(origin_circuit_t *circ);
|
||||
void hs_circ_retry_service_rendezvous_point(const origin_circuit_t *circ);
|
||||
|
||||
origin_circuit_t *hs_circ_service_get_intro_circ(
|
||||
const hs_service_intro_point_t *ip);
|
||||
|
@ -3675,6 +3675,9 @@ hs_service_circuit_cleanup_on_close(const circuit_t *circ)
|
||||
hs_metrics_close_established_rdv(
|
||||
&CONST_TO_ORIGIN_CIRCUIT(circ)->hs_ident->identity_pk);
|
||||
break;
|
||||
case CIRCUIT_PURPOSE_S_CONNECT_REND:
|
||||
hs_circ_retry_service_rendezvous_point(CONST_TO_ORIGIN_CIRCUIT(circ));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user