Skip to content

fix(disk): 按工作量设置整理预算并准确报告占用变化 - #65

Merged
qiyinxi merged 4 commits into
ModAVD:mainfrom
jinghero:fix/95-compact-budget-results
Nov 5, 2026
Merged

qiyinxi merged 4 commits into
ModAVD:mainfrom
jinghero:fix/95-compact-budget-results

Conversation

@jinghero

@jinghero jinghero commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

完成 ModAVD/ModAVD#95 中 compact 的三个子项,不关闭整个 #95。

  • convert/compare 根据工作量增加预算,分别保留 30/20 分钟下限,以虚拟容量覆盖 backing 的完整来宾视图。大小未知时不加自动截止时间,继续响应取消;大小、空间预留和 duration 运算处理溢出。
  • 完成格式、实例状态、快照、backing 与损坏检查后,预计回收不足 max(16 MiB, 宿主占用的 1%) 才跳过重写;缺少分配信息不跳过。返回估算与阈值,明确区分“未知”和合法空盘。
  • 保留 freed_bytes >= 0 和前后占用字段,新增有符号 on_disk_delta_bytes = after - before、skipped 等字段。CLI、GUI、JSON、MCP 可表达增长和跳过;GUI 提供取消整理,并使用后端变化值避免大数相减丢失小增长。

临时镜像通过 check/compare 后,先刷盘,再测量宿主占用,最后检查取消并原子替换;刷盘或测量失败时原盘仍在。正变化值明确表示宿主占用增加。README 和 internal/emu/COMPACT.md 说明大盘预算可达数十小时,正常整理基本不会超时,停止请取消。64 GiB 的 convert/compare 预算约为 54.7/36.5 小时,超时文案改用小时和分钟显示。没有修改磁盘锁、DiskInfo 降级、损坏提示或进程回收实现。

验证使用已有 Go 1.26.5、qemu-img 2.12.0 和独立根、复制的 SDK、镜像、端口。没有启动真实模拟器或生产 adb,未拉取、下载、同步 AOSP。

  • 上游 CI 42004572820 对应最新提交 6e196ee:Windows checks、Ubuntu、macOS 三项均成功,包含 Windows 全量测试、交叉 vet、构建、隐私及作者检查。
  • 本机 scripts/verify_compact.ps1 通过,覆盖大小边界、溢出、收益阈值、未知大小、重复整理、损坏、增长、取消与超时。真实 64 MiB 镜像的宿主占用从 33,947,648 降至 393,216 字节,实际重写释放 32 MiB;重复整理跳过,文件 ID 和全部字节不变。完整来宾读数、backing 数据归属及内容、缺失 backing、损坏 refcount 和原盘保护均已核对。
  • 新增刷盘后测量的受控用例:让临时文件在刷盘完成时增加 1 MiB,旧代码少报该占用,修复后通过。短预算脚本仍以 3 秒测试完整 convert/compare 超时、清理和锁释放;4 项故障注入均被测试失败捕获。4 项浏览器格式测试、三平台 vet、CLI/GUI/客体代理构建、隐私、作者和 diff 检查通过。
  • 在独立临时 worktree 合并 test(emu): 覆盖 compact 对 backing 数据的保留 #56 8d3576e 和最新 fix(disk): 让 qemu-img 随管理器进程结束 #60 0683fa6,自动合并无冲突。组合后的最终验收脚本、test(emu): 覆盖 compact 对 backing 数据的保留 #56 BackingData 及 fix(disk): 让 qemu-img 随管理器进程结束 #60 checkptr=2 生命周期回归通过,未把这些 PR 的实现混入本分支。保留 29018d7 对 DiskInfo JSON 日志的适配。

