From 7c3b61bb097738888285a685cc01f87880b834e6 Mon Sep 17 00:00:00 2001 From: Jesper Jensen Date: Sun, 4 May 2025 15:37:24 +0200 Subject: Add metric to track next hash expire --- src/metrics.c | 10 ++++++++++ src/metrics.h | 1 + src/peers.c | 16 ++++++++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/metrics.c b/src/metrics.c index de39cdb..eb50f09 100644 --- a/src/metrics.c +++ b/src/metrics.c @@ -11,6 +11,7 @@ prom_counter_t *peers = NULL; prom_gauge_t *current_hashes = NULL; prom_counter_t *hashes = NULL; prom_counter_t *hash_expired = NULL; +prom_gauge_t *hash_next_expire = NULL; prom_counter_t *queries = NULL; prom_counter_t *requests = NULL; prom_histogram_t *offered = NULL; @@ -140,6 +141,15 @@ void metric_init() { ) ); + hash_next_expire = prom_collector_registry_must_register_metric( + prom_gauge_new( + "dht_hashes_next_expire", + "Next time a hash expires", + 0, + NULL + ) + ); + queries = prom_collector_registry_must_register_metric( prom_counter_new( "dht_queries_total", diff --git a/src/metrics.h b/src/metrics.h index 4455800..309177c 100644 --- a/src/metrics.h +++ b/src/metrics.h @@ -13,6 +13,7 @@ extern prom_counter_t *peers; extern prom_gauge_t *current_hashes; extern prom_counter_t *hashes; extern prom_counter_t *hash_expired; +extern prom_gauge_t *hash_next_expire; extern prom_counter_t *queries; extern prom_counter_t *requests; extern prom_histogram_t *offered; diff --git a/src/peers.c b/src/peers.c index d320e30..f9477c6 100644 --- a/src/peers.c +++ b/src/peers.c @@ -130,8 +130,7 @@ int add_peer(struct infohash* infohash, struct addr* peer, time_t now) { peer_status.peers++; prom_counter_inc(peers, NULL); - prom_gauge_set(current_hashes, (double)peer_table_load, NULL); - + peer_update_metrics(); check_duplicates(); return 0; } @@ -151,12 +150,18 @@ void get_peers(struct infohash* infohash, struct addr **peers, size_t *peers_len } void expire_hashes(time_t now) { + time_t next_expire = -1; + assert(peer_table_load < peer_table_size); for(size_t i = 0; i < peer_table_size; i++) { struct peer_entry *entry = &peer_table[i]; if(!entry->set) continue; - if(difftime(now, entry->last_seen + HASH_TIMEOUT) < 0.0) continue; + time_t entry_expire = entry->last_seen + HASH_TIMEOUT; + if(difftime(now, entry_expire) < 0.0) { + next_expire = entry_expire < next_expire ? entry_expire : next_expire; + continue; + } // Find the last hash that collides with us uint64_t entry_hash = hash(&entry->key, peer_table_size); @@ -187,8 +192,9 @@ void expire_hashes(time_t now) { prom_counter_inc(hash_expired, NULL); } + prom_gauge_set(hash_next_expire, next_expire, NULL); + peer_update_metrics(); check_duplicates(); - prom_gauge_set(current_hashes, (double)peer_table_load, NULL); } void peer_update_metrics() { @@ -197,4 +203,6 @@ void peer_update_metrics() { if(peer_table[i].set) continue; if(now < peer_table[i].last_seen) dbg("%d was seen after now? (%ld < %ld)", i, now, peer_table[i].last_seen); } + + prom_gauge_set(current_hashes, (double)peer_table_load, NULL); } -- cgit v1.2.3