summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesper Jensen <jesper@jnsn.dev>2025-05-04 15:37:24 +0200
committerJesper Jensen <jesper@jnsn.dev>2025-05-04 15:37:24 +0200
commit7c3b61bb097738888285a685cc01f87880b834e6 (patch)
tree64c327b3f3a45efe925e39fcdb179c7188a4ba32
parent222bd168e7be37a662ed8281db1a9b32f0cca7d2 (diff)
Add metric to track next hash expire
-rw-r--r--src/metrics.c10
-rw-r--r--src/metrics.h1
-rw-r--r--src/peers.c16
3 files changed, 23 insertions, 4 deletions
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);
}