mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-08 04:22:54 +00:00
Report live-owned stale session locks as typed acquisition failures instead of auto-removing them, while preserving safe reclaim for dead/orphaned lock files. Propagate stale lock acquisition through embedded runner takeover handling, failover/cache/delivery classifiers, and QA retry detection. Refs #87779
64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
const SESSION_WRITE_LOCK_TIMEOUT_CODE = "OPENCLAW_SESSION_WRITE_LOCK_TIMEOUT";
|
|
const SESSION_WRITE_LOCK_STALE_CODE = "OPENCLAW_SESSION_WRITE_LOCK_STALE";
|
|
|
|
export class SessionWriteLockTimeoutError extends Error {
|
|
readonly code = SESSION_WRITE_LOCK_TIMEOUT_CODE;
|
|
readonly timeoutMs: number;
|
|
readonly owner: string;
|
|
readonly lockPath: string;
|
|
|
|
constructor(params: { timeoutMs: number; owner: string; lockPath: string }) {
|
|
super(
|
|
`session file locked (timeout ${params.timeoutMs}ms): ${params.owner} ${params.lockPath}`,
|
|
);
|
|
this.name = "SessionWriteLockTimeoutError";
|
|
this.timeoutMs = params.timeoutMs;
|
|
this.owner = params.owner;
|
|
this.lockPath = params.lockPath;
|
|
}
|
|
}
|
|
|
|
export class SessionWriteLockStaleError extends Error {
|
|
readonly code = SESSION_WRITE_LOCK_STALE_CODE;
|
|
readonly owner: string;
|
|
readonly lockPath: string;
|
|
readonly staleReasons: string[];
|
|
|
|
constructor(params: { owner: string; lockPath: string; staleReasons?: string[] }) {
|
|
const staleReasons = params.staleReasons?.length ? params.staleReasons : ["unknown"];
|
|
super(
|
|
`session file lock stale (${staleReasons.join(", ")}): ${params.owner} ${params.lockPath}`,
|
|
);
|
|
this.name = "SessionWriteLockStaleError";
|
|
this.owner = params.owner;
|
|
this.lockPath = params.lockPath;
|
|
this.staleReasons = staleReasons;
|
|
}
|
|
}
|
|
|
|
export function isSessionWriteLockTimeoutError(err: unknown): boolean {
|
|
return (
|
|
err instanceof SessionWriteLockTimeoutError ||
|
|
Boolean(
|
|
err &&
|
|
typeof err === "object" &&
|
|
(err as { code?: unknown }).code === SESSION_WRITE_LOCK_TIMEOUT_CODE,
|
|
)
|
|
);
|
|
}
|
|
|
|
export function isSessionWriteLockStaleError(err: unknown): boolean {
|
|
return (
|
|
err instanceof SessionWriteLockStaleError ||
|
|
Boolean(
|
|
err &&
|
|
typeof err === "object" &&
|
|
(err as { code?: unknown }).code === SESSION_WRITE_LOCK_STALE_CODE,
|
|
)
|
|
);
|
|
}
|
|
|
|
export function isSessionWriteLockAcquireError(err: unknown): boolean {
|
|
return isSessionWriteLockTimeoutError(err) || isSessionWriteLockStaleError(err);
|
|
}
|