Files
minio/docs/investigations/r4-r8-integration/README.md
Feng Ruohang df0dfa0a34 docs: record R4-R8 integration review and validation
Signed-off-by: Feng Ruohang <rh@vonng.com>
2026-09-16 00:58:31 +08:00

96 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# R4–R8 集成核验
## 结论与范围
2026-09-16,R5、R6、R8 的修复在已包含 R4、R7 的 main 基线上完成集成。
本地完整 `cmd`、`internal` 测试、相关 race 检查、仓库 verifiers、构建和
HTTP 超时进程探针均通过。环境中的真实 `claude-opus-5`(effort `max`)独立
阅读合并差异与调用链,结论为 **GO_WITH_NONBLOCKING_NOTES,零阻断项**。
本记录对应 main 合并前的代码核验。最终 PR 的 Linux CI、DCO 和合并结果以该
PR 的实际提交及检查为准;这里的本地结果不代表发布、部署或多站点生产验收。
## 提交对应关系
基线:`9f3037e941a49ab4cd8a0eed7c0f01083fbe4bbe`。
| 问题 | 原修复提交 | 集成提交 | 行为 |
| --- | --- | --- | --- |
| R4 | PR [#193](https://github.com/pgsty/silo/pull/193),已在基线 | `af2b1794d38d9e70e1d2c3ee692426e4b6cab4bd`(merge) | SSE-KMS 复制保留标签修订时间 |
| R7 | PR [#194](https://github.com/pgsty/silo/pull/194),已在基线 | `9f3037e941a49ab4cd8a0eed7c0f01083fbe4bbe`(merge) | 复制元数据恢复不再重新写入传输用 aws-chunked |
| R5 | `115fe8b12329d147adbaf817faa1737392ecbf9b` | `680eac66e40b0980bc20e70d7ad34185096e63f5` | 删除标签推进修订,接收端抵御乱序事件,重试及 ACK 保留新状态 |
| R6 | `cf381a7151ef25fc95ace5fedcd767fa19410de2` | `0c61128d23f05ce6b37e7ace713c3ffbfb68f4cb` | 旧形态 marker purge 正确分类,MRF 恢复 marker 并保留重试次数 |
| R6 核验记录 | `d38edb2c46182d3a8fa96e040604493d20a4b478` | `aea3882c95d16ec5598a07b40d593e04054137a9` | 保存 v3 共识及验证边界 |
| R8 | `0d48d32d7e038ae1ea5966f3d7e0cb86780a6311` | `055030ea53ca92ee22ce1e601ef4757c247edde8` | 配置绑定到读头绝对超时,正文继续采用滚动空闲超时 |
各原任务先取得 Opus 方案共识,再实施修复。原始方案、实现复核及验证记录保留在
[R5](../r5/verification.md)、[R6](../r6/README.md)、[R8](../r8/README.md)。
R5、R6、R8 原任务又分别只读核验了集成后的交叉影响,未发现新增生产阻断项。
集成使用 `git cherry-pick -x -s`,保留原作者、来源及 DCO。后续
`80684fed59f556d579e268c5a855d936c1347b68` 仅处理两类贡献规范问题:
- 六个新建测试文件统一使用实际贡献者姓名及 AGPL-3.0-or-later 头部;从
`package` 开始的内容逐字节不变,Linux build tag 保留。
- 按 CONTRIBUTING 的规则更新兼容标识清单。唯一新增条目是 R6 测试拼接既有
replication ARN 所用的 `arn:minio:replication::`,没有新增协议名称或生产行为。
22 个源码/测试文件的最终哈希见 [manifest.json](manifest.json)。共享文件中的
R5、R6 补丁与原修复具有相同稳定 patch ID;其余源文件直接比较,六个测试仅允许
上述头部差异。[等价检查](evidence/integration-equivalence.json)全部通过。
## Opus 集成复核与处置
实际 CLI 为 2.1.270,显式指定 `claude-opus-5 --effort max`;只允许 Read、Grep、
Glob,未执行测试或修改代码。实际返回模型为 `claude-opus-5`,进程和结果均成功。
复核基于 `055030ea53ca92ee22ce1e601ef4757c247edde8` 的 22 个文件及完整差异;
此后的代码变化仅为上文已证明等价的头部与兼容清单调整。
原文、调用元数据及提示词分别见 [复核结果](evidence/opus-review.md)、
[metadata](evidence/opus-integration.metadata.json)、[prompt](evidence/opus-integration.prompt.md)。
保留原文中的判断,再用直接证据逐项处置,避免把模型意见当作测试结果:
| 非阻断意见 | 核验与决定 |
| --- | --- |
| 非法或空的历史标签时间戳可能使复制失败并重试 | 保留 R5 共识中的失败关闭行为;历史异常数据修复另行处理 |
| 带标签修订的版本在 resync 时可能多一次 metadata COPY | R5 已接受的可靠性成本;正常 COMPLETED 路径保持原有门控 |
| purge 审计状态由 COMPLETE 规范为 COMPLETED,统计开始记录实际目标结果 | R6 的预期行为;后续发布说明应告知审计/指标使用者 |
| 配置的较短 ReadHeaderTimeout 同时缩短 TLS 握手窗口 | Go net/http 的预期语义,已在 R8 共识中说明 |
| 新增多池标签测试单独运行可能缺少全局初始化 | **未成立**:精确单独运行通过;`consistencyPools` 经 `prepareErasurePoolsWithContext` → `initObjectLayer` → `newTestObjectLayer` 调用 `initAllSubsystems`。保留测试原样 |
| 审计 fixture 重复取消可能输出栈信息 | 本地完整及 race 测试通过;不扩大本次生产修复范围 |
| 新测试文件头部应按实际贡献者整理 | 已在 `80684fed` 修正,测试代码及 build tag 不变 |
## 本地直接验证
下表全部针对 `80684fed59f556d579e268c5a855d936c1347b68`,未使用额外的源码或
容量 overlay;测试代码自身的容量 fixture 保留。限制并行度仅为
`GOMAXPROCS=4`、`GOFLAGS=-p=2`,并使用
仓库 CI 的 `MINIO_API_REQUESTS_MAX=10000`。详细命令、时间和日志哈希在
[validation-results.json](evidence/validation-results.json)。
| 检查 | 结果 |
| --- | --- |
| `make verifiers`:lint、生成文件、rebrand guard | 通过,76.9 秒;可选 typos 工具按现有 Makefile 规则跳过 |
| `make build`、`./silo --version` | 通过,产物为 silo |
| `CGO_ENABLED=0 go test -p 2 ./cmd ./internal/... -count=1 -timeout=30m` | 全部通过,340.2 秒,50 个有测试的包 |
| `CGO_ENABLED=1 go test -race`,cmd/deadlineconn/http 中变更测试的函数集合 | 通过,46.3 秒;Linux build tag 用例由最终 Linux CI 覆盖 |
| `TestAPIPoolsTaggingReplicaDeletion` 精确单独执行 | 通过,无需其他测试预先运行 |
| 实际 silo 进程的 CLI/环境变量读头超时探针 | 两种配置均在 100ms 读头限制下拒绝 400ms 才完成的请求头;空闲超时为 2s,随后健康请求成功 |
进程探针使用二进制 SHA-256
`1cc536f1a3c8d8372ff2d5b140b1fd2bc98a299324fea0f73f67288d48104ce4`。
原始输出见 [runtime-probe.json](evidence/runtime-probe.json)。
各子任务较早遇到的磁盘容量不足或筛选测试初始化问题,不作为这次通过的证据。
本地完整测试已重新执行并成功;原失败记录仍保留在各自调查档案。
## 验收边界
- 最终 PR 必须通过实际提交的全部仓库检查,尤其 Linux internal 测试、完整 cmd
测试、构建/vet、lint/生成文件、交叉编译、S3 Select race、DCO 和漏洞检查。
- 既有无时间戳对象、异常时间戳、标签筛选的目标选择、任意站点时钟偏差等不由本次
修复追溯重建。共享状态解析器的历史限制按 R6 v3 共识在写入点规避。
- R8 原先未完成的 S3 长传输脚本不计为通过;本次进程探针验证配置生效,不替代
S3 长传输、独立多进程、多节点或跨区域生产验收。
- 本次不引入依赖变更或上游 MinIO 兼容硬门槛;R9 不属于这五项修复。