diff --git a/changes/bug40673 b/changes/bug40673 new file mode 100644 index 0000000000..16763ed258 --- /dev/null +++ b/changes/bug40673 @@ -0,0 +1,7 @@ + o Minor bugfixes (relay overload statistics): + - Count total create cells vs dropped rate cells properly, when + assessing if our fraction of dropped cells is too high. We only + count non-client circuits in the denominator, but we would include + client circuits in the numerator, leading to surprising log lines + claiming that we had dropped more than 100% of incoming create + cells. Fixes bug 40673; bugfix on 0.4.7.1-alpha. 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()))) {