ops: Signal disk-full and eviction capacity pressure
When the disk (or memory) tier is at cap or the volume returns ENOSPC, ops currently look like random misses with no clear "we are dropping data." Count those events as capacity_pressure_events on /metrics and log tier plus reason so operators can tell capacity pressure from a cold cache, without changing the existing evictions counter. Link: #36
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"s1d3sw1ped/steamcache2/steamcache/metrics"
|
||||
"s1d3sw1ped/steamcache2/vfs"
|
||||
)
|
||||
|
||||
@@ -122,6 +123,42 @@ func TestDiskFS_InitPopulatesIndexOnRestart(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDiskFS_CapacityPressureOnEvict(t *testing.T) {
|
||||
t.Parallel()
|
||||
td := t.TempDir()
|
||||
d, err := New(td, 500, nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = d.Size()
|
||||
met := metrics.NewMetrics()
|
||||
d.SetMetrics(met)
|
||||
for i := 0; i < 3; i++ {
|
||||
k := "f" + string(rune('0'+i))
|
||||
w, cerr := d.Create(k, 200)
|
||||
if cerr != nil {
|
||||
t.Fatal(cerr)
|
||||
}
|
||||
if _, werr := w.Write(make([]byte, 200)); werr != nil {
|
||||
t.Fatal(werr)
|
||||
}
|
||||
if cerr := w.Close(); cerr != nil {
|
||||
t.Fatal(cerr)
|
||||
}
|
||||
}
|
||||
evicted := d.EvictLRU(100)
|
||||
if evicted == 0 {
|
||||
t.Fatalf("expected eviction under cap, size=%d cap=%d", d.Size(), d.Capacity())
|
||||
}
|
||||
st := met.GetStats()
|
||||
if st.Evictions == 0 {
|
||||
t.Error("evictions counter not incremented under disk cap pressure")
|
||||
}
|
||||
if st.CapacityPressureEvents == 0 {
|
||||
t.Error("capacity_pressure_events not incremented under disk cap pressure")
|
||||
}
|
||||
}
|
||||
|
||||
func TestDiskFS_EvictAndLazyStat(t *testing.T) {
|
||||
t.Parallel()
|
||||
td := t.TempDir()
|
||||
@@ -138,10 +175,21 @@ func TestDiskFS_EvictAndLazyStat(t *testing.T) {
|
||||
w.Write(make([]byte, 120))
|
||||
w.Close()
|
||||
}
|
||||
met := metrics.NewMetrics()
|
||||
d.SetMetrics(met)
|
||||
ev := d.EvictLRU(200)
|
||||
if ev == 0 {
|
||||
t.Log("no evict (size calc async or snapshot tolerance?)")
|
||||
}
|
||||
if ev > 0 {
|
||||
st := met.GetStats()
|
||||
if st.Evictions == 0 {
|
||||
t.Error("evictions counter not incremented after disk EvictLRU freed bytes")
|
||||
}
|
||||
if st.CapacityPressureEvents == 0 {
|
||||
t.Error("capacity_pressure_events not incremented after disk EvictLRU freed bytes")
|
||||
}
|
||||
}
|
||||
// Explicit post-evict consistency checks: for any key no longer visible via Stat, its on-disk
|
||||
// file must be absent (verifies coordinated unlink + no resurrection via lazy discovery).
|
||||
// Keys still present after this small evict are allowed (accounting tolerance in raw DiskFS).
|
||||
|
||||
Reference in New Issue
Block a user