Skip to content

fix: 宿主 logcat 每 256 MiB 切分并纳入现有清理 - #57

Merged
qiyinxi merged 3 commits into
ModAVD:mainfrom
jinghero:fix/97-logcat-rotation
Nov 5, 2026
Merged

qiyinxi merged 3 commits into
ModAVD:mainfrom
jinghero:fix/97-logcat-rotation

Conversation

@jinghero

@jinghero jinghero commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

Refs ModAVD/ModAVD#97

仅完成正文末尾“顺带”第 1 项:宿主正在写入的 logcat 每 256 MiB 切分。诊断模式开关、collect.go、执行桥日志归类和模拟器临时文件清理不在本 PR 范围内。

根目录的 tools/modavd.exe __logcat 持有 adb 输出管道和当前文件,启动 CLI 或管理器退出后仍继续采集。它绑定这次开机的 qemu PID 和创建时间;qemu 退出时主动结束自己的 adb 子进程、关闭文件并退出,避免遗留采集占用管理器程序、阻止整包更新。删除实例也会清掉新增的 .logcat.lock。

达到 268,435,456 字节后在下一处换行切分,同一条 adb 输出流接着写。新文件打开后再关旧段,然后调用现有清理规则:每台保留最新 10 份关闭的 logcat,关闭日志合计上限 1 GiB,当前写入文件受保护且不计入。保留现有时间戳命名,独占创建避免覆盖。按审查要求移除了实机脚本,PR 只保留单测和代码。

功能修复为 3ed1b41,最新提交 1a2352f 仅修正既有单测的计时范围:

  • Go 1.26.5 的串行全量 go test -p 1 ./... -count=1 和最终默认并行全量 go test ./... -count=1 均通过;系统默认临时目录下 go test ./internal/emu -run '^TestLogcat' -count=20 连续 20 轮通过。三平台 vet、CLI/GUI 构建、隐私扫描、作者检查、gofmt 和脚本测试通过。
  • 单测覆盖小阈值连续切分、完整序号流、按份数和总量清理、活跃句柄保护、多实例、同秒重开、CLI 退出后持续采集、写入失败清理,以及 qemu 退出时结束永不自行退出的 adb、释放文件和锁。禁用 qemu 监视的反向验证会被新回归测试捕获。
  • 实机使用独立根、实例、复制的 SDK 和 27000–27099 端口段。CLI 开机进程退出后,190,000 条编号日志跨真实 256 MiB 阈值连续切分两次,关闭段分别为 268,436,619 / 268,435,896 字节,无丢行或重复;切分期间 adb PID 不变,切分后继续写入,停机重开只有一份活跃采集。
  • 管理器验证使用真实 ModAVD.exe 的已认证 HTTP 接口发起带窗口开机,确认采集镜像为根目录的 tools/modavd.exe。随后结束管理器进程,采集仍能写入新标记。
  • 该次正常关机中,采集进程在 17:46:13.891 退出,qemu 在 17:46:16.146 退出,采集早 2.255 秒退出;stop 返回时两者都已结束。没有额外清理等待,立即调用 update install,成功将已校验的正式包从 0.37.0 安装到 0.37.1,返回 updated=true,没有被采集占用阻挡。测试实例和私有 adb server 最终均已停止。

已按 pstack 的 root-causes、blast-radius 和 prove-it-works 技能复审,未留下已知的待修发现。

3ed1b41 的 Ubuntu/macOS CI 通过,Windows 在既有 guest.TestReadStableWaitsForSharingViolation 失败。该测试把 t.TempDir() 的准备耗时混入缺失文件读取的 40 ms 限制;1a2352f 将路径准备移出计时,保留原断言,重复 100 轮及最终全量通过。最新提交 1a2352f 的 远端 CI Windows、Ubuntu、macOS 三项全部通过。

本机此前并发测试曾遇到 Windows 临时目录清理错误 145 和 adb 的 1 秒超时波动。此次完整复测通过;持续清理失败仍会使测试失败,没有改动全局测试基础设施。

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

qiyinxi commented Nov 5, 2026

Copy link
Copy Markdown
Member

