tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit a0e72fcb976e38de20bf53629c96a489dc626096
parent c565ef9c58546a815431d575c9ad16fb0bf2dc22
Author: David Goulet <dgoulet@torproject.org>
Date:   Thu,  3 Nov 2022 12:41:21 -0400

metrics: Add running average of CC cwnd when closing circuit

Part of #40708

Signed-off-by: David Goulet <dgoulet@torproject.org>

Diffstat:
Msrc/core/or/circuitlist.c | 14++++++++++++++
Msrc/core/or/circuitlist.h | 3+++
Msrc/feature/relay/relay_metrics.c | 10++++++++++
3 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/src/core/or/circuitlist.c b/src/core/or/circuitlist.c @@ -102,6 +102,8 @@ #include "lib/compress/compress_zstd.h" #include "lib/buf/buffers.h" #include "core/or/congestion_control_common.h" +#include "core/or/congestion_control_st.h" +#include "lib/math/stats.h" #include "core/or/ocirc_event.h" @@ -147,6 +149,11 @@ static void circuit_about_to_free(circuit_t *circ); */ static int any_opened_circs_cached_val = 0; +/** Moving average of the cc->cwnd from each closed circuit. */ +double cc_stats_circ_close_cwnd_ma = 0; +/* Running count of this moving average. Needed so we can update it. */ +static double stats_circ_close_cwnd_ma_count = 0; + /********* END VARIABLES ************/ /* Implement circuit handle helpers. */ @@ -2225,6 +2232,13 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line, /* Notify the HS subsystem that this circuit is closing. */ hs_circ_cleanup_on_close(circ); + /* Update stats. */ + if (circ->ccontrol) { + stats_circ_close_cwnd_ma_count++; + STATS_UPDATE_AVG(cc_stats_circ_close_cwnd_ma, + circ->ccontrol->cwnd, stats_circ_close_cwnd_ma_count); + } + if (circuits_pending_close == NULL) circuits_pending_close = smartlist_new(); diff --git a/src/core/or/circuitlist.h b/src/core/or/circuitlist.h @@ -161,6 +161,9 @@ ((p) == CIRCUIT_PURPOSE_C_GENERAL || \ (p) == CIRCUIT_PURPOSE_C_HSDIR_GET) +/** Stats. */ +extern double cc_stats_circ_close_cwnd_ma; + /** Convert a circuit_t* to a pointer to the enclosing or_circuit_t. Assert * if the cast is impossible. */ or_circuit_t *TO_OR_CIRCUIT(circuit_t *); diff --git a/src/feature/relay/relay_metrics.c b/src/feature/relay/relay_metrics.c @@ -382,6 +382,16 @@ fill_cc_values(void) metrics_format_label("action", "cwnd")); metrics_store_entry_update(sentry, tor_llround(cc_stats_vegas_exit_ss_cwnd_ma)); + + sentry = metrics_store_add(the_store, rentry->type, rentry->name, + rentry->help); + + metrics_store_entry_add_label(sentry, + metrics_format_label("state", "on_circ_close")); + metrics_store_entry_add_label(sentry, + metrics_format_label("action", "cwnd")); + metrics_store_entry_update(sentry, + tor_llround(cc_stats_circ_close_cwnd_ma)); } /** Helper: Fill in single stream metrics output. */