fix(qa): clean failed Parallels package locks · openclaw/openclaw@85f552b
vincentkoc
·
2026-06-21
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -194,18 +194,27 @@ async function withPackageLock<T>(lockDir: string, fn: () => Promise<T>): Promis
|
194 | 194 | } |
195 | 195 | } |
196 | 196 | |
197 | | -async function acquirePackageLock(lockDir: string, ownerToken: string): Promise<void> { |
| 197 | +async function acquirePackageLock( |
| 198 | +lockDir: string, |
| 199 | +ownerToken: string, |
| 200 | +params: { writeOwner?: (lockDir: string, ownerToken: string) => Promise<void> } = {}, |
| 201 | +): Promise<void> { |
198 | 202 | const timeoutMs = readPositiveIntEnv("OPENCLAW_PARALLELS_PACKAGE_LOCK_TIMEOUT_MS", 30 * 60_000); |
199 | 203 | const staleMs = readPositiveIntEnv("OPENCLAW_PARALLELS_PACKAGE_LOCK_STALE_MS", 2 * 60 * 60_000); |
200 | 204 | const startedAt = Date.now(); |
201 | 205 | let waitAnnouncementBudget = 1; |
202 | 206 | const consumeWaitAnnouncement = () => waitAnnouncementBudget-- > 0; |
203 | 207 | while (Date.now() - startedAt < timeoutMs) { |
| 208 | +let createdLockDir = false; |
204 | 209 | try { |
205 | 210 | await mkdir(lockDir); |
206 | | -await writeLockOwner(lockDir, ownerToken); |
| 211 | +createdLockDir = true; |
| 212 | +await (params.writeOwner ?? writeLockOwner)(lockDir, ownerToken); |
207 | 213 | return; |
208 | 214 | } catch (error) { |
| 215 | +if (createdLockDir) { |
| 216 | +await rm(lockDir, { force: true, recursive: true }).catch(() => undefined); |
| 217 | +} |
209 | 218 | if (!isErrorCode(error, "EEXIST")) { |
210 | 219 | throw error; |
211 | 220 | } |
@@ -292,6 +301,7 @@ async function delay(ms: number): Promise<void> {
|
292 | 301 | } |
293 | 302 | |
294 | 303 | export const testing = { |
| 304 | + acquirePackageLock, |
295 | 305 | removeStalePackageLock, |
296 | 306 | readLockOwner, |
297 | 307 | }; |
| Original file line number | Diff line number | Diff line change |
|---|
@@ -474,6 +474,22 @@ describe("Parallels smoke model selection", () => {
|
474 | 474 | expect(existsSync(lockDir)).toBe(false); |
475 | 475 | }); |
476 | 476 | |
| 477 | +it("removes a just-created package lock when owner writing fails", async () => { |
| 478 | +const parentDir = makeTempDir(tempDirs, "openclaw-parallels-package-lock-parent-"); |
| 479 | +const lockDir = join(parentDir, "package.lock"); |
| 480 | +const error = new Error("failed to write owner"); |
| 481 | + |
| 482 | +await expect( |
| 483 | +packageArtifactTesting.acquirePackageLock(lockDir, "owner-token", { |
| 484 | +writeOwner: async () => { |
| 485 | +throw error; |
| 486 | +}, |
| 487 | +}), |
| 488 | +).rejects.toBe(error); |
| 489 | + |
| 490 | +expect(existsSync(lockDir)).toBe(false); |
| 491 | +}); |
| 492 | + |
477 | 493 | it("keeps JSON-mode progress off stdout", async () => { |
478 | 494 | const stdoutWrite = vi.spyOn(process.stdout, "write").mockImplementation(() => true); |
479 | 495 | const stderrWrite = vi.spyOn(process.stderr, "write").mockImplementation(() => true); |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。