fix: release session locks on process termination
Adds cleanup handlers to release held file locks when the process terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned lock files that would block future sessions. Fixes #1951
This commit is contained in:
parent
e0adf65dac
commit
35fc2a1120
@ -14,6 +14,32 @@ type HeldLock = {
|
||||
|
||||
const HELD_LOCKS = new Map<string, HeldLock>();
|
||||
|
||||
/**
|
||||
* Release all held locks - called on process exit to prevent orphaned locks
|
||||
*/
|
||||
async function releaseAllLocks(): Promise<void> {
|
||||
const locks = Array.from(HELD_LOCKS.values());
|
||||
HELD_LOCKS.clear();
|
||||
for (const lock of locks) {
|
||||
try {
|
||||
await lock.handle.close();
|
||||
await fs.rm(lock.lockPath, { force: true });
|
||||
} catch {
|
||||
// Best effort cleanup
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Register cleanup handlers to release locks on unexpected termination
|
||||
process.on("exit", releaseAllLocks);
|
||||
process.on("SIGTERM", () => {
|
||||
void releaseAllLocks().then(() => process.exit(0));
|
||||
});
|
||||
process.on("SIGINT", () => {
|
||||
void releaseAllLocks().then(() => process.exit(0));
|
||||
});
|
||||
// Note: unhandledRejection handler will call process.exit() which triggers 'exit'
|
||||
|
||||
function isAlive(pid: number): boolean {
|
||||
if (!Number.isFinite(pid) || pid <= 0) return false;
|
||||
try {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user