Repository navigation
v1.2.1
修复
排查「本月累计空白」时,顺带查出并修掉了两个数据正确性问题。它们都不是界面问题,而是宿主半边读会话日志时的缺陷。
1. 会话日志被重写时,旧数据会和新数据叠加
读取器靠 文件大小 < 已读偏移 来判断日志是否被重写(压缩、格式迁移都会重写)。但重写后的文件完全可能比原来更大——这时判断不成立,于是从旧偏移继续读。如果偏移恰好落在帧边界上,扫描不会报错,新内容就被静默地加到旧内容上。
测试里精确复现了这一点:把已索引的文件重写成另一份更大的内容后,合计变成 514(旧 500 + 新 7 + 7),而正确答案是 21。
修复方式是在每次读取前校验「已消费前缀的末尾 32 字节」是否仍然一致(编译后的帧让偶然相同几乎不可能)。不一致就判定为重写,从头重读。代价是每轮每个变化的文件多一次 32 字节的小读取。
2. 诊断信息里的错误永不消失
lastError 只写不清,一次瞬时失败之后它会永远挂在诊断里,让健康的索引看起来是坏的。这正是这次排查一开始把我引偏的原因——它报告的那个「解压失败」文件,当前其实完全正常。
现在每一轮扫描收集自己的错误并在结束时统一发布,干净的一轮会把上一次的错误清掉。
3. 短读会把文件尾部补零
stat() 与 read() 之间文件可能被改写。此前按 stat 的大小分配缓冲区并假定读满,一旦文件变小,尾部就是零字节,扫描器把这当成损坏。现在以实际读到的字节数为准。
验证
- 宿主测试 23 项(新增「重写恢复与诊断」4 项),客户端 10 项,宿主半边 9 项,共 42 项全部通过,发布流水线同样运行。
- 真实 Cordis 冷启动时序检查仍然通过。
- 发布产物与源码逐字节一致,并在下载到的字节上复跑全部测试。
安装
dsh plugin --profile desktop add "https://github.com/ZeroOT-Liu/dsh-usage-widget/releases/latest/download/dsh-usage-widget.tgz"升级后需要重启 Harness(宿主半边只在进程启动时加载),然后刷新页面(Ctrl+R)。
如果你的「本月累计」仍是空白,请确认应用是在本次发布之后启动的:宿主代码不会被热重载拾取。用进程启动时间与插件文件修改时间对比即可判断。
完整变更:v1.2.0...v1.2.1