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:
@ -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` 是内存索引,
|
||||
|
||||
Reference in New Issue
Block a user