From 7ec45b8d454d6d6005c7ff800c6c6afb3442eb51 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 14 Sep 2026 20:28:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(prune):=20=E5=A4=87=E4=BB=BD=E9=9B=86"?= =?UTF-8?q?=E5=90=8C=E7=94=9F=E5=85=B1=E6=AD=BB"=E5=9C=A8=E7=94=A8?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=E6=97=B6=E5=A4=B1=E6=95=88=20=E2=80=94?= =?UTF-8?q?=E2=80=94=20=E5=8E=9F=E6=9D=A5=E5=8F=AA=E8=B7=B3=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=96=87=E4=BB=B6=EF=BC=8C=E5=85=84=E5=BC=9F=E7=85=A7?= =?UTF-8?q?=E5=88=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pi 评审 2026-09-14 指出(实测确认):`in_use "$f"` 命中就 `continue`, 只跳过**那一个**文件,同一 `` 的其余成员照删 ⇒ 备份集被拆开, 与这段自己的注释("拆开留没有意义")相反。 **在删除那一支(`i >= KEEP_DB_BACKUPS`)后果比 pi 说的更难看**: 正在被使用的那个 `in_use` 留了下来,而同一时间戳的 `-wal`/`-shm` 照删 —— **"留下"的那份要配上被删掉的兄弟才是完整的一套**,所以留下的是**残的**。 (保留那一支的后果轻一些:只拆集,不丢在用文件。) 改法:先算一次整集的在用状态(`set_in_use`),整集一起跳过并报 "★跳过整集(有成员正在被使用)",`skipped` 按整集成员数计。 干跑实测照常(本机当前 0 项待删、0 项跳过);`bash -n` 通过。 --- deploy/prune-deploy-artifacts.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/deploy/prune-deploy-artifacts.sh b/deploy/prune-deploy-artifacts.sh index 9064903..6be9b9d 100755 --- a/deploy/prune-deploy-artifacts.sh +++ b/deploy/prune-deploy-artifacts.sh @@ -249,8 +249,22 @@ else mapfile -t sets < <(printf '%s\n' "${!SET_MEMBERS[@]}" | sort -r) for i in "${!sets[@]}"; do ts="${sets[$i]}" + # ★ **整集一起判"在用"**,不能只跳那一个文件(pi 评审 2026-09-14 指出,实测确认)。 + # 原先 `in_use "$f"` 命中就 `continue` —— 只跳过**那一个**,同一 `` 的其余成员 + # 照删。备份集被拆开,与这段自己的注释("拆开留没有意义")相反; + # 在**删除**那一支(`i >= KEEP_DB_BACKUPS`)后果更难看:正在被使用的那个留了下来, + # 而同一时间戳的 `-wal`/`-shm` 被删掉 —— **"留"的那份配上被删的兄弟才是完整一套**, + # 结果留下的是残的。所以先算一次整集的在用状态,再决定整集动不动。 + set_in_use=0 + for f in ${SET_MEMBERS[$ts]}; do + if in_use "$f"; then set_in_use=1; break; fi + done + if [ "$set_in_use" -eq 1 ]; then + report " ★跳过整集(有成员正在被使用)" "$ts" + for f in ${SET_MEMBERS[$ts]}; do skipped=$((skipped+1)); done + continue + fi for f in ${SET_MEMBERS[$ts]}; do - if in_use "$f"; then report " ★跳过(正在被使用)" "$f"; skipped=$((skipped+1)); continue; fi if [ "$i" -lt "$KEEP_DB_BACKUPS" ]; then case "$f" in # 保留集里的 `-shm`/`-wal` 是"打开看过一眼"的残渣:`-shm` 是内存索引,