fix(prune): 备份集"同生共死"在用跳过时失效 —— 原来只跳一个文件,兄弟照删

pi 评审 2026-09-14 指出(实测确认):`in_use "$f"` 命中就 `continue`,
只跳过**那一个**文件,同一 `<ts>` 的其余成员照删 ⇒ 备份集被拆开,
与这段自己的注释("拆开留没有意义")相反。

**在删除那一支(`i >= KEEP_DB_BACKUPS`)后果比 pi 说的更难看**:
正在被使用的那个 `in_use` 留了下来,而同一时间戳的 `-wal`/`-shm` 照删 ——
**"留下"的那份要配上被删掉的兄弟才是完整的一套**,所以留下的是**残的**。
(保留那一支的后果轻一些:只拆集,不丢在用文件。)

改法:先算一次整集的在用状态(`set_in_use`),整集一起跳过并报
"★跳过整集(有成员正在被使用)<ts>",`skipped` 按整集成员数计。

干跑实测照常(本机当前 0 项待删、0 项跳过);`bash -n` 通过。
This commit is contained in:
2026-09-14 20:28:50 +08:00
parent 56b9028579
commit 7ec45b8d45

View File

@ -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` —— 只跳过**那一个**,同一 `<ts>` 的其余成员
# 照删。备份集被拆开,与这段自己的注释("拆开留没有意义")相反;
# 在**删除**那一支(`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` 是内存索引,