From 9a0295d156e84eda278c7fc8182bfe465ece5cf4 Mon Sep 17 00:00:00 2001 From: Jinjing <6427696+AmethystLiang@users.noreply.github.com> Date: Sun, 16 Aug 2026 21:44:29 -0700 Subject: [PATCH] test: properly clean up in-flight checkpoints before disposal Release stalled operations, wait for pending checkpoint work to complete, and stop checkpoint timers before disposing the adapter. This prevents abandoned checkpoint tmp/rename operations from recreating files under the temp directory before it's deleted. --- ...n-final-checkpoint-caller-deadline.test.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/daemon/daemon-shutdown-final-checkpoint-caller-deadline.test.ts b/src/main/daemon/daemon-shutdown-final-checkpoint-caller-deadline.test.ts index bf67e77b7de..fdc027c8d62 100644 --- a/src/main/daemon/daemon-shutdown-final-checkpoint-caller-deadline.test.ts +++ b/src/main/daemon/daemon-shutdown-final-checkpoint-caller-deadline.test.ts @@ -68,10 +68,12 @@ describe('STA-4228 keep-history stop bounds only the caller wait on the final ch let server: DaemonServer let adapter: DaemonPtyAdapter let subprocesses: ReturnType[] + let releaseStall: (() => void) | undefined beforeEach(async () => { dir = mkdtempSync(join(tmpdir(), 'orca-final-checkpoint-deadline-')) subprocesses = [] + releaseStall = undefined const log: DaemonFileLog = { log: () => {}, close: () => {} } server = new DaemonServer({ socketPath: getDaemonSocketPath(dir), @@ -92,7 +94,21 @@ describe('STA-4228 keep-history stop bounds only the caller wait on the final ch }) afterEach(async () => { - adapter?.dispose() + // Why before rmSync: a keep-history stop abandons the exclusive checkpoint, and + // that write's tmp/rename will recreate files under the temp tree if we delete it first. + releaseStall?.() + releaseStall = undefined + if (adapter) { + const internals = adapter as unknown as { + checkpointInFlight: Promise | null + stopCheckpointTimer: () => void + } + await internals.checkpointInFlight + internals.stopCheckpointTimer() + await internals.checkpointInFlight + await adapter.getHistoryManager()?.dispose() + adapter.dispose() + } await server?.shutdown() rmSync(dir, { recursive: true, force: true }) }) @@ -106,6 +122,7 @@ describe('STA-4228 keep-history stop bounds only the caller wait on the final ch const stalled = new Promise((resolve) => { release = resolve }) + releaseStall = release vi.spyOn(manager!, 'checkpoint').mockImplementation( async ( sessionId: string,