This is an automated email from the git hooks/post-receive script.
dgoulet pushed a commit to branch main in repository tor.
commit 78c184d2fe2c5f14da8c65166521c7291225b5bc Author: David Goulet dgoulet@torproject.org AuthorDate: Wed Oct 19 15:27:22 2022 -0400
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 --- src/core/or/circuituse.c | 1 - src/core/or/origin_circuit_st.h | 8 -------- src/feature/hs/hs_circuit.c | 16 +--------------- src/feature/hs/hs_circuit.h | 2 +- src/feature/hs/hs_service.c | 3 +++ 5 files changed, 5 insertions(+), 25 deletions(-)
diff --git a/src/core/or/circuituse.c b/src/core/or/circuituse.c index acb9a7fba1..dbeea10821 100644 --- a/src/core/or/circuituse.c +++ b/src/core/or/circuituse.c @@ -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). */ diff --git a/src/core/or/origin_circuit_st.h b/src/core/or/origin_circuit_st.h index 2cd8a33abc..73b971f72d 100644 --- a/src/core/or/origin_circuit_st.h +++ b/src/core/or/origin_circuit_st.h @@ -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]; diff --git a/src/feature/hs/hs_circuit.c b/src/feature/hs/hs_circuit.c index 42d3bedc3e..53855d40a9 100644 --- a/src/feature/hs/hs_circuit.c +++ b/src/feature/hs/hs_circuit.c @@ -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); diff --git a/src/feature/hs/hs_circuit.h b/src/feature/hs/hs_circuit.h index 808e648951..afbff7b894 100644 --- a/src/feature/hs/hs_circuit.h +++ b/src/feature/hs/hs_circuit.h @@ -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); diff --git a/src/feature/hs/hs_service.c b/src/feature/hs/hs_service.c index ff34e5dc44..1caa5ab64a 100644 --- a/src/feature/hs/hs_service.c +++ b/src/feature/hs/hs_service.c @@ -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; }