本机三轮全量未全绿,分别在未修改的 TestLocalFileConcurrent、TestOpsInstanceLifecycle、TestFetchInstallsThenSkips 出现临时目录清理、实例删除或仍看到下载临时文件的问题。本次 compact 回归全部通过;原始 upstream/main 的独立压力复测也复现了相同的 TestOpsInstanceLifecycle 目录非空错误。保留了失败记录,没有改动这些模块或将本机全量报成通过。旧提交 CI 的 TestCollectBootDiagTotal 200 ms 调度断言失败,在新提交 CI 的全量测试和本机单独重复 20 次中通过。

提交及推送前再次 fetch/rebase,upstream/main 仍为 dc6501a,本分支无上游冲突;#63/#64 尚未合并。按 pstack 的影响范围与实测验证流程复查,三个审查建议均已落实。

Refs ModAVD/ModAVD#95

@jinghero jinghero mentioned this pull request Nov 5, 2026
2 of 24 tasks
@jinghero

jinghero commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

六项组合回归中补充了测试日志适配,提交 29018d795c071e9f7e9e55c3bd4fef4ee15ff40b。

#63 将 DiskInfo 的 OnDiskBytes 改成可选指针后,本 PR 真实镜像测试中的 %d 会打印地址,导致诊断数值错误。现在直接序列化 DiskInfo JSON,兼容当前整数和组合后的可选数值。只修改测试日志,没有带入 #63 或其它 PR 的实现。

在原 #65 分支运行 TestCompactBudgetRealImages 通过,六项整合后的重新验证也在进行。此前真实整理和 skip 的功能断言不受该日志错误影响。最终提交、结果和新组合回归工具会汇报到 ModAVD/ModAVD#106。

@qiyinxi

qiyinxi commented Nov 5, 2026

Copy link
Copy Markdown
Member

谢谢!整理的顺序我们逐行核过:拿锁、查快照和后备、量原盘、清遗留临时文件、只读检查、判断是否跳过、查空间、转换、check 加 compare 校验、量新文件、刷盘、再看一次是否取消、最后原子替换,原盘在替换前一直不动;只有拿到确切的已分配大小才会跳过,拿不到就照常重写,不把「不知道」当成空盘;替换后不再去量大小,避免把已经成功的整理报成失败,这几处都比原来好,可以合。几处小建议:(1) 预算按虚拟大小算,64 GB 的盘转换时限约 54 小时、比较约 36 小时,实际上等于不设超时,这也是 #95 允许的做法,但 README / COMPACT.md 最好直接写明「大盘基本不会超时,要停就取消」;超时提示用的是「N 分钟没跑完」,几千分钟读起来不直观,可以按小时显示;(2) 新文件的大小是在刷盘前量的,NTFS 上一般没问题,挪到 syncFile 之后量更稳,代价几乎为零;(3) on_disk_delta_bytes 的注释写的是「positive means more host space」,建议写清「正数表示宿主占用变多」。合并顺序上,#65 和 #63、#64 在 README.md、internal/cli/cli.go、internal/ui/API.md、internal/ui/web/js/actions.js 有文本冲突,等前面的合了再请你 rebase 一次。

@qiyinxi

qiyinxi commented Nov 5, 2026

Copy link
Copy Markdown
Member

#54、#55、#58、#60、#63 和 #51 已经合进 main,接下来请把 #65 和 #57 rebase 到现在的 main 上,两个可以同时做:#65 和 #63 在 README.md、internal/cli/cli.go 有文字冲突;#57 和 #63 在 internal/emu/manager.go 冲突,和 #51 在 internal/guest/readstable_windows_test.go 冲突,那里保留你在 1a2352f 的做法(把建临时目录挪到计时之前),只是改用 #51 引入的 testutil.TempDir(t)。顺带说一下:#51 并 main 以后 CI 正是红在这个测试上,计时里包着建目录、CI 机器上偶尔要一秒多,你这个修法合进来以后就不会再这样。#64 和 #63、#65 都有冲突(README.md、internal/ui/API.md、actions.js),请等 #65 合了再 rebase。推上来、CI 绿了我们就合;管理器 0.4.0 今天 17:00 定稿,到时还没合上的就放到下一版。

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.

2 participants