Skip to content

Commit e6b8fd6

Browse files
njuboy11steipete
authored andcommitted
fix(session-lock): enforce maxHoldMs in shouldReclaim during lock acquisition
- Adds optional maxHoldMs parameter to inspectLockPayload - Inspect now marks locks as stale when held longer than maxHoldMs - Passes maxHoldMs through inspectLockPayloadForSession - acquireSessionWriteLock's shouldReclaim callback now passes maxHoldMs This ensures that when a live process holds a lock for longer than maxHoldMs (default 5min), other processes can reclaim it during acquisition — matching the watchdog's existing enforcement. Previously shouldReclaim only used staleMs (30min default), meaning a lock held for 10+ minutes by a live PID would never be reclaimable, causing 60s timeout failures and gateway freezes. Closes #85762
1 parent 5c4a733 commit e6b8fd6

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

src/agents/session-write-lock.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ function inspectLockPayload(
449449
payload: LockFilePayload | null,
450450
staleMs: number,
451451
nowMs: number,
452+
maxHoldMs?: number,
452453
): LockInspectionDetails {
453454
const pid = isValidLockNumber(payload?.pid) && payload.pid > 0 ? payload.pid : null;
454455
const pidAlive = pid !== null ? isPidAlive(pid) : false;
@@ -481,6 +482,9 @@ function inspectLockPayload(
481482
} else if (ageMs > staleMs) {
482483
staleReasons.push("too-old");
483484
}
485+
if (typeof maxHoldMs === "number" && ageMs !== null && ageMs > maxHoldMs) {
486+
staleReasons.push("hold-exceeded");
487+
}
484488

485489
return {
486490
pid,
@@ -616,8 +620,9 @@ function inspectLockPayloadForSession(params: {
616620
heldByThisProcess: boolean;
617621
reclaimLockWithoutStarttime: boolean;
618622
readOwnerProcessArgs: SessionLockOwnerProcessArgsReader;
623+
maxHoldMs?: number;
619624
}): LockInspectionDetails {
620-
const inspected = inspectLockPayload(params.payload, params.staleMs, params.nowMs);
625+
const inspected = inspectLockPayload(params.payload, params.staleMs, params.nowMs, params.maxHoldMs);
621626
if (
622627
shouldTreatAsOrphanSelfLock({
623628
payload: params.payload,
@@ -770,6 +775,7 @@ export async function acquireSessionWriteLock(params: {
770775
heldByThisProcess,
771776
reclaimLockWithoutStarttime: true,
772777
readOwnerProcessArgs: readProcessArgsSync,
778+
maxHoldMs,
773779
});
774780
return await shouldReclaimContendedLockFile(lockPath, inspected, staleMs, nowMs);
775781
},

0 commit comments

Comments
 (0)