From 34db1b6ad1c59abccb07fc17e8546bedece13a48 Mon Sep 17 00:00:00 2001 From: kdletters Date: Tue, 15 Sep 2026 23:27:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E6=B8=85=E7=90=86=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=94=81=E6=97=B6=E8=AF=AF=E5=88=A0=E6=96=B0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用原子重命名隔离失效锁文件 --- scripts/database-backup-to-oss.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/database-backup-to-oss.mjs b/scripts/database-backup-to-oss.mjs index 4b9031410..bc215509f 100644 --- a/scripts/database-backup-to-oss.mjs +++ b/scripts/database-backup-to-oss.mjs @@ -502,8 +502,12 @@ function acquireBackupLock({ workDir, database }) { ) { throw new Error(`已有数据库备份进程持有锁: ${lockPath} pid=${ownerPid}`); } + const staleLockPath = `${lockPath}.stale-${process.pid}-${attempt}-${Date.now()}`; try { - rmSync(lockPath); + // rename 是原子的:若另一个进程已先清理并重新建锁,这里只会得到 ENOENT, + // 不会把新进程的锁误删。 + renameSync(lockPath, staleLockPath); + rmSync(staleLockPath, { force: true }); console.log( `[database-backup] 已清理失效数据库备份锁,准备重新获取: ${lockPath} pid=${ownerPid || ''}`, );