ops: Signal disk-full and eviction capacity pressure #46

Merged
linus merged 3 commits from ops-disk-full-eviction-signal into develop 2026-09-08 13:20:23 -05:00
Showing only changes of commit e3b2b8de1e - Show all commits
+11 -1
View File
@@ -1050,13 +1050,21 @@ func TestP1_03_EvictionAlgorithmsDistinct(t *testing.T) {
// TestDiskOnlyDelayedAttach covers pure disk-only mode (mem=0 + disk>0) hitting the exact delayed attach path. // TestDiskOnlyDelayedAttach covers pure disk-only mode (mem=0 + disk>0) hitting the exact delayed attach path.
// During init window (pre Size barrier), TieredCache has no slow tier so Create returns ErrNotFound (proxy semantics, no disk caching). // During init window (pre Size barrier), TieredCache has no slow tier so Create returns ErrNotFound (proxy semantics, no disk caching).
// Post-barrier + attach, Create succeeds. Uses real temp dir. // Post-barrier + attach, Create succeeds. Uses real temp dir.
// An init hold keeps the empty-dir attach from finishing before the pending assertions (CI race).
func TestDiskOnlyDelayedAttach(t *testing.T) { func TestDiskOnlyDelayedAttach(t *testing.T) {
t.Parallel()
td := t.TempDir() td := t.TempDir()
diskPath := filepath.Join(td, "disk") diskPath := filepath.Join(td, "disk")
if err := os.MkdirAll(diskPath, 0755); err != nil { if err := os.MkdirAll(diskPath, 0755); err != nil {
t.Fatal(err) t.Fatal(err)
} }
hold := make(chan struct{})
var holdOnce sync.Once
closeHold := func() { holdOnce.Do(func() { close(hold) }) }
disk.RegisterInitHold(diskPath, hold)
t.Cleanup(func() {
closeHold()
disk.ClearInitHold(diskPath)
})
// mem=0, disk>0 -> pure disk delayed path (go func) // mem=0, disk>0 -> pure disk delayed path (go func)
sc, err := New("localhost:0", "0", "10MB", diskPath, "", "lru", "lru", 10, 1, "0", nil, "") sc, err := New("localhost:0", "0", "10MB", diskPath, "", "lru", "lru", 10, 1, "0", nil, "")
@@ -1064,6 +1072,7 @@ func TestDiskOnlyDelayedAttach(t *testing.T) {
t.Fatalf("New disk-only: %v", err) t.Fatalf("New disk-only: %v", err)
} }
t.Cleanup(func() { sc.Shutdown() }) t.Cleanup(func() { sc.Shutdown() })
t.Cleanup(closeHold) // before Shutdown: attach is blocked in Size() until the hold closes
// Immediately in window: no slow tier attached yet -> Create must ErrNotFound (proxy, no disk write) // Immediately in window: no slow tier attached yet -> Create must ErrNotFound (proxy, no disk write)
_, err = sc.vfs.Create("during-init-key", 100) _, err = sc.vfs.Create("during-init-key", 100)
@@ -1077,6 +1086,7 @@ func TestDiskOnlyDelayedAttach(t *testing.T) {
t.Errorf("during pending attach, DiskTierReady=%d, want 0", got) t.Errorf("during pending attach, DiskTierReady=%d, want 0", got)
} }
closeHold()
// Wait the barrier (exercises the attach go's Size wait) // Wait the barrier (exercises the attach go's Size wait)
_ = sc.disk.Size() _ = sc.disk.Size()