Skip to content

修正区间更新的清单来源、整包回退和大文件内存占用 - #147

Merged
qiyinxi merged 3 commits into
ModAVD:mainfrom
jinghero:codex/issue-182-range-hardening-20261113
Nov 13, 2026
Merged

qiyinxi merged 3 commits into
ModAVD:mainfrom
jinghero:codex/issue-182-range-hardening-20261113

Conversation

@jinghero

@jinghero jinghero commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

区间更新始终从远端取 modavd-manifest.json。变更比例或数量超过阈值时仍下载整包,原因只写日志,不再进入更新成功消息。超过 8 MiB 的条目用 64 KiB 缓冲区写入独立临时文件,重试前回卷并清空,解包后解除引用、关闭并删除。

本地创建、写入、关闭、复制和清理失败直接返回。强制核对清单、文件哈希及模拟器信息时也保留本地读取错误,避免误判为包损坏并重复下载整包。构建暂存目录时,清单读取失败不会再被默认构建号掩盖。读取 ZIP 与关闭目标文件同时失败时,优先返回目标文件关闭错误。

保留响应状态、Content-Range、编码、长度、超时、取消、CRC 和清单核对。需要清单的更新中,清单缺失、格式错误或不是普通文件仍视为坏包。模拟器所需文件若被做成目录,也按坏包拒绝并删除缓存,Mirror 酱整包和增量包继续回退到 GitHub。真实本地查询或读取错误仍直接返回并保留有效缓存。旧版可选清单保留原有的无有效清单时按 ZIP 校验的行为。

验证环境为 Windows amd64、仓库要求的 Go 1.26.5。实际运行:

  • go test ./internal/update ./internal/download ./internal/cli ./internal/ui -count=1。覆盖整包、增量、旧版兼容、真实损坏回退及新增本地错误回归。
  • 新回归先复现了 Windows 句柄拒绝读取清单和文件后仍整包重下、模拟器核对把读取失败当内容错误、构建暂存时忽略清单读取错误,以及 ZIP 错误掩盖目标关闭错误。修复后通过,本地错误路径无整包 GET。
  • 9 MiB 大条目的成功、断线重试、取消、损坏数据回退和本地错误回归通过。真实 Windows 关闭错误与删除共享冲突回归通过。12 MiB 合成下载的最大单次写入为 64 KiB,新增分配约 70 KiB。
  • 23 项关键行为变异均被回归检出;恢复源码后重新验证和构建。
  • 额外验证 ReaderAt 跨内存和磁盘、尾部缓存重叠、ZIP 头/数据/描述符的本地读取错误,以及中断准备后的遗留临时文件恢复清理。
  • gofmt -l .、Windows amd64、darwin/arm64、linux/amd64 的 go vet ./...、build.ps1 通过。
  • 32 个 Node 测试、3 个作者检查脚本测试、12 个 trim 测量测试通过。隐私检查覆盖 678 个已跟踪文件,0 个问题。
  • 新增整包、增量和旧版的目录形态、缓存删除及有效缓存保留回归,覆盖 Mirror 酱整包和增量包实际回退到 GitHub;也覆盖部分增量的复用、新增、修改、删除及正常旧版更新。
  • 对照初版区间实现及 upstream 基线,核对 45 组清单形态、字段、版本与构建号组合;修复目录分类回归后结果一致。
  • 本轮首次受影响包全套在既有 TestImageGatesSurviveDirectorySwapAndRecovery/install 出现一次路径不存在断言失败;该测试连续复跑 5 次通过,四个受影响包全套重跑也通过。未改镜像或目录切换代码。
  • pstack 影响范围、本地错误边界、重试、临时文件生命周期与三类更新兼容性复审完成;确认的问题已修复,未发现剩余阻塞项。

本地此前运行 go test ./... -count=1 时,Go 临时目录的 avd.test.exe 多次返回 Access is denied;单独编译到测试目录、从包目录运行该测试程序通过,生产实例对照项跳过。本轮重新验证了上面四个受影响包。

未做物理磁盘写满、真实 GitHub 发布包、模拟器或游戏验收。未改生产实例。本次提交的 CI 六项检查全部通过。

Refs ModAVD/ModAVD#182

清单始终从远端取。变更太多时只记录日志,本地创建、写入、关闭或复制失败时直接报错。

大文件分块写入临时文件,重试前重置内容,解包后关闭并删除。保留区间响应、超时、取消、CRC 和清单核对。

Refs ModAVD/ModAVD#182
读取清单、文件哈希和模拟器信息失败时直接报错,避免把本地错误当成包损坏后重新下载整包。构建暂存目录也要保留清单读取错误。

目标文件关闭失败时优先返回本地错误,避免被同时发生的 ZIP 读取错误盖掉。补充失败回归,保留坏包回退和旧版包兼容。

Refs ModAVD/ModAVD#182
先确认清单和模拟器所需的路径是不是普通文件。包里把文件做成目录时仍按坏包拒绝,删除无效缓存并恢复 Mirror 酱到 GitHub 的回退。

真实本地读取错误仍直接返回并保留有效缓存。旧版可选清单继续使用原有的 ZIP 校验回退。补齐整包、部分增量和旧版的成功、失败与缓存回归。

Refs ModAVD/ModAVD#182
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 13, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 13, 2026
@qiyinxi
qiyinxi added this pull request to the merge queue Nov 13, 2026
Merged via the queue into ModAVD:main with commit e2152c5 Nov 13, 2026
6 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