From d56a112e3965e70520916144e09912079e3d5fb9 Mon Sep 17 00:00:00 2001 From: Nathan Hangen Date: Wed, 28 Jan 2026 22:47:09 -0500 Subject: [PATCH] fix: resolve EBADF errors in session-write-lock --- src/agents/session-write-lock.ts | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/agents/session-write-lock.ts b/src/agents/session-write-lock.ts index 832d368a6..c6ac839ea 100644 --- a/src/agents/session-write-lock.ts +++ b/src/agents/session-write-lock.ts @@ -9,7 +9,6 @@ type LockFilePayload = { type HeldLock = { count: number; - handle: fs.FileHandle; lockPath: string; }; @@ -34,13 +33,6 @@ function isAlive(pid: number): boolean { */ function releaseAllLocksSync(): void { for (const [sessionFile, held] of HELD_LOCKS) { - try { - if (typeof held.handle.fd === "number") { - fsSync.closeSync(held.handle.fd); - } - } catch { - // Ignore errors during cleanup - best effort - } try { fsSync.rmSync(held.lockPath, { force: true }); } catch { @@ -131,7 +123,6 @@ export async function acquireSessionWriteLock(params: { current.count -= 1; if (current.count > 0) return; HELD_LOCKS.delete(normalizedSessionFile); - await current.handle.close(); await fs.rm(current.lockPath, { force: true }); }, }; @@ -143,11 +134,15 @@ export async function acquireSessionWriteLock(params: { attempt += 1; try { const handle = await fs.open(lockPath, "wx"); - await handle.writeFile( - JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() }, null, 2), - "utf8", - ); - HELD_LOCKS.set(normalizedSessionFile, { count: 1, handle, lockPath }); + try { + await handle.writeFile( + JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() }, null, 2), + "utf8", + ); + } finally { + await handle.close(); + } + HELD_LOCKS.set(normalizedSessionFile, { count: 1, lockPath }); return { release: async () => { const current = HELD_LOCKS.get(normalizedSessionFile); @@ -155,7 +150,6 @@ export async function acquireSessionWriteLock(params: { current.count -= 1; if (current.count > 0) return; HELD_LOCKS.delete(normalizedSessionFile); - await current.handle.close(); await fs.rm(current.lockPath, { force: true }); }, };