summaryrefslogtreecommitdiff
path: root/src/feature
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2022-07-01 16:29:46 -0400
committerMicah Elizabeth Scott <beth@torproject.org>2023-05-10 07:37:11 -0700
commita575e35c17d49bd830a9a1814ad9a3b122df9f08 (patch)
tree40e157252f93fbeaf6cfd8aaf537708eaa8e36f2 /src/feature
parent13f62582456cc9e7f1e8fd5993dd0e33b7da196b (diff)
downloadtor-a575e35c17d49bd830a9a1814ad9a3b122df9f08.tar.gz
tor-a575e35c17d49bd830a9a1814ad9a3b122df9f08.zip
sort pqueue ties by time-added
our pqueue implementation does bizarre unspecified things with ordering of elements that are equal. it certainly doesn't do any sort of "first in first out" property that i was expecting. now make it explicit by saying that "equal-effort, added-earlier" is higher priority.
Diffstat (limited to 'src/feature')
-rw-r--r--src/feature/hs/hs_circuit.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/feature/hs/hs_circuit.c b/src/feature/hs/hs_circuit.c
index c5eb22d5cd..6b8d87351c 100644
--- a/src/feature/hs/hs_circuit.c
+++ b/src/feature/hs/hs_circuit.c
@@ -624,6 +624,11 @@ compare_rend_request_by_effort_(const void *_a, const void *_b)
if (a->rdv_data.pow_effort > b->rdv_data.pow_effort) {
return -1;
} else if (a->rdv_data.pow_effort == b->rdv_data.pow_effort) {
+ /* tie-breaker! use the time it was added to the queue. older better. */
+ if (a->enqueued_ts < b->enqueued_ts)
+ return -1;
+ if (a->enqueued_ts > b->enqueued_ts)
+ return 1;
return 0;
} else {
return 1;
@@ -780,8 +785,10 @@ handle_rend_pqueue_cb(mainloop_event_t *ev, void *arg)
offsetof(pending_rend_t, idx));
log_notice(LD_REND, "Dequeued pending rendezvous request with effort: %u. "
+ "Waited %d. "
"Remaining requests: %u",
req->rdv_data.pow_effort,
+ (int)(now - req->enqueued_ts),
smartlist_len(pow_state->rend_request_pqueue));
if (queued_rend_request_is_too_old(req, now)) {