]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Implement rate limiting metrics.
authorGeorge Kadianakis <desnacked@riseup.net>
Tue, 9 Mar 2021 13:41:11 +0000 (15:41 +0200)
committerGeorge Kadianakis <desnacked@riseup.net>
Wed, 17 Mar 2021 16:22:38 +0000 (18:22 +0200)
src/core/mainloop/connection.c

index 9e3a343530804b09c5fa4c964a8287a8e2842b97..5ed0ba9aa6431cdf0846c3dd7cc97ffb579915ca 100644 (file)
@@ -3439,6 +3439,16 @@ connection_bucket_read_limit(connection_t *conn, time_t now)
   int priority = conn->type != CONN_TYPE_DIR;
   ssize_t conn_bucket = -1;
   size_t global_bucket_val = token_bucket_rw_get_read(&global_bucket);
+  if (global_bucket_val == 0) {
+    /* We reached our global read limit: count this as an overload.
+     *
+     * The token bucket is always initialized (see connection_bucket_init() and
+     * options_validate_relay_bandwidth()) and hence we can assume that if the
+     * token ever hits zero, it's a limit that got popped and not the bucket
+     * being uninitialized.
+     */
+    rep_hist_note_overload(OVERLOAD_READ);
+  }
 
   if (connection_speaks_cells(conn)) {
     or_connection_t *or_conn = TO_OR_CONN(conn);
@@ -3469,6 +3479,11 @@ connection_bucket_write_limit(connection_t *conn, time_t now)
   int priority = conn->type != CONN_TYPE_DIR;
   size_t conn_bucket = buf_datalen(conn->outbuf);
   size_t global_bucket_val = token_bucket_rw_get_write(&global_bucket);
+  if (global_bucket_val == 0) {
+    /* We reached our global write limit: We should count this as an overload.
+     * See above function for more information */
+    rep_hist_note_overload(OVERLOAD_WRITE);
+  }
 
   if (!connection_is_rate_limited(conn)) {
     /* be willing to write to local conns even if our buckets are empty */