Skip to content

fix(disk): 整理竞争及时报忙并让磁盘信息安全降级 - #63

Merged
qiyinxi merged 2 commits into
ModAVD:mainfrom
jinghero:fix/95-disk-busy-info
Nov 5, 2026
Merged

qiyinxi merged 2 commits into
ModAVD:mainfrom
jinghero:fix/95-disk-busy-info

Conversation

@jinghero

@jinghero jinghero commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator

Refs ModAVD/ModAVD#95

本 PR 完成三个子项:

  • 整理期间 start、delete、执行桥安装及时返回 busy,提示“正在整理磁盘”。
  • disk info 无法创建或取得锁时返回可读取的文件头和宿主占用,说明降级原因;整理中明确提示“正在整理磁盘”。
  • 损坏盘提示说明 info 的检查范围,并给出备份、恢复、保留副本排查或确认放弃数据后删除重建的处理建议。

compact 先取得实例的 disk 排他锁,再按原顺序取得 start/stop/bridge/create,逆序释放。其它操作在取锁前、失败后以及等待重试时探测 disk。探针使用共享字节锁,彼此不会误报整理;compact 最多等待 100 ms 让短探针结束,其余生命周期锁仍不等待。使用系统锁判断所有权,空锁文件或进程异常结束不会留下永久 busy。

info 没有取得 start 锁就不运行 qemu-img。可读取的大小保留,不可读的数值省略并附 warnings;on_disk_bytes 正常情况下仍是原来的 JSON 数字,只在不可读时省略。CLI、GUI 和 MCP 已适配。GUI 显示诊断原因,不再把 needs_shutdown 一律解释成正在开机。info 只检查文件头、宿主占用,以及有锁的离线 qcow2 元数据,不修复镜像,也不检查客体文件系统。

基于提交前重新抓取的 upstream/main dc6501a,分支 fix/95-disk-busy-info。没有拉取、下载或同步 AOSP。没有改动 compact 的超时、收益判断或结果报告。

验证:

  • 新增独立测试文件覆盖真实子进程持锁、start/delete/bridge 及时返回、普通启动锁、16 轮同时竞争、同实例共享探针并发、不同实例/根互不干扰、部分取锁及打开失败释放、正常退出及强制结束后重试、info 锁失败和不可读文件头降级。
  • 锁相关测试连续 5 轮通过。编译后的 CLI 与独立持锁进程实测,三个冲突操作最终一轮均在 46–437 ms 返回 busy;info 在 47–63 ms 返回降级数据。持锁进程正常退出和被强制结束后,离线 info 均恢复完整检查。
  • 真实 qemu-img compact 集成测试通过。另用独立镜像破坏 qcow2 引用计数,确认 info 给出损坏说明、compact 拒绝整理、原文件字节未改且所有锁释放。
  • 独立的 0.37.1 正式包、SDK 副本、16 GiB 新建实例、27600 端口段完成初始化、真实 compact、再次启动,客体 sys.boot_completed=1,随后正常关机。最终构建复测通过,测试根内进程已退出。
  • Windows Go 1.26.5 的 CLI/GUI/客体代理构建、Windows/Linux amd64/macOS arm64 vet、gofmt、diff、隐私扫描和作者检查通过;node --test scripts/test_disk_info.mjs 两项通过。
  • 按 pstack 的根因、架构、影响范围和实际验证技能审查,修正了排他探针互相误报的问题。4 项 go overlay 反向验证全部被回归测试捕获。

兼容性:

测试限制:

  • 本地三轮全量 go test -p 1 ./... -count=1 均未全绿,分别在未修改测试 TestCreateProgressOnDisk、TestDiskCompactIntegration、TestCreatePlanOfSetup 的 TempDir RemoveAll 阶段报告“目录不是空的”。组合分支同样在 TestCreateSetsUp 清理时失败。没有功能断言失败,也没有修改这些测试的清理逻辑。
  • 对应新建测试在本分支重复 5 次、原始 upstream/main 重复 10 次均通过;原始 main 的 compact 测试重复 3 次通过,本分支最终独立 compact/损坏盘测试也通过。失败日志保留,不把全量结果描述成通过。
  • Linux/macOS 仅做 vet,未做原生运行验证。

@qiyinxi
qiyinxi merged commit fd557e2 into ModAVD:main Nov 5, 2026
3 checks passed
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