summaryrefslogtreecommitdiff
path: root/src/feature/relay
diff options
context:
space:
mode:
authorAndy <andy@blockbreakers.org>2022-10-06 04:30:18 +0000
committerRoger Dingledine <arma@torproject.org>2022-10-06 00:46:29 -0400
commitd09414858e2f5c5efa2ece4b3a32a6b47374dfdd (patch)
tree6527eb44f1adb4cce274787ecf61c15de706152a /src/feature/relay
parent2dff82dc72fcedea0dc382240ca8d0d09e8d2fa0 (diff)
downloadtor-d09414858e2f5c5efa2ece4b3a32a6b47374dfdd.tar.gz
tor-d09414858e2f5c5efa2ece4b3a32a6b47374dfdd.zip
Properly compute cell-drop overload fraction
Patch to address #40673. An additional check has been added to onion_pending_add() in order to ensure that we avoid counting create cells from clients. In the cpuworker.c assign_onionskin_to_cpuworker method if total_pending_tasks >= max_pending_tasks and channel_is_client(circ->p_chan) returns false then rep_hist_note_circuit_handshake_dropped() will be called and rep_hist_note_circuit_handshake_assigned() will not be called. This causes relays to run into errors due to the fact that the number of dropped packets exceeds the total number of assigned packets. To avoid this situation a check has been added to onion_pending_add() to ensure that these erroneous calls to rep_hist_note_circuit_handshake_dropped() are not made. See the #40673 ticket for the conversation with armadev about this issue.
Diffstat (limited to 'src/feature/relay')
-rw-r--r--src/feature/relay/onion_queue.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/feature/relay/onion_queue.c b/src/feature/relay/onion_queue.c
index 81a655135d..c4d55dc510 100644
--- a/src/feature/relay/onion_queue.c
+++ b/src/feature/relay/onion_queue.c
@@ -36,6 +36,7 @@
#include "feature/stats/rephist.h"
#include "core/or/or_circuit_st.h"
+#include "core/or/channel.h"
/** Type for a linked list of circuits that are waiting for a free CPU worker
* to process a waiting onion handshake. */
@@ -188,7 +189,11 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin)
#define WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL (60)
static ratelim_t last_warned =
RATELIM_INIT(WARN_TOO_MANY_CIRC_CREATIONS_INTERVAL);
- rep_hist_note_circuit_handshake_dropped(queue_idx);
+ if (!channel_is_client(circ->p_chan)) {
+ // Avoid counting create cells from clients, to go with the same
+ // check in command_process_create_cell().
+ rep_hist_note_circuit_handshake_dropped(queue_idx);
+ }
if (queue_idx == ONION_HANDSHAKE_TYPE_NTOR) {
char *m;
if ((m = rate_limit_log(&last_warned, approx_time()))) {