

























@@ -668,7 +668,7 @@ describe("acquireSessionWriteLock", () => {
668668},
669669{
670670name: "old-live.jsonl.lock",
671-removed: true,
671+removed: false,
672672stale: true,
673673staleReasons: ["too-old"],
674674},
@@ -680,17 +680,82 @@ describe("acquireSessionWriteLock", () => {
680680stale: true,
681681staleReasons: ["dead-pid", "too-old"],
682682},
683+]);
684+685+await expectPathMissing(staleDeadLock);
686+await expect(fs.access(staleAliveLock)).resolves.toBeUndefined();
687+await expect(fs.access(freshAliveLock)).resolves.toBeUndefined();
688+} finally {
689+await fs.rm(root, { recursive: true, force: true });
690+}
691+});
692+693+it("cleans old live .jsonl lock files owned by non-OpenClaw processes", async () => {
694+const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-lock-"));
695+const sessionsDir = path.join(root, "sessions");
696+await fs.mkdir(sessionsDir, { recursive: true });
697+const nowMs = Date.now();
698+const lockPath = path.join(sessionsDir, "old-non-openclaw.jsonl.lock");
699+700+try {
701+await fs.writeFile(
702+lockPath,
703+JSON.stringify({
704+pid: process.pid,
705+createdAt: new Date(nowMs - 120_000).toISOString(),
706+}),
707+"utf8",
708+);
709+710+const result = await cleanStaleLockFiles({
711+ sessionsDir,
712+staleMs: 30_000,
713+ nowMs,
714+removeStale: true,
715+readOwnerProcessArgs: () => ["python", "worker.py"],
716+});
717+718+expect(lockCleanupRecords(result.cleaned)).toEqual([
683719{
684-name: "old-live.jsonl.lock",
720+name: "old-non-openclaw.jsonl.lock",
685721removed: true,
686722stale: true,
687-staleReasons: ["too-old"],
723+staleReasons: ["too-old", "non-openclaw-owner"],
688724},
689725]);
726+await expectPathMissing(lockPath);
727+} finally {
728+await fs.rm(root, { recursive: true, force: true });
729+}
730+});
690731691-await expectPathMissing(staleDeadLock);
692-await expectPathMissing(staleAliveLock);
693-await expect(fs.access(freshAliveLock)).resolves.toBeUndefined();
732+it("does not clean fresh malformed .jsonl lock files during cleanup sweeps", async () => {
733+const root = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-lock-"));
734+const sessionsDir = path.join(root, "sessions");
735+await fs.mkdir(sessionsDir, { recursive: true });
736+const nowMs = Date.now();
737+const lockPath = path.join(sessionsDir, "fresh-malformed.jsonl.lock");
738+739+try {
740+await fs.writeFile(lockPath, "{}", "utf8");
741+742+const result = await cleanStaleLockFiles({
743+ sessionsDir,
744+staleMs: 30_000,
745+ nowMs,
746+removeStale: true,
747+});
748+749+expect(lockCleanupRecords(result.locks)).toEqual([
750+{
751+name: "fresh-malformed.jsonl.lock",
752+removed: false,
753+stale: true,
754+staleReasons: ["missing-pid", "invalid-createdAt"],
755+},
756+]);
757+expect(result.cleaned).toEqual([]);
758+await expect(fs.access(lockPath)).resolves.toBeUndefined();
694759} finally {
695760await fs.rm(root, { recursive: true, force: true });
696761}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。