mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-08-05 20:19:45 +00:00
fix(stats): use age-based GC check to avoid evicting fresh metrics
The millis-since-base staleness check (last > now - 180s) saturated the cutoff to 0 early in process life, so metrics stamped at 0ms failed the strict > 0 test and were wrongly evicted by the immediate first GC tick. Switch to age-based (now - last < 180s), equivalent to the original Instant semantics and robust under clock saturation, which fixes the flaky peer_conn_secure_mode_pubkey_and_encryption test.
This commit is contained in:
@@ -580,7 +580,12 @@ impl StatsManager {
|
||||
// Drop metrics untouched for 180s and with no live handles.
|
||||
// Compare in the millis-since-base domain so neither the hot
|
||||
// path nor GC reconstructs an `Instant` or locks.
|
||||
let cutoff_millis = now_millis().saturating_sub(180_000);
|
||||
//
|
||||
// Use an age-based check (`now - last < STALE`) rather than
|
||||
// `last > now - STALE`: early in process life `now_millis()` is
|
||||
// tiny, so `now - STALE` saturates to 0 and a metric stamped at
|
||||
// 0 would fail a strict `> 0` test and be wrongly evicted.
|
||||
let now = now_millis();
|
||||
|
||||
let Some(counters) = counters_clone.upgrade() else {
|
||||
break;
|
||||
@@ -588,7 +593,7 @@ impl StatsManager {
|
||||
|
||||
counters.retain(|_, metric_data: &mut Arc<MetricData>| {
|
||||
Arc::strong_count(metric_data) > 1
|
||||
|| metric_data.last_updated_millis() > cutoff_millis
|
||||
|| now.saturating_sub(metric_data.last_updated_millis()) < 180_000
|
||||
});
|
||||
counters.shrink_to_fit();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user