diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-18 13:13:25 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-18 13:13:25 +0300 |
| commit | 550f064f95113e072677b871b7de30ecf25d62b8 (patch) | |
| tree | 03e39a1bed71b4fc16ea62e7956a6268982f15a3 /internal/eventloop_cleanup_test.go | |
| parent | 808c2549bfb17d22388a197d361a07ce0fc8f54f (diff) | |
fix task 45: bound pending handle cleanup
Diffstat (limited to 'internal/eventloop_cleanup_test.go')
| -rw-r--r-- | internal/eventloop_cleanup_test.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/internal/eventloop_cleanup_test.go b/internal/eventloop_cleanup_test.go index 1d3a6fb..7c8604b 100644 --- a/internal/eventloop_cleanup_test.go +++ b/internal/eventloop_cleanup_test.go @@ -3,7 +3,9 @@ package internal import ( "testing" + "ior/internal/event" "ior/internal/file" + "ior/internal/types" ) func TestTracepointEnteredPrunesOldestPendingPairs(t *testing.T) { @@ -88,3 +90,43 @@ func TestProcFdCacheRetainsRecentlyUsedEntries(t *testing.T) { t.Fatalf("proc fd cache metadata size = %d, want 2", got) } } + +func TestPendingHandleTrackerRetainsRecentlyUsedEntries(t *testing.T) { + tracker := newPendingHandleTracker() + tracker.maxCacheSize = 2 + + tracker.set(defaultTid, "/tmp/handle-one") + tracker.set(defaultTid+1, "/tmp/handle-two") + tracker.set(defaultTid+2, "/tmp/handle-three") + + if _, ok := tracker.paths[defaultTid]; ok { + t.Fatalf("expected oldest pending handle to be evicted") + } + if _, ok := tracker.paths[defaultTid+1]; !ok { + t.Fatalf("expected newer pending handle to be retained") + } + if _, ok := tracker.paths[defaultTid+2]; !ok { + t.Fatalf("expected newest pending handle to be retained") + } + if got := len(tracker.pathAges); got != 2 { + t.Fatalf("pending handle metadata size = %d, want 2", got) + } +} + +func TestOpenByHandleAtFailureClearsPendingHandle(t *testing.T) { + el := mustNewEventLoop(t, eventLoopConfig{}) + + _, enterNameRaw := makeEnterPathEvent(t, defaulTime, defaultPid, defaultTid, "/tmp/handle.txt", types.SYS_ENTER_NAME_TO_HANDLE_AT) + el.tracepointEntered(types.NewPathEvent(enterNameRaw)) + _, exitNameRaw := makeExitRetEvent(t, defaulTime+1, defaultPid, defaultTid, types.SYS_EXIT_NAME_TO_HANDLE_AT, 0) + el.tracepointExited(types.NewRetEvent(exitNameRaw), make(chan *event.Pair, 1)) + + _, enterOpenRaw := makeEnterOpenByHandleAtEvent(t, defaulTime+2, defaultPid, defaultTid, 0) + el.tracepointEntered(types.NewOpenByHandleAtEvent(enterOpenRaw)) + _, exitOpenRaw := makeExitRetEvent(t, defaulTime+3, defaultPid, defaultTid, types.SYS_EXIT_OPEN_BY_HANDLE_AT, -1) + el.tracepointExited(types.NewRetEvent(exitOpenRaw), make(chan *event.Pair, 1)) + + if _, ok := el.pendingHandleState().paths[defaultTid]; ok { + t.Fatalf("expected pending handle to be cleared after failed open_by_handle_at") + } +} |