满 256 MiB 后在换行处切分、新文件开好了再关旧文件、正在写的文件不算进份数和总量,这几处都对。要改一处:现在每台运行中的实例都多了一个常驻的 modavd.exe __logcat 进程(从管理器开机时是 ModAVD.exe __logcat),一直活到 adb logcat 退出为止。整包更新在换文件之前,会把根目录里还在运行的 ModAVD.exe、tools\modavd.exe 都当成占用,拒绝更新(internal/update/swap.go 的 processesUsing);而 logs.go 里也记着,实例重新登记以后,旧的 adb logcat 客户端不一定会退。只要有一个这样的采集进程没退,实例全关了也更新不了,用户还很难看出是谁占着。建议让采集进程跟着这台的 qemu 走:开机时把 qemu 的 PID 传给它,qemu 退出以后,它先结束自己的 adb 子进程再退出,开机守护已经是这么做的。另外有两处 P3:一是拉起采集进程时用根目录下的 tools\modavd.exe,不用 os.Executable(),免得管理器关掉以后任务管理器里还留着 ModAVD.exe;二是删实例时 removeLockFiles 也要清掉新加的 .mas_<i>.logcat.lock。scripts/test_logcat_rotation.ps1 是实机脚本,和 #54 一样,请从这个 PR 里拿掉,要留可以放进 ModAVDE2E。改完以后请在 PR 说明里补上这几种情况的实机结果:命令行开机后直接退出、从管理器开机、关机后采集进程几秒内退出、关机后马上更新不被挡住。

1 similar comment
@qiyinxi

qiyinxi commented Nov 5, 2026

Copy link
Copy Markdown
Member

满 256 MiB 后在换行处切分、新文件开好了再关旧文件、正在写的文件不算进份数和总量,这几处都对。要改一处:现在每台运行中的实例都多了一个常驻的 modavd.exe __logcat 进程(从管理器开机时是 ModAVD.exe __logcat),一直活到 adb logcat 退出为止。整包更新在换文件之前,会把根目录里还在运行的 ModAVD.exe、tools\modavd.exe 都当成占用,拒绝更新(internal/update/swap.go 的 processesUsing);而 logs.go 里也记着,实例重新登记以后,旧的 adb logcat 客户端不一定会退。只要有一个这样的采集进程没退,实例全关了也更新不了,用户还很难看出是谁占着。建议让采集进程跟着这台的 qemu 走:开机时把 qemu 的 PID 传给它,qemu 退出以后,它先结束自己的 adb 子进程再退出,开机守护已经是这么做的。另外有两处 P3:一是拉起采集进程时用根目录下的 tools\modavd.exe,不用 os.Executable(),免得管理器关掉以后任务管理器里还留着 ModAVD.exe;二是删实例时 removeLockFiles 也要清掉新加的 .mas_<i>.logcat.lock。scripts/test_logcat_rotation.ps1 是实机脚本,和 #54 一样,请从这个 PR 里拿掉,要留可以放进 ModAVDE2E。改完以后请在 PR 说明里补上这几种情况的实机结果:命令行开机后直接退出、从管理器开机、关机后采集进程几秒内退出、关机后马上更新不被挡住。

@jinghero

jinghero commented Nov 5, 2026

Copy link
Copy Markdown
Collaborator Author

已按这条审查完成修复,提交 3ed1b41、1a2352f。

采集现绑定 qemu PID 和创建时间,qemu 退出时通过命令上下文结束自己的 adb 并退出;统一使用根目录的 tools/modavd.exe,删除实例也清理 logcat 锁。实机脚本已移出 PR。

PR 正文已补齐修复版实测:CLI 退出后继续采集;实际 ModAVD.exe 的认证 HTTP 接口发起带窗口开机、结束管理器后继续落盘;正常关机时采集早于 qemu 约 2.255 秒退出;stop 返回后立即安装,成功从 0.37.0 更新到 0.37.1,没有采集占用阻挡。真实 256 MiB 两次切分及 190,000 条编号校验也已重跑通过。

新增了 adb 不自行退出时由 qemu 退出触发清理的回归测试,并验证禁用该监视会使测试失败。另修正 Windows CI 暴露的既有 guest 单测计时范围问题,重复 100 轮通过。最新提交的 Windows、Ubuntu、macOS CI 全部通过。

@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 定稿,到时还没合上的就放到下一版。

@jinghero
jinghero force-pushed the fix/97-logcat-rotation branch from 1a2352f to b0fa8ec Compare November 5, 2026 13:19
@qiyinxi
qiyinxi merged commit 214b74a into ModAVD:main Nov 5, 2026
4 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