fix(backup): 修复差异/清单设计评审发现的三处问题#92
Merged
Merged
Conversation
1) 数据完整性:手动删除被差异备份依赖的全量记录会使这些差异无法恢复
(保留清理已有链保护,手动删除却没有)。DeleteRecord 现拒绝删除仍有成功差异
依赖的全量;新增 CountDependentDifferentials 仓储方法(接口+实现+测试桩)。
2) 性能:清单(Manifest)TEXT 列被每次列表查询拖出——保留清理会加载某任务全部
成功记录的清单却根本不需要。List/ListRecent/ListByTask/ListSuccessfulByTask 改为
Omit("Manifest");差异基线改按需经 FindByID 加载清单(FindByID 仍保留清单,
内容浏览不受影响)。
3) 句柄泄漏:FileRunner.Run 打包大目录时 defer file.Close() 累积至整次备份结束,
大目录树可能耗尽文件描述符。改为每文件独立作用域即时关闭。
测试:新增仓储层单测覆盖清单省略(列表省略/FindByID 保留)与差异依赖计数
(仅成功且依赖该全量者计入);go test ./... 全绿。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
对本会话差异备份/清单相关代码做了一次自我设计评审,修复其中三处实质问题(含我自己引入的)。
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 版本Omit对Find生效。3. 句柄泄漏 —
FileRunner.Run打包时
defer file.Close()位于filepath.Walk回调内,导致所有打开的文件直到整次备份结束才关闭,大目录树可能耗尽文件描述符(既有问题,但差异/浏览让Run更核心)。修复:每个文件在独立作用域内打开-拷贝-关闭,句柄即时释放。
测试
FindByID保留)、差异依赖计数(仅「成功且依赖该全量」计入)go test ./...19 包全绿;gofmt干净