Skip to content

fix(backup): 修复差异/清单设计评审发现的三处问题#92

Merged
Awuqing merged 1 commit into
mainfrom
fix/manifest-design-issues
May 28, 2026
Merged

fix(backup): 修复差异/清单设计评审发现的三处问题#92
Awuqing merged 1 commit into
mainfrom
fix/manifest-design-issues

Conversation

@Awuqing

@Awuqing Awuqing commented May 28, 2026

Copy link
Copy Markdown
Owner

对本会话差异备份/清单相关代码做了一次自我设计评审,修复其中三处实质问题(含我自己引入的)。

1. 数据完整性 — 手动删除可孤立差异链

保留清理通过 protectDifferentialBases 保护「仍被差异依赖的全量」,但手动删除DeleteRecord,UI 删除按钮)此前只挡 Locked,不挡差异依赖 → 删掉基线全量会让其差异无法恢复
修复DeleteRecord 现拒绝删除仍有成功差异依赖的全量;新增 CountDependentDifferentials 仓储方法(接口 + GORM 实现 + 保留测试桩)。单/批量删除均经 DeleteRecord,一处即覆盖。

2. 性能 — 清单被每次列表查询拖出

清单(Manifest)作为 BackupRecord 的 TEXT 列,ListSuccessfulByTask(保留清理 + 差异基线解析,无 LIMIT)会把某任务全部成功记录的清单 JSON 读入内存——而保留清理根本不需要清单。大目录树(10 万文件 ≈ ~10MB/全量)× 多份保留 = 每次清理读取数百 MB 无用数据。
修复List/ListRecent/ListByTask/ListSuccessfulByTask 一律 Omit("Manifest");差异基线解析改为定位最近全量后经 FindByID 按需加载其清单(FindByID 仍保留清单列,内容浏览/差异比对不受影响)。已实测当前 GORM 版本 OmitFind 生效。

3. 句柄泄漏 — FileRunner.Run

打包时 defer file.Close() 位于 filepath.Walk 回调内,导致所有打开的文件直到整次备份结束才关闭,大目录树可能耗尽文件描述符(既有问题,但差异/浏览让 Run 更核心)。
修复:每个文件在独立作用域内打开-拷贝-关闭,句柄即时释放。

测试

  • 新增仓储层单测:清单省略(列表省略、FindByID 保留)、差异依赖计数(仅「成功且依赖该全量」计入)
  • go test ./... 19 包全绿;gofmt 干净

说明:本次因开发机磁盘一度写满,验证延后到磁盘释放后完成;现已本地全量 build + test 通过。

1) 数据完整性:手动删除被差异备份依赖的全量记录会使这些差异无法恢复
   (保留清理已有链保护,手动删除却没有)。DeleteRecord 现拒绝删除仍有成功差异
   依赖的全量;新增 CountDependentDifferentials 仓储方法(接口+实现+测试桩)。
2) 性能:清单(Manifest)TEXT 列被每次列表查询拖出——保留清理会加载某任务全部
   成功记录的清单却根本不需要。List/ListRecent/ListByTask/ListSuccessfulByTask 改为
   Omit("Manifest");差异基线改按需经 FindByID 加载清单(FindByID 仍保留清单,
   内容浏览不受影响)。
3) 句柄泄漏:FileRunner.Run 打包大目录时 defer file.Close() 累积至整次备份结束,
   大目录树可能耗尽文件描述符。改为每文件独立作用域即时关闭。

测试:新增仓储层单测覆盖清单省略(列表省略/FindByID 保留)与差异依赖计数
(仅成功且依赖该全量者计入);go test ./... 全绿。
@Awuqing Awuqing merged commit 51e4b0b into main May 28, 2026
6 checks passed
@Awuqing Awuqing deleted the fix/manifest-design-issues branch May 28, 2026 05:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant