[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor] 13/77: hs: Handle multiple rend request per mainloop run
This is an automated email from the git hooks/post-receive script.
dgoulet pushed a commit to branch main
in repository tor.
commit bc9fe5a6f851a0749c141d3f1d4673ac12e3ca39
Author: David Goulet <dgoulet@xxxxxxxxxxxxxx>
AuthorDate: Thu Jun 30 09:53:41 2022 -0400
hs: Handle multiple rend request per mainloop run
Signed-off-by: David Goulet <dgoulet@xxxxxxxxxxxxxx>
---
src/feature/hs/hs_circuit.c | 51 +++++++++++++++++++++++++++++----------------
1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/src/feature/hs/hs_circuit.c b/src/feature/hs/hs_circuit.c
index cbb3e0bfdd..3d9892e482 100644
--- a/src/feature/hs/hs_circuit.c
+++ b/src/feature/hs/hs_circuit.c
@@ -617,32 +617,47 @@ compare_rend_request_by_effort_(const void *_a, const void *_b)
}
}
+/** How many rendezvous request we handle per mainloop event. Per prop327,
+ * handling an INTRODUCE2 cell takes on average 5.56msec on an average CPU and
+ * so it means that launching this max amount of circuits is well below 0.08
+ * seconds which we believe is negligable on the whole mainloop. */
+#define MAX_REND_REQUEST_PER_MAINLOOP 16
+
static void
handle_rend_pqueue_cb(mainloop_event_t *ev, void *arg)
{
- (void) ev; /* Not using the returned event, make compiler happy. */
+ int count = 0;
hs_service_t *service = arg;
hs_pow_service_state_t *pow_state = service->state.pow_state;
- /* Pop next request by effort. */
- pending_rend_t *req =
- smartlist_pqueue_pop(pow_state->rend_request_pqueue,
- compare_rend_request_by_effort_,
- offsetof(pending_rend_t, idx));
-
- log_info(LD_REND, "Dequeued pending rendezvous request with effort: %u. "
- "Remaining requests: %u",
- req->rdv_data.pow_effort,
- smartlist_len(pow_state->rend_request_pqueue));
+ (void) ev; /* Not using the returned event, make compiler happy. */
- /* Launch the rendezvous circuit. */
- launch_rendezvous_point_circuit(service, &req->ip_auth_pubkey,
- &req->ip_enc_key_kp, &req->rdv_data);
+ /* Process rendezvous request until the maximum per mainloop run. */
+ while (smartlist_len(pow_state->rend_request_pqueue) > 0) {
+ if (++count == MAX_REND_REQUEST_PER_MAINLOOP) {
+ break;
+ }
- /* Clean memory. */
- link_specifier_smartlist_free(req->rdv_data.link_specifiers);
- memwipe(req, 0, sizeof(pending_rend_t));
- tor_free(req);
+ /* Pop next request by effort. */
+ pending_rend_t *req =
+ smartlist_pqueue_pop(pow_state->rend_request_pqueue,
+ compare_rend_request_by_effort_,
+ offsetof(pending_rend_t, idx));
+
+ log_info(LD_REND, "Dequeued pending rendezvous request with effort: %u. "
+ "Remaining requests: %u",
+ req->rdv_data.pow_effort,
+ smartlist_len(pow_state->rend_request_pqueue));
+
+ /* Launch the rendezvous circuit. */
+ launch_rendezvous_point_circuit(service, &req->ip_auth_pubkey,
+ &req->ip_enc_key_kp, &req->rdv_data);
+
+ /* Clean memory. */
+ link_specifier_smartlist_free(req->rdv_data.link_specifiers);
+ memwipe(req, 0, sizeof(pending_rend_t));
+ tor_free(req);
+ }
/* If there are still some pending rendezvous circuits in the pqueue then
* reschedule the event in order to continue handling them. */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits