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` 是内存索引,