mirror of
https://github.com/pgsty/minio.git
synced 2026-09-16 07:24:05 +03:00
fix(http): honor configured request header deadlines
Signed-off-by: Feng Ruohang <rh@vonng.com> (cherry picked from commit 0d48d32d7e038ae1ea5966f3d7e0cb86780a6311) Signed-off-by: Feng Ruohang <rh@vonng.com>
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
# Keep captured output and unified-diff context verbatim.
|
||||
*.log -whitespace
|
||||
*.patch -whitespace
|
||||
@@ -0,0 +1,100 @@
|
||||
# R8:HTTP 请求头绝对超时
|
||||
|
||||
## 当前状态
|
||||
|
||||
两条缺陷链均已修复。完整 v2 已与真实 Opus 5.0(max)明确达成同版共识,零阻断分歧;配置与连接两条直接验证链均已闭合。额外 cmd race 曾因主机 ENOSPC 在链接阶段中止,补充旧 S3 脚本受存储最小空闲阈值阻挡;父任务已确认二者为环境未完成的补充检查,不阻断本地交付。交付保存在本地分支提交中,未推送、合并、发布或部署。
|
||||
|
||||
- 基线:`9ebe81c1b3611f9cc73e676b5b741c2be62c467a`(开工时本地及实时 origin/main 一致)。
|
||||
- 分支:`codex/r8-http-header-deadline`。
|
||||
- 方案:[v1](plan-v1.md)、[完整 v2](plan-v2.md)。
|
||||
- 最终源码绑定:[final-source-manifest.json](final-source-manifest.json),包含 5 个生产文件、4 个测试文件、计划与生产 diff 的 SHA256;[最终生产补丁](review/final-production.patch)。go.mod/go.sum 与基线一致。
|
||||
- 共识与意见处置:[consensus.md](consensus.md)。实际模型、显式 effort、计划/原始输出哈希保存在 [review](review/)。
|
||||
|
||||
## 两条缺陷链
|
||||
|
||||
### 1. 连接层覆盖绝对截止
|
||||
|
||||
`DeadlineConn.Read` 在读之前把 socket 截止更新为“现在 + idle + 250ms”,覆盖 Go 设置的绝对读头截止。直接 TCP 对照中,头部限制 100ms、idle=2s、400ms 才完成请求头,标准 Go 拒绝而旧 SILO listener 返回 204。
|
||||
|
||||
修复让 HTTP/1 请求头、keep-alive 等待和 TLS 握手读取阶段保留显式绝对上限;读头结束进入 `StateActive` 后恢复原有滚动读取,避免把 `ReadTimeout=IdleTimeout` 变成上传总时长上限。显式零值仍关闭超时,过去时间仍取消读取。写侧与默认 DeadlineConn 调用者保持原行为。现有 ConnState 回调得到保留。
|
||||
|
||||
### 2. CLI/环境配置没有传入服务器
|
||||
|
||||
`buildServerCtxt` 复制了 IdleTimeout,遗漏 ReadHeaderTimeout。真实 CLI 已读到默认 30s / 参数 100ms / 环境变量 170ms,context 仍为零。因此,即使连接层已经修复,实际 SILO 进程仍回退到 ReadTimeout=idle。
|
||||
|
||||
v2 已在相邻位置补一行赋值,未增加新选项或 YAML 字段。相同进程探针显示:v1 参数和环境变量各设置 100ms 时,400ms 慢头均返回 200;v2 两种入口均拒绝该请求,随后的健康检查仍返回 200。
|
||||
|
||||
## 已完成的连接层验证
|
||||
|
||||
| 验证 | 直接证据 |
|
||||
|---|---|
|
||||
| 原始 TCP/HTTP 100ms/400ms 对照,修复前失败、修复后两者均拒绝 | [baseline.log](evidence/baseline.log)、[original-reproducer-fixed.log](evidence/original-reproducer-fixed.log) |
|
||||
| 头部持续滴入超过多个 250ms 更新周期、首个/后续请求,明文及 TLS | [darwin-race-final.log](evidence/darwin-race-final.log) |
|
||||
| Content-Length/chunked/100-continue 持续上传、空闲 body、提前关闭及下一请求、读完 body 后长期处理 | [darwin-race-final.log](evidence/darwin-race-final.log) |
|
||||
| keep-alive、pipelined 缓冲请求、用户 ConnState、hijack/unwrap、TLS 握手读取 | [darwin-race-final.log](evidence/darwin-race-final.log) |
|
||||
| 强制仅协商 h2,断言 HTTP/2.0;原生流超时、并发健康流及连接复用 | [darwin-race-final.log](evidence/darwin-race-final.log) |
|
||||
| macOS/arm64 Go1.27.1:完整两个修改包的 race | [darwin-race-final.log](evidence/darwin-race-final.log) |
|
||||
| Linux/arm64 Docker Go1.27.1:完整两个修改包的 race,包含可选 DriveOPTimeout 拨号路径 | [linux-race-final.log](evidence/linux-race-final.log) |
|
||||
| 默认 idle=30s,明文/TLS 的持续上传、下载均用时约 33s 并完成 | [default-30s-transfers.log](evidence/default-30s-transfers.log) |
|
||||
| grid 实际 roundtrip/disconnect,go vet | [grid.log](evidence/grid.log)、[vet-final.log](evidence/vet-final.log) |
|
||||
|
||||
Linux 使用已有本地 `golang:1.27.1-bookworm` arm64 镜像 `sha256:648f440f42a0958804efb24df176f806f9d353b41f1c0627f666428e40310f6b`。临时容器仅只读挂载本工作区与 Go module cache;没有发布端口,结束即删除。
|
||||
|
||||
## 配置与真实进程验证
|
||||
|
||||
- [config-baseline.log](evidence/config-baseline.log):实际 CLI → buildServerCtxt;默认、参数、环境、参数优先级、YAML 合并、零、负值。
|
||||
- [config-fixed.log](evidence/config-fixed.log):10 个常驻配置回归全部通过,既有 YAML 配置测试也通过。包含 idle=0/负值时默认 header=30s、fmt-gen 未注册该选项时仍安全返回零。
|
||||
- [runtime-v1.json](evidence/runtime-v1.json):v1 真实编译进程在参数/环境两种配置下均错误接受 400ms 慢头;包含二进制 SHA256。
|
||||
- [runtime-v2.json](evidence/runtime-v2.json):修复后同一探针,两种入口均拒绝慢头且服务健康。最终测试二进制 SHA256:`6b982de3262c25e326280c739b4275444cf80c3eacae48f0942aa18fbb7cd654`。
|
||||
- [quality-checks.json](evidence/quality-checks.json):执行命令、退出码、平台与日志哈希。`go mod tidy -diff`、`go vet`、scoped golangci-lint 与 diff 空白检查均通过,go.mod/go.sum 未改变。
|
||||
- [runtime_probe.py](evidence/runtime_probe.py):可复现的进程探针。只启动回环地址上的临时单盘服务器,使用临时测试凭据和数据,结束时终止自己的子进程。
|
||||
|
||||
## 补充验收的环境限制
|
||||
|
||||
- 额外 `go test -race ./cmd -run TestServerReadHeaderTimeoutConfig` 未进入测试:Darwin 链接器报 `errno=28 (No space left on device)`。这与已经通过的两个网络包 macOS/Linux race、普通 cmd 配置测试不同,不能混为通过。
|
||||
- 为检验已有 `buildscripts/test-timeout.sh`,制作了临时隔离副本:将全局 pkill 换为只终止自己的 PID、监听地址限于回环、测试末尾清理;使用单独 mcli 配置目录与 BSD nc 的私有 netcat 名称,原三组请求/断言未改。脚本在正常 PUT 阶段未形成对象,整体退出 255,**未通过**。
|
||||
- 后续立即上传 30 字节的独立诊断明确返回 **HTTP 507 / XMinioStorageFull**,消息为已达到最小空闲空间阈值:[s3-capacity-probe.json](evidence/s3-capacity-probe.json)。这条补充脚本不能在当前宿主容量条件下用于证明 S3 持久化验收,也不是 deadline 回归证据。
|
||||
- 原脚本与隔离改动、命令、客户端版本、运行时长和退出码见 [isolation patch](evidence/legacy-timeout-isolation.patch)、[metadata](evidence/legacy-timeout.metadata.json)、[log](evidence/legacy-timeout.log)。v2 编译进程的健康端点慢头验证已独立通过。
|
||||
- 按父任务确认,无需为这两项非阻断补充检查继续大编译或等待;已清理本任务已结束的 v1 旧二进制约 126MiB;保留原哈希、源码方案、日志与 v2 二进制。未清理共享缓存或其他任务数据:[cleanup.json](evidence/cleanup.json)。
|
||||
|
||||
## 配置语义与兼容边界
|
||||
|
||||
| 配置 | 完整修复后的含义 |
|
||||
|---|---|
|
||||
| 默认 idle=30s / header=30s | 有效时限仍为 30s,持续滴入头部现在也受绝对上限约束 |
|
||||
| 只设 idle=2s | header 独立采用其默认 30s;相对只做 v1 的 2s 回退上限有所放宽,相对原先无限续期则建立了正确上限 |
|
||||
| header 正值 | 按该值限制 HTTP/1 头部;该值还参与 Go 的最小正 TLS 握手时限,包括 h2 握手 |
|
||||
| header=0 | 按 Go 规则回退到 ReadTimeout(此服务设为 idle) |
|
||||
| header<0 | 显式取消 Go 的 header 绝对上限;首个明文请求仍保留原有 socket idle 续期,TLS/keep-alive 因 Go 显式清零而无 header 上限 |
|
||||
| idle=0/负值,header 未设置 | 独立的默认 header=30s 现在正确生效 |
|
||||
|
||||
## 交付说明
|
||||
|
||||
- 请求头和 TLS 握手的读取现在遵守绝对上限,即使连接持续有少量字节到达也会到期;这是修复后的预期可见变化。[Go Server 定义](https://pkg.go.dev/net/http#Server)
|
||||
- HTTP/1 长上传、长下载保留滚动 idle;idle 仍有原有最多约 250ms 的更新时间余量,绝对 header 上限没有这项余量。
|
||||
- HTTP/2 保留现有原生 per-stream 超时行为;其原有总时长限制不属于本次修复。
|
||||
- TLS 握手**写**侧仍沿用滚动截止,这个既有边界单列保留,不能将本报告称为完整 TLS 握手资源限制修复。
|
||||
- 未改磁盘格式、对象元数据、存量状态、依赖或协议。回滚为撤销本次源代码改动并重新构建;本地证据不是生产部署验收。
|
||||
- 大范围仓库 CI、主干合并、版本发布、镜像和部署是后续独立交付步骤。本任务只做本地修复与针对性验证。
|
||||
|
||||
## 已纠正的测试夹具问题
|
||||
|
||||
初始 H2 客户端按服务端 ALPN 顺序落回 H1,协议断言正确使测试失败;改用仅 h2 的 TLS 拨号。之后 H2 同时启动同期限读写定时器,谁先到期会改变 body 错误包装;最终夹具在 PUT 内清除写定时器以独立验证读超时,并验证其他流与同一连接存活。无数据竞争报告。
|
||||
|
||||
配置夹具最初用了错误的变量名,随后发现“环境变量不存在”与“存在但为空”的 CLI 语义不同;修正夹具后才把非零 context 丢失作为缺陷证据。相关初始失败日志保留,不作为产品回归或通过证据。
|
||||
|
||||
新增 H2 测试曾直接引用 x/net/http2,Opus 实现评审因此提出 tidy 门禁阻断项。最终改用标准库 HTTP/2-only Protocols,不引入新直接依赖;v2 Opus 明确认定该阻断项已经解决,实际 tidy 检查也通过。重复 clamp 与 h2 宽裕 keep-alive 的改进在两平台最终 race 中通过。
|
||||
|
||||
## 最终交付状态
|
||||
|
||||
| 环节 | 状态 |
|
||||
|---|---|
|
||||
| 研究与最小兼容方案 | 完成;同时确认连接续期覆盖和配置传递遗漏 |
|
||||
| 真实 Opus 5.0 max 共识 | 完成;完整 v2 同一 SHA256,零阻断分歧 |
|
||||
| 实现评审链 | v1 REQUEST_CHANGES 的测试依赖 B1 已修复,v2 实际评审明确认定已解决 |
|
||||
| 本地实现 | 完成,绑定此提交内源文件哈希 |
|
||||
| 必要验证 | 配置、真实进程 CLI/env、TCP/TLS、长传输、keep-alive、h2、共享调用方及两平台网络包 race 完成 |
|
||||
| 补充 cmd race / 旧 S3 脚本 | 环境未完成,分别为链接 ENOSPC 与 HTTP 507 最小空闲阈值 |
|
||||
| 远端推送 / PR / 合并 / 发布 / 部署 | 未执行 |
|
||||
|
||||
工作量估算仍为原计划的 1–3 工程师日级别;本轮实际完成方案、两次方案共识、一次实现复核和上述本地验证。未宣称全仓 CI 或生产验收通过。
|
||||
@@ -0,0 +1,51 @@
|
||||
# R8 consensus and dispositions
|
||||
|
||||
Recorded UTC: 2026-09-15T15:50:55.911352+00:00
|
||||
|
||||
## Same-version agreement, before implementation
|
||||
|
||||
- Baseline: `9ebe81c1b3611f9cc73e676b5b741c2be62c467a`.
|
||||
- Accepted plan: `plan-v1.md`, SHA256 `7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366`. The plan is retained verbatim.
|
||||
- Codex recommends option 4. Real Claude Code assistant messages identify `claude-opus-5`; invocation explicitly supplied `--effort max`.
|
||||
- Opus verdict: **CONSENSUS**, explicitly names v1 and this SHA256; zero blocking disagreements. Successful result, no rate limit or substitute reviewer. See `review/opus-v1.md` and metadata. Opus independently read code, did not run tests or recalculate the supplied hash. Codex independently recalculated the hash here and ran the baseline.
|
||||
- Codex accepts the conclusion and the following dispositions. This record authorizes the local implementation stage under the user's WORKFLOW.md. No production files have been edited at the time this record is created.
|
||||
- Raw session: `/Users/vonng/tmp/silo-r8-01a0a5b9/opus-v1.jsonl`; stderr adjacent. The reviewer tried an unavailable Write tool and then delivered its review in text; no file edit was granted or used as evidence.
|
||||
|
||||
## Nonblocking opinions, individually resolved
|
||||
|
||||
| ID | Codex disposition |
|
||||
|---|---|
|
||||
| N1 | Accept precise Go source ordering: header deadlines are set in `serve` at 2038/2177; whole-request deadline at 1103 is unconditional. v1 already describes header reading separately from the latter; no algorithm change needed. |
|
||||
| N2 | Accept: add pipelined requests. StateActive follows successful parsing even when all bytes were buffered, because readRequest resets the read limit. |
|
||||
| N3 | Retain explicit negotiated-h2 skip as v1 permits. StateNew still enables strict before the handshake; h2 detection only governs later hooks. No connection-level stream timeout added. |
|
||||
| N4 | Retain listener initial strictness and Init's phase hook, as specified. Document that the private listener and Server.Init cooperate; direct raw-listener users without the hook get strict behavior for the entire request. There is no such production caller today. |
|
||||
| N5 | Accept, independently reproduced: the initial H2 smoke fell back to HTTP/1.1 and failed its protocol assertion. Fix the fixture to dial TLS advertising only h2; assert negotiated h2 and response HTTP/2.0. This fixture failure is retained in baseline-additional.log and is not a product defect. |
|
||||
| N6 | Accept: add >30s continuously progressing downloads through plaintext and TLS H1; retain write logic. Unit tests assert strict reads do not change rolling writes. |
|
||||
| N7 | Accept: delivery notes will state that trickling headers and read-side TLS handshakes now stop at the configured absolute cap, even when socket idle is not exceeded. |
|
||||
| N8 | Accept: current globalTCPOptions leaves DriveOPTimeout commented out; the optional Linux dial path remains a shared API caller and will be tested explicitly in Linux, without changing production config. |
|
||||
| N9 | Accept as a known remaining boundary: TLS handshake writes retain rolling behavior. Fixing this requires separate write/handshake phase design and is outside the R8 read-header defect. |
|
||||
|
||||
No substantive plan revision is required. Added tests are acceptance refinements consistent with v1, not changes to the agreed production behavior.
|
||||
|
||||
## Complete v2 consensus — before configuration implementation
|
||||
|
||||
Recorded UTC: 2026-09-15T16:07:48.799416+00:00
|
||||
|
||||
- Accepted **complete plan v2**, SHA256 `426127ed9fb08aeddf8259ebdc4b1c24ebec8cda751a970ed99338a44b065f4c`, independently recalculated here. V1 remains historical agreement only.
|
||||
- Actual assistant model: `claude-opus-5`; CLI explicitly `--effort max`; successful response, **CONSENSUS**, zero blocking disagreements. Opus explicitly named the complete v2 hash and the new assignment. Codex agrees with the complete v2 plan and the dispositions below. Configuration production code is still unmodified at this record's creation.
|
||||
- Opus explicitly confirms the implementation-review B1 dependency blocker is resolved by the standard-library-only HTTP/2 fixture. `go mod tidy -diff` independently returned exit 0.
|
||||
- Reviewer source inspection is separate from execution; all actual tests and binary hashes are Codex-produced evidence. See `review/opus-v2.md` and metadata for the original opinion and raw log identity.
|
||||
|
||||
| V2 note | Codex disposition |
|
||||
|---|---|
|
||||
| N1 | Accept: document that a positive ReadHeaderTimeout also participates in the standard-library minimum TLS handshake window, including h2's handshake. |
|
||||
| N2 | Accept: with only idle=2s customized, v1's fallback cap was 2s; complete v2 honors default header=30s. The independent header knob is intentional. Socket inactivity is still constrained under the retained rules. |
|
||||
| N3 | Accept: explicitly document negative header values and the inherited first-plaintext vs TLS/keep-alive zero-deadline distinction. This is an explicit opt-out of the header cap; no unagreed policy change. |
|
||||
| N4 | Accept: add parser cases for disabled idle with independent default header=30s, and include disabled-idle coverage in process probing if practical. |
|
||||
| N5 | Accept evaluation: inspect the existing buildscripts/test-timeout.sh for safe isolated execution. It complements, but does not replace, the new trickle and renewal cases. Record whether run and its exact scope. |
|
||||
| N6 | Accept: land configuration assertions as a permanent cmd test; zero case remains a compatibility control, not defect-discriminating evidence. |
|
||||
| N7 | Accept: fmt-gen's absent duration flag returns zero and does not launch HTTP; no extra flag or production change. |
|
||||
| N8 | Accept: leave the duplicate existing UserTimeout assignment untouched. |
|
||||
| N9 | Accept: final quality records include actual commands/exit codes; add repaired compiled-process output with binary SHA256. The old runtime-v1 output remains explicitly pre-binding evidence. |
|
||||
|
||||
Implementation and verification now continue within v2. Merge, release and deployment remain outside automatic delivery.
|
||||
@@ -0,0 +1,23 @@
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.00s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
r8_compatibility_test.go:278: expected HTTP/2, got HTTP/1.1
|
||||
r8_compatibility_test.go:293: unexpected HTTP/1.1 204 No Content
|
||||
--- FAIL: TestServerHTTP2Deadlines (0.00s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.30s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.30s)
|
||||
FAIL
|
||||
FAIL github.com/minio/minio/internal/http 0.959s
|
||||
FAIL
|
||||
@@ -0,0 +1,80 @@
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
r8_compatibility_test.go:181: continuous upload 1.293813708s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
r8_compatibility_test.go:181: continuous upload 1.293742875s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
r8_compatibility_test.go:181: continuous upload 1.297742459s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
r8_compatibility_test.go:181: continuous upload 1.293691583s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
r8_compatibility_test.go:181: continuous upload 1.296975334s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
r8_compatibility_test.go:181: continuous upload 1.297091375s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
r8_compatibility_test.go:181: continuous upload 1.293960709s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
r8_compatibility_test.go:181: continuous upload 1.297880292s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.30s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.45s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.70s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 2.983s
|
||||
@@ -0,0 +1,11 @@
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout/standard-net-http
|
||||
r8_baseline_test.go:56: request rejected after header timeout: unexpected EOF
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout/silo-listener
|
||||
r8_baseline_test.go:60: 100ms request-header deadline accepted header completed after 400ms: HTTP 204
|
||||
--- FAIL: TestReviewR8AbsoluteHeaderTimeout (0.80s)
|
||||
--- PASS: TestReviewR8AbsoluteHeaderTimeout/standard-net-http (0.40s)
|
||||
--- FAIL: TestReviewR8AbsoluteHeaderTimeout/silo-listener (0.40s)
|
||||
FAIL
|
||||
FAIL github.com/minio/minio/internal/http 1.477s
|
||||
FAIL
|
||||
@@ -0,0 +1,63 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"context"
|
||||
"io"
|
||||
"net"
|
||||
stdhttp "net/http"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestReviewR8AbsoluteHeaderTimeout(t *testing.T) {
|
||||
for _, wrapped := range []bool{false, true} {
|
||||
name := "standard-net-http"
|
||||
if wrapped {
|
||||
name = "silo-listener"
|
||||
}
|
||||
t.Run(name, func(t *testing.T) {
|
||||
handler := stdhttp.HandlerFunc(func(w stdhttp.ResponseWriter, r *stdhttp.Request) { w.WriteHeader(204) })
|
||||
var addr string
|
||||
if wrapped {
|
||||
srv := NewServer([]string{"127.0.0.1:0"}).UseHandler(handler).
|
||||
UseTCPOptions(TCPOptions{IdleTimeout: 2 * time.Second}).
|
||||
UseReadHeaderTimeout(100 * time.Millisecond).UseReadTimeout(2 * time.Second).UseWriteTimeout(2 * time.Second)
|
||||
serve, err := srv.Init(context.Background(), func(_ string, err error) { t.Error(err) })
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
addr = srv.listener.Addr().String()
|
||||
go serve()
|
||||
defer srv.Server.Close()
|
||||
} else {
|
||||
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
srv := &stdhttp.Server{Handler: handler, ReadHeaderTimeout: 100 * time.Millisecond, ReadTimeout: 2 * time.Second, WriteTimeout: 2 * time.Second}
|
||||
addr = ln.Addr().String()
|
||||
go srv.Serve(ln)
|
||||
defer srv.Close()
|
||||
}
|
||||
conn, err := net.DialTimeout("tcp", addr, time.Second)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer conn.Close()
|
||||
conn.SetDeadline(time.Now().Add(3 * time.Second))
|
||||
if _, err := io.WriteString(conn, "GET / HTTP/1.1\r\nHost: localhost\r\nX-Slow: "); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
time.Sleep(400 * time.Millisecond)
|
||||
io.WriteString(conn, "done\r\nConnection: close\r\n\r\n")
|
||||
resp, err := stdhttp.ReadResponse(bufio.NewReader(conn), nil)
|
||||
if err != nil {
|
||||
t.Logf("request rejected after header timeout: %v", err)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
t.Errorf("100ms request-header deadline accepted header completed after 400ms: HTTP %d", resp.StatusCode)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"timestamp_utc": "2026-09-15T16:14:25.042607+00:00",
|
||||
"reason": "parent requested cleanup of completed task-owned disposable artifacts; baseline runtime evidence and hash retained",
|
||||
"deleted": [
|
||||
{
|
||||
"path": "/Users/vonng/tmp/silo-r8-01a0a5b9/silo-v1",
|
||||
"size": 132390258,
|
||||
"sha256": "ed8d30cb40832f854bd82b083b9d1ec3ee16a35598416a54ef2d48bde8384ffc"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
=== RUN TestServerReadHeaderTimeoutConfig
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/default
|
||||
r8_config_test.go:31: could not parse as duration for flag read-header-timeout: time: invalid duration ""
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag
|
||||
r8_config_test.go:31: could not parse as duration for flag read-header-timeout: time: invalid duration ""
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/environment
|
||||
r8_config_test.go:28: CLI read-header-timeout=170ms, expected=170ms
|
||||
r8_config_test.go:33: parsed ReadHeaderTimeout = 0s, want 170ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag-over-environment
|
||||
r8_config_test.go:28: CLI read-header-timeout=80ms, expected=80ms
|
||||
r8_config_test.go:33: parsed ReadHeaderTimeout = 0s, want 80ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/yaml-retains-flag
|
||||
r8_config_test.go:31: could not parse as duration for flag read-header-timeout: time: invalid duration ""
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/zero-fallback
|
||||
r8_config_test.go:31: could not parse as duration for flag read-header-timeout: time: invalid duration ""
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/negative-disabled
|
||||
r8_config_test.go:31: could not parse as duration for flag read-header-timeout: time: invalid duration ""
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/default (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/flag (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/environment (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/flag-over-environment (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/yaml-retains-flag (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/zero-fallback (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/negative-disabled (0.00s)
|
||||
FAIL
|
||||
FAIL github.com/minio/minio/cmd 1.629s
|
||||
FAIL
|
||||
@@ -0,0 +1,4 @@
|
||||
# github.com/minio/minio/cmd [github.com/minio/minio/cmd.test]
|
||||
../../../../tmp/silo-r8-01a0a5b9/config_deadline_test.go:26:52: undefined: serverFlags
|
||||
FAIL github.com/minio/minio/cmd [build failed]
|
||||
FAIL
|
||||
@@ -0,0 +1,32 @@
|
||||
=== RUN TestServerReadHeaderTimeoutConfig
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/default
|
||||
r8_config_test.go:30: CLI read-header-timeout=30s, expected=30s
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want 30s
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag
|
||||
r8_config_test.go:30: CLI read-header-timeout=100ms, expected=100ms
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want 100ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/environment
|
||||
r8_config_test.go:30: CLI read-header-timeout=170ms, expected=170ms
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want 170ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag-over-environment
|
||||
r8_config_test.go:30: CLI read-header-timeout=80ms, expected=80ms
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want 80ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/yaml-retains-flag
|
||||
r8_config_test.go:30: CLI read-header-timeout=100ms, expected=100ms
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want 100ms
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/zero-fallback
|
||||
r8_config_test.go:30: CLI read-header-timeout=0s, expected=0s
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/negative-disabled
|
||||
r8_config_test.go:30: CLI read-header-timeout=-1s, expected=-1s
|
||||
r8_config_test.go:35: parsed ReadHeaderTimeout = 0s, want -1s
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/default (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/flag (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/environment (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/flag-over-environment (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/yaml-retains-flag (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/zero-fallback (0.00s)
|
||||
--- FAIL: TestServerReadHeaderTimeoutConfig/negative-disabled (0.00s)
|
||||
FAIL
|
||||
FAIL github.com/minio/minio/cmd 1.500s
|
||||
FAIL
|
||||
@@ -0,0 +1,36 @@
|
||||
=== RUN TestServerConfigFile
|
||||
=== RUN TestServerConfigFile/testdata/config/1.yaml
|
||||
=== RUN TestServerConfigFile/testdata/config/2.yaml
|
||||
=== RUN TestServerConfigFile/testdata/config/invalid.yaml
|
||||
=== RUN TestServerConfigFile/testdata/config/invalid-types.yaml
|
||||
=== RUN TestServerConfigFile/testdata/config/invalid-disks.yaml
|
||||
--- PASS: TestServerConfigFile (0.00s)
|
||||
--- PASS: TestServerConfigFile/testdata/config/1.yaml (0.00s)
|
||||
--- PASS: TestServerConfigFile/testdata/config/2.yaml (0.00s)
|
||||
--- PASS: TestServerConfigFile/testdata/config/invalid.yaml (0.00s)
|
||||
--- PASS: TestServerConfigFile/testdata/config/invalid-types.yaml (0.00s)
|
||||
--- PASS: TestServerConfigFile/testdata/config/invalid-disks.yaml (0.00s)
|
||||
=== RUN TestServerReadHeaderTimeoutConfig
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/default
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/environment
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/flag-over-environment
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/yaml-retains-flag
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/zero-fallback
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/zero-idle-default-header
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/negative-idle-default-header
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/fmt-gen-unregistered-duration
|
||||
=== RUN TestServerReadHeaderTimeoutConfig/negative-disabled
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig (0.06s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/default (0.01s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/flag (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/environment (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/flag-over-environment (0.01s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/yaml-retains-flag (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/zero-fallback (0.04s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/zero-idle-default-header (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/negative-idle-default-header (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/fmt-gen-unregistered-duration (0.00s)
|
||||
--- PASS: TestServerReadHeaderTimeoutConfig/negative-disabled (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/cmd 2.462s
|
||||
@@ -0,0 +1,8 @@
|
||||
# github.com/minio/minio/cmd.test
|
||||
/opt/homebrew/Cellar/go/1.27.1/libexec/pkg/tool/darwin_arm64/link: running cc failed: exit status 1
|
||||
/usr/bin/cc -arch arm64 -Wl,-S -Wl,-x -Wl,-U,__dyld_get_dyld_header -o $WORK/b001/cmd.test -Qunused-arguments /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/go.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000000.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000001.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000002.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000003.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000004.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000005.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000006.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000007.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000008.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000009.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000010.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000011.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000012.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000013.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000014.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000015.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000016.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000017.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000018.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000019.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000020.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000021.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000022.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000023.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000024.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000025.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000026.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000027.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000028.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000029.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000030.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000031.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000032.o /var/folders/df/bfm8q07d7bv3kpjf1fjchq4m0000gn/T/go-link-2408312831/000033.o -lresolv -O2 -g -O2 -g -O2 -g -O2 -g -framework CoreFoundation -framework IOKit -O2 -g -framework IOKit -O2 -g -framework CoreFoundation -framework Security -O2 -g -framework CoreServices -O2 -g -O2 -g -framework CoreFoundation -framework IOKit -O2 -g -framework CoreFoundation -framework CFNetwork -framework CoreFoundation -framework CFNetwork
|
||||
ld: write() failed, errno=28 (No space left on device)
|
||||
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
||||
|
||||
FAIL github.com/minio/minio/cmd [build failed]
|
||||
FAIL
|
||||
@@ -0,0 +1,39 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/minio/cli"
|
||||
xhttp "github.com/minio/minio/internal/http"
|
||||
)
|
||||
|
||||
func TestServerReadHeaderTimeoutConfig(t *testing.T) {
|
||||
for _,tc:=range []struct{name,env string;args []string;want time.Duration}{
|
||||
{name:"default",want:xhttp.DefaultReadHeaderTimeout},
|
||||
{name:"flag",args:[]string{"--read-header-timeout=100ms"},want:100*time.Millisecond},
|
||||
{name:"environment",env:"170ms",want:170*time.Millisecond},
|
||||
{name:"flag-over-environment",env:"170ms",args:[]string{"--read-header-timeout=80ms"},want:80*time.Millisecond},
|
||||
{name:"yaml-retains-flag",args:[]string{"--config=testdata/config/1.yaml","--read-header-timeout=100ms"},want:100*time.Millisecond},
|
||||
{name:"zero-fallback",args:[]string{"--read-header-timeout=0s"}},
|
||||
{name:"negative-disabled",args:[]string{"--read-header-timeout=-1s"},want:-time.Second},
|
||||
}{
|
||||
t.Run(tc.name,func(t *testing.T){
|
||||
for _,key:=range []string{"MINIO_ARGS","MINIO_VOLUMES","MINIO_ENDPOINTS","MINIO_CONFIG","MINIO_ERASURE_SET_DRIVE_COUNT"}{t.Setenv(key,"")}
|
||||
t.Setenv("MINIO_READ_HEADER_TIMEOUT",tc.env)
|
||||
if tc.env==""{if err:=os.Unsetenv("MINIO_READ_HEADER_TIMEOUT");err!=nil{t.Fatal(err)}}
|
||||
t.Setenv("MINIO_IDLE_TIMEOUT","2s")
|
||||
var got serverCtxt
|
||||
called:=false
|
||||
app:=cli.NewApp()
|
||||
app.Commands=[]cli.Command{{Name:"server",Flags:serverCmd.Flags,Action:func(ctx *cli.Context)error{called=true;t.Logf("CLI read-header-timeout=%s, expected=%s",ctx.Duration("read-header-timeout"),tc.want);return buildServerCtxt(ctx,&got)}}}
|
||||
args:=append([]string{"silo","server"},tc.args...)
|
||||
args=append(args,t.TempDir())
|
||||
if err:=app.Run(args);err!=nil{t.Fatal(err)}
|
||||
if !called{t.Fatal("server action did not run")}
|
||||
if got.ReadHeaderTimeout!=tc.want{t.Errorf("parsed ReadHeaderTimeout = %s, want %s",got.ReadHeaderTimeout,tc.want)}
|
||||
if got.IdleTimeout!=2*time.Second{t.Errorf("parsed IdleTimeout = %s, want 2s",got.IdleTimeout)}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestStrictReadDeadlineRepeatedRenewal
|
||||
--- PASS: TestStrictReadDeadlineRepeatedRenewal (0.91s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.04s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.50s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 5.927s
|
||||
=== RUN TestCheckPortAvailability
|
||||
check_port_test.go:31:
|
||||
--- SKIP: TestCheckPortAvailability (0.00s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.04s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.03s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.01s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.02s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.82s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.85s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.96s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.98s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (1.57s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (1.59s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.71s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.73s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.52s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.53s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.312965334s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.30790825s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.32285075s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.323004708s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.322070417s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.323585625s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.323022875s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.323094875s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.34s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.34s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.34s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.34s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:270: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.47s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.72s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/16 00:03:51 http: TLS handshake error from 127.0.0.1:57963: read tcp 127.0.0.1:57962->127.0.0.1:57963: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.20s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.02s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.02s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.43s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.30s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.31s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.65s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.66s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:619: continuous download 1.2963195s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:619: continuous download 1.295400042s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.30s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.31s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:626: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 11.654s
|
||||
@@ -0,0 +1,213 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.02s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.50s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 5.330s
|
||||
=== RUN TestCheckPortAvailability
|
||||
check_port_test.go:31:
|
||||
--- SKIP: TestCheckPortAvailability (0.00s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.06s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.05s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.01s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.00s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.41s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.43s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.60s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.62s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (0.82s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (0.82s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.01s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.02s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.51s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.52s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.299239125s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.297586417s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.308398125s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.300855208s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.30259925s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.301167166s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.309196541s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.302837125s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.32s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:268: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.46s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.71s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 23:52:51 http: TLS handshake error from 127.0.0.1:54831: read tcp 127.0.0.1:54830->127.0.0.1:54831: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.20s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.01s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.01s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
server_deadline_test.go:435: expected native HTTP/2 read timeout, got stream error: stream ID 5; INTERNAL_ERROR; i/o timeout
|
||||
--- FAIL: TestServerHTTP2Deadlines (0.41s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.30s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.31s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.65s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.66s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:588: continuous download 1.298471834s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:588: continuous download 1.29483875s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.30s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.30s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:595: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
FAIL
|
||||
FAIL github.com/minio/minio/internal/http 10.023s
|
||||
FAIL
|
||||
@@ -0,0 +1,211 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.00s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.50s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 5.069s
|
||||
=== RUN TestCheckPortAvailability
|
||||
check_port_test.go:31:
|
||||
--- SKIP: TestCheckPortAvailability (0.00s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.01s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.00s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.00s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.00s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.81s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.83s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.95s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.96s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (1.56s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (1.57s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.70s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.71s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.50s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.51s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.293135s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.286289708s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.286156s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.288825375s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.293748959s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.293017291s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.293105875s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.292306625s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.29s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.29s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.29s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.29s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.31s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:268: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.46s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.71s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 23:53:59 http: TLS handshake error from 127.0.0.1:55169: read tcp 127.0.0.1:55168->127.0.0.1:55169: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.20s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.01s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.01s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.41s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.30s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.31s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.65s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.66s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:624: continuous download 1.297514833s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:624: continuous download 1.29253225s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.30s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.30s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:631: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 11.525s
|
||||
@@ -0,0 +1,34 @@
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
=== PAUSE TestServerDefaultIdleLongUpload
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
=== PAUSE TestServerDefaultIdleLongDownload
|
||||
=== CONT TestServerDefaultIdleLongUpload
|
||||
=== RUN TestServerDefaultIdleLongUpload/tls=false
|
||||
=== PAUSE TestServerDefaultIdleLongUpload/tls=false
|
||||
=== RUN TestServerDefaultIdleLongUpload/tls=true
|
||||
=== PAUSE TestServerDefaultIdleLongUpload/tls=true
|
||||
=== CONT TestServerDefaultIdleLongUpload/tls=false
|
||||
=== CONT TestServerDefaultIdleLongDownload
|
||||
=== RUN TestServerDefaultIdleLongDownload/tls=false
|
||||
=== PAUSE TestServerDefaultIdleLongDownload/tls=false
|
||||
=== RUN TestServerDefaultIdleLongDownload/tls=true
|
||||
=== PAUSE TestServerDefaultIdleLongDownload/tls=true
|
||||
=== CONT TestServerDefaultIdleLongDownload/tls=false
|
||||
=== CONT TestServerDefaultIdleLongDownload/tls=true
|
||||
=== CONT TestServerDefaultIdleLongUpload/tls=true
|
||||
=== NAME TestServerDefaultIdleLongDownload/tls=true
|
||||
server_deadline_test.go:601: continuous download 33.028469208s > idle 30s
|
||||
=== NAME TestServerDefaultIdleLongDownload/tls=false
|
||||
server_deadline_test.go:601: continuous download 33.033171416s > idle 30s
|
||||
=== NAME TestServerDefaultIdleLongUpload/tls=true
|
||||
server_deadline_test.go:274: continuous upload 33.028635792s > idle 30s
|
||||
=== NAME TestServerDefaultIdleLongUpload/tls=false
|
||||
server_deadline_test.go:274: continuous upload 33.033198583s > idle 30s
|
||||
--- PASS: TestServerDefaultIdleLongDownload (0.00s)
|
||||
--- PASS: TestServerDefaultIdleLongDownload/tls=true (33.03s)
|
||||
--- PASS: TestServerDefaultIdleLongDownload/tls=false (33.03s)
|
||||
--- PASS: TestServerDefaultIdleLongUpload (0.00s)
|
||||
--- PASS: TestServerDefaultIdleLongUpload/tls=false (33.03s)
|
||||
--- PASS: TestServerDefaultIdleLongUpload/tls=true (33.03s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 34.193s
|
||||
@@ -0,0 +1,3 @@
|
||||
$ git diff --check 9ebe81c1b3611f9cc73e676b5b741c2be62c467a --
|
||||
|
||||
exit_code=0
|
||||
@@ -0,0 +1,39 @@
|
||||
=== RUN TestDisconnect
|
||||
connection_test.go:90: Started server on 127.0.0.1:54773 URL: http://127.0.0.1:54773
|
||||
connection_test.go:91: Started server on 127.0.0.1:54774 URL: http://127.0.0.1:54774
|
||||
connection_test.go:46: Got a GET request for: /minio/grid/v1
|
||||
connection_test.go:140: Roundtrip: sending request
|
||||
connection_test.go:142: Roundtrip: 246.625µs [] remote disconnected
|
||||
connection_test.go:46: Got a GET request for: /minio/grid/v1
|
||||
connection_test.go:157: Resp: {[] remote disconnected} <nil>
|
||||
connection_test.go:46: Got a GET request for: /minio/grid/v1
|
||||
--- PASS: TestDisconnect (0.01s)
|
||||
=== RUN TestSingleRoundtrip
|
||||
=== RUN TestSingleRoundtrip/localToRemote
|
||||
=== NAME TestSingleRoundtrip
|
||||
grid_test.go:66: 1: server payload: 17 bytes.
|
||||
=== NAME TestSingleRoundtrip/localToRemote
|
||||
grid_test.go:90: Roundtrip: 141.625µs
|
||||
=== RUN TestSingleRoundtrip/localToRemoteErr
|
||||
=== NAME TestSingleRoundtrip
|
||||
grid_test.go:71: 2: server payload: 17 bytes.
|
||||
=== NAME TestSingleRoundtrip/localToRemoteErr
|
||||
grid_test.go:97: Roundtrip: 187.625µs
|
||||
grid_test.go:104: Roundtrip: 195.958µs
|
||||
=== RUN TestSingleRoundtrip/localToRemoteHuge
|
||||
=== NAME TestSingleRoundtrip
|
||||
grid_test.go:66: 1: server payload: 1048576 bytes.
|
||||
=== NAME TestSingleRoundtrip/localToRemoteHuge
|
||||
grid_test.go:116: Roundtrip: 3.062792ms
|
||||
=== RUN TestSingleRoundtrip/localToRemoteErrHuge
|
||||
=== NAME TestSingleRoundtrip
|
||||
grid_test.go:71: 2: server payload: 1024 bytes.
|
||||
=== NAME TestSingleRoundtrip/localToRemoteErrHuge
|
||||
grid_test.go:130: Roundtrip: 232.958µs
|
||||
--- PASS: TestSingleRoundtrip (0.00s)
|
||||
--- PASS: TestSingleRoundtrip/localToRemote (0.00s)
|
||||
--- PASS: TestSingleRoundtrip/localToRemoteErr (0.00s)
|
||||
--- PASS: TestSingleRoundtrip/localToRemoteHuge (0.00s)
|
||||
--- PASS: TestSingleRoundtrip/localToRemoteErrHuge (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/grid 0.622s
|
||||
@@ -0,0 +1,195 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 0.652s
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.40s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.41s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.60s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.61s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (0.80s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (0.81s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.01s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.50s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.50s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.296547458s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.296906542s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.293365791s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.293554459s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.296912417s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.293226958s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.295960125s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.29373425s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.30s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.30s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:268: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.45s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.70s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 23:51:45 http: TLS handshake error from 127.0.0.1:54459: read tcp 127.0.0.1:54458->127.0.0.1:54459: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.20s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.00s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.40s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.30s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.30s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.30s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.65s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.65s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.70s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== NAME TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:587: continuous download 1.296415709s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:587: continuous download 1.294823375s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.30s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.30s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:594: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 9.965s
|
||||
@@ -0,0 +1,31 @@
|
||||
--- buildscripts/test-timeout.sh
|
||||
+++ temporary/test-timeout-isolated.sh
|
||||
@@ -31,8 +31,11 @@
|
||||
fi
|
||||
|
||||
echo "Cleaning up instances of Silo"
|
||||
- pkill silo || true
|
||||
- pkill -9 silo || true
|
||||
+ if [ -n "${pid:-}" ]; then
|
||||
+ kill "$pid" 2>/dev/null || true
|
||||
+ wait "$pid" 2>/dev/null || true
|
||||
+ fi
|
||||
+ if [ -f "$WORK_DIR/server1.log" ]; then cp "$WORK_DIR/server1.log" "$PWD/timeout-server.log"; fi
|
||||
purge "$WORK_DIR"
|
||||
if [ $# -ne 0 ]; then
|
||||
exit $#
|
||||
@@ -83,7 +86,7 @@
|
||||
"$(git rev-parse --show-toplevel)/buildscripts/install-mcli.sh" "$PWD/mc"
|
||||
fi
|
||||
|
||||
- "${SILO[@]}" --address ":$start_port" --read-header-timeout ${srv_hdr_timeout}s --idle-timeout ${srv_idle_timeout}s "${WORK_DIR}/disk/" >"${WORK_DIR}/server1.log" 2>&1 &
|
||||
+ "${SILO[@]}" --address "127.0.0.1:$start_port" --read-header-timeout ${srv_hdr_timeout}s --idle-timeout ${srv_idle_timeout}s "${WORK_DIR}/disk/" >"${WORK_DIR}/server1.log" 2>&1 &
|
||||
pid=$!
|
||||
disown $pid
|
||||
sleep 1
|
||||
@@ -124,3 +127,5 @@
|
||||
}
|
||||
|
||||
main "$@"
|
||||
+
|
||||
+catch
|
||||
@@ -0,0 +1,6 @@
|
||||
Cleaning up instances of Silo
|
||||
Bucket created successfully `silo/testbucket`.
|
||||
Access permission for `silo/testbucket` is set to `public`
|
||||
mcli: <ERROR> Unable to stat `silo/testbucket/testobject`. Object does not exist.
|
||||
mcli: <ERROR> Unable to stat `silo/testbucket/testobject`. Object does not exist.
|
||||
mcli: <ERROR> Unable to stat `silo/testbucket/testobject`. Object does not exist.
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"original_script": "buildscripts/test-timeout.sh",
|
||||
"isolation_patch": "legacy-timeout-isolation.patch",
|
||||
"working_directory": "/Users/vonng/tmp/silo-r8-01a0a5b9/legacy-timeout",
|
||||
"binary_sha256": "6b982de3262c25e326280c739b4275444cf80c3eacae48f0942aa18fbb7cd654",
|
||||
"client": "/opt/homebrew/bin/mcli RELEASE.2026-08-26T17-15-27Z (70a2950478e18e38eb68162317e4b5d34c6eb6d5)",
|
||||
"netcat": "/usr/bin/nc via private netcat symlink",
|
||||
"command": [
|
||||
"/bin/bash",
|
||||
"/Users/vonng/tmp/silo-r8-01a0a5b9/legacy-timeout/test-timeout-isolated.sh"
|
||||
],
|
||||
"exit_code": 255,
|
||||
"elapsed_seconds": 67.029
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
0 issues.
|
||||
@@ -0,0 +1,2 @@
|
||||
Error: parallel golangci-lint is running
|
||||
The command is terminated due to an error: parallel golangci-lint is running
|
||||
@@ -0,0 +1,5 @@
|
||||
internal/http/server_deadline_test.go:61:7: QF1008: could remove embedded field "Server" from selector (staticcheck)
|
||||
srv.Server.Close()
|
||||
^
|
||||
1 issues:
|
||||
* staticcheck: 1
|
||||
@@ -0,0 +1,214 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestStrictReadDeadlineRepeatedRenewal
|
||||
--- PASS: TestStrictReadDeadlineRepeatedRenewal (0.91s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.01s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.50s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 5.490s
|
||||
=== RUN TestCheckPortAvailability
|
||||
--- PASS: TestCheckPortAvailability (0.00s)
|
||||
=== RUN TestInternodeDialReadDeadline
|
||||
--- PASS: TestInternodeDialReadDeadline (1.31s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.01s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.00s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.00s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.00s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.82s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.96s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (1.58s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.71s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.95s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.83s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.72s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (1.59s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.52s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.52s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.320011834s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.33052725s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.330741292s > idle 300ms
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.321011251s > idle 300ms
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:261: continuous upload 1.325489459s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.315352084s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.325666792s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:261: continuous upload 1.315434542s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.33s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:270: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.46s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 16:04:28 http: TLS handshake error from 127.0.0.1:60010: read tcp 127.0.0.1:44841->127.0.0.1:60010: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.21s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.01s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.01s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.42s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.31s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.34s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.66s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.68s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:619: continuous download 1.306085084s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:619: continuous download 1.319082334s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.32s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.32s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:626: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 15.196s
|
||||
@@ -0,0 +1,212 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.01s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.50s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 4.580s
|
||||
=== RUN TestCheckPortAvailability
|
||||
--- PASS: TestCheckPortAvailability (0.00s)
|
||||
=== RUN TestInternodeDialReadDeadline
|
||||
--- PASS: TestInternodeDialReadDeadline (1.31s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.01s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.00s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.00s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.00s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.61s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (0.81s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (0.81s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.01s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.61s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.41s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.42s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.01s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.52s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.52s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.317026792s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.327268125s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.327373417s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.316941667s > idle 300ms
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.299763501s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.313516875s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.314431001s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.300043209s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.32s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.32s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:268: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.46s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.46s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.70s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.71s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 15:53:23 http: TLS handshake error from 127.0.0.1:45990: read tcp 127.0.0.1:34171->127.0.0.1:45990: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.20s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.01s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.01s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.42s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.31s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.33s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.66s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.67s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:588: continuous download 1.315636125s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:588: continuous download 1.324163209s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.32s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.32s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:595: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 13.825s
|
||||
@@ -0,0 +1,213 @@
|
||||
=== RUN TestStrictReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetReadDeadline
|
||||
=== RUN TestStrictReadDeadline/SetDeadline
|
||||
--- PASS: TestStrictReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetReadDeadline (0.00s)
|
||||
--- PASS: TestStrictReadDeadline/SetDeadline (0.00s)
|
||||
=== RUN TestDefaultReadDeadlineStillRenews
|
||||
--- PASS: TestDefaultReadDeadlineStillRenews (0.00s)
|
||||
=== RUN TestStrictExpiredFutureReadDeadline
|
||||
--- PASS: TestStrictExpiredFutureReadDeadline (0.06s)
|
||||
=== RUN TestConcurrentStrictReadDeadline
|
||||
--- PASS: TestConcurrentStrictReadDeadline (0.00s)
|
||||
=== RUN TestBuffConnReadTimeout
|
||||
--- PASS: TestBuffConnReadTimeout (3.01s)
|
||||
=== RUN TestBuffConnReadCheckTimeout
|
||||
--- PASS: TestBuffConnReadCheckTimeout (0.51s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 4.583s
|
||||
=== RUN TestCheckPortAvailability
|
||||
--- PASS: TestCheckPortAvailability (0.01s)
|
||||
=== RUN TestInternodeDialReadDeadline
|
||||
--- PASS: TestInternodeDialReadDeadline (1.31s)
|
||||
=== RUN TestNewHTTPListener
|
||||
--- PASS: TestNewHTTPListener (0.01s)
|
||||
=== RUN TestHTTPListenerStartClose
|
||||
--- PASS: TestHTTPListenerStartClose (0.00s)
|
||||
=== RUN TestHTTPListenerAddr
|
||||
--- PASS: TestHTTPListenerAddr (0.00s)
|
||||
=== RUN TestHTTPListenerAddrs
|
||||
--- PASS: TestHTTPListenerAddrs (0.00s)
|
||||
=== RUN TestServerReadHeaderDeadline
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== RUN TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== PAUSE TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=false/second=false/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=true/trickle=false
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=true
|
||||
=== CONT TestServerReadHeaderDeadline/tls=true/second=false/trickle=false
|
||||
--- PASS: TestServerReadHeaderDeadline (0.00s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=true (0.83s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=false/trickle=false (0.95s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=true (1.57s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=false/second=true/trickle=false (1.71s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=true (0.83s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=true (1.58s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=true/trickle=false (1.71s)
|
||||
--- PASS: TestServerReadHeaderDeadline/tls=true/second=false/trickle=false (0.96s)
|
||||
=== RUN TestServerKeepAliveDeadline
|
||||
=== RUN TestServerKeepAliveDeadline/tls=false
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=false
|
||||
=== RUN TestServerKeepAliveDeadline/tls=true
|
||||
=== PAUSE TestServerKeepAliveDeadline/tls=true
|
||||
=== CONT TestServerKeepAliveDeadline/tls=false
|
||||
=== CONT TestServerKeepAliveDeadline/tls=true
|
||||
--- PASS: TestServerKeepAliveDeadline (0.00s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=false (1.51s)
|
||||
--- PASS: TestServerKeepAliveDeadline/tls=true (1.51s)
|
||||
=== RUN TestServerContinuousUpload
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== RUN TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== PAUSE TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.314443501s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.313693959s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.326107334s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.314532709s > idle 300ms
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
=== CONT TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.308128834s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=true/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.308309709s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=false/chunked=false/expect=false
|
||||
server_deadline_test.go:259: continuous upload 1.30837825s > idle 300ms
|
||||
=== NAME TestServerContinuousUpload/tls=true/chunked=true/expect=true
|
||||
server_deadline_test.go:259: continuous upload 1.297138459s > idle 300ms
|
||||
--- PASS: TestServerContinuousUpload (0.00s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=true (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=false/expect=false (1.33s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=true (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=true/expect=false (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=false/chunked=false/expect=false (1.31s)
|
||||
--- PASS: TestServerContinuousUpload/tls=true/chunked=true/expect=true (1.31s)
|
||||
=== RUN TestServerDefaultIdleLongUpload
|
||||
server_deadline_test.go:268: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle regression
|
||||
--- SKIP: TestServerDefaultIdleLongUpload (0.00s)
|
||||
=== RUN TestServerIdleBodyDeadline
|
||||
=== RUN TestServerIdleBodyDeadline/tls=false
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=false
|
||||
=== RUN TestServerIdleBodyDeadline/tls=true
|
||||
=== PAUSE TestServerIdleBodyDeadline/tls=true
|
||||
=== CONT TestServerIdleBodyDeadline/tls=false
|
||||
=== CONT TestServerIdleBodyDeadline/tls=true
|
||||
--- PASS: TestServerIdleBodyDeadline (0.00s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=false (0.45s)
|
||||
--- PASS: TestServerIdleBodyDeadline/tls=true (0.46s)
|
||||
=== RUN TestServerBackgroundReadNoDeadline
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
=== RUN TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== PAUSE TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=false
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=false/body=true
|
||||
=== CONT TestServerBackgroundReadNoDeadline/tls=true/body=false
|
||||
--- PASS: TestServerBackgroundReadNoDeadline (0.00s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=false/body=true (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=false (0.71s)
|
||||
--- PASS: TestServerBackgroundReadNoDeadline/tls=true/body=true (0.71s)
|
||||
=== RUN TestServerTLSHandshakeReadDeadline
|
||||
2026/09/15 15:55:04 http: TLS handshake error from 127.0.0.1:33250: read tcp 127.0.0.1:42477->127.0.0.1:33250: i/o timeout
|
||||
--- PASS: TestServerTLSHandshakeReadDeadline (0.21s)
|
||||
=== RUN TestServerConnStateHook
|
||||
=== RUN TestServerConnStateHook/tls=false
|
||||
=== RUN TestServerConnStateHook/tls=true
|
||||
--- PASS: TestServerConnStateHook (0.01s)
|
||||
--- PASS: TestServerConnStateHook/tls=false (0.00s)
|
||||
--- PASS: TestServerConnStateHook/tls=true (0.01s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.42s)
|
||||
=== RUN TestServerEarlyBodyClose
|
||||
=== RUN TestServerEarlyBodyClose/tls=false
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=false
|
||||
=== RUN TestServerEarlyBodyClose/tls=true
|
||||
=== PAUSE TestServerEarlyBodyClose/tls=true
|
||||
=== CONT TestServerEarlyBodyClose/tls=false
|
||||
=== CONT TestServerEarlyBodyClose/tls=true
|
||||
--- PASS: TestServerEarlyBodyClose (0.00s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=false (0.31s)
|
||||
--- PASS: TestServerEarlyBodyClose/tls=true (0.31s)
|
||||
=== RUN TestServerPipelinedDeadline
|
||||
=== RUN TestServerPipelinedDeadline/tls=false
|
||||
=== RUN TestServerPipelinedDeadline/tls=true
|
||||
--- PASS: TestServerPipelinedDeadline (1.35s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=false (0.67s)
|
||||
--- PASS: TestServerPipelinedDeadline/tls=true (0.68s)
|
||||
=== RUN TestServerHijackedDeadline
|
||||
=== RUN TestServerHijackedDeadline/tls=false
|
||||
=== PAUSE TestServerHijackedDeadline/tls=false
|
||||
=== RUN TestServerHijackedDeadline/tls=true
|
||||
=== PAUSE TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=true
|
||||
=== CONT TestServerHijackedDeadline/tls=false
|
||||
--- PASS: TestServerHijackedDeadline (0.00s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=false (0.70s)
|
||||
--- PASS: TestServerHijackedDeadline/tls=true (0.71s)
|
||||
=== RUN TestServerContinuousDownload
|
||||
=== RUN TestServerContinuousDownload/tls=false
|
||||
=== PAUSE TestServerContinuousDownload/tls=false
|
||||
=== RUN TestServerContinuousDownload/tls=true
|
||||
=== PAUSE TestServerContinuousDownload/tls=true
|
||||
=== CONT TestServerContinuousDownload/tls=false
|
||||
=== CONT TestServerContinuousDownload/tls=true
|
||||
=== NAME TestServerContinuousDownload/tls=false
|
||||
server_deadline_test.go:624: continuous download 1.327951834s > idle 300ms
|
||||
=== NAME TestServerContinuousDownload/tls=true
|
||||
server_deadline_test.go:624: continuous download 1.320759709s > idle 300ms
|
||||
--- PASS: TestServerContinuousDownload (0.00s)
|
||||
--- PASS: TestServerContinuousDownload/tls=false (1.33s)
|
||||
--- PASS: TestServerContinuousDownload/tls=true (1.33s)
|
||||
=== RUN TestServerDefaultIdleLongDownload
|
||||
server_deadline_test.go:631: set SILO_TEST_LONG_UPLOAD=1 for >30s default-idle transfer regressions
|
||||
--- SKIP: TestServerDefaultIdleLongDownload (0.00s)
|
||||
=== RUN TestNewServer
|
||||
--- PASS: TestNewServer (0.00s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 14.683s
|
||||
@@ -0,0 +1,10 @@
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout/standard-net-http
|
||||
r8_baseline_test.go:56: request rejected after header timeout: unexpected EOF
|
||||
=== RUN TestReviewR8AbsoluteHeaderTimeout/silo-listener
|
||||
r8_baseline_test.go:56: request rejected after header timeout: unexpected EOF
|
||||
--- PASS: TestReviewR8AbsoluteHeaderTimeout (0.80s)
|
||||
--- PASS: TestReviewR8AbsoluteHeaderTimeout/standard-net-http (0.40s)
|
||||
--- PASS: TestReviewR8AbsoluteHeaderTimeout/silo-listener (0.40s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 1.312s
|
||||
@@ -0,0 +1,186 @@
|
||||
[
|
||||
{
|
||||
"name": "vet-final",
|
||||
"command": [
|
||||
"go",
|
||||
"vet",
|
||||
"./internal/deadlineconn",
|
||||
"./internal/http"
|
||||
],
|
||||
"started_at_utc": "2026-09-15T16:04:26.504181+00:00",
|
||||
"exit_code": 0,
|
||||
"log": "docs/investigations/r8/evidence/vet-final.log",
|
||||
"log_sha256": "521e3dbf0e63e910c0025f52abf592799fe3a9e9329a7fc33cb9938df5578036"
|
||||
},
|
||||
{
|
||||
"name": "tidy-final",
|
||||
"command": [
|
||||
"go",
|
||||
"mod",
|
||||
"tidy",
|
||||
"-diff"
|
||||
],
|
||||
"started_at_utc": "2026-09-15T16:04:26.810955+00:00",
|
||||
"exit_code": 0,
|
||||
"log": "docs/investigations/r8/evidence/tidy-final.log",
|
||||
"log_sha256": "3ad6ef5392ed3ed22d5b0fc1d5e04665208487b3fb168910457b8197ab507471"
|
||||
},
|
||||
{
|
||||
"name": "whitespace-final",
|
||||
"command": [
|
||||
"git",
|
||||
"diff",
|
||||
"--check"
|
||||
],
|
||||
"started_at_utc": "2026-09-15T16:04:26.979546+00:00",
|
||||
"exit_code": 0,
|
||||
"log": "docs/investigations/r8/evidence/whitespace-final.log",
|
||||
"log_sha256": "fa77ab6dcf895a30623113e37b6ee812c6cd35b0cbb9693a0c18de550e6b1cf6"
|
||||
},
|
||||
{
|
||||
"name": "linux-race-final",
|
||||
"command": "docker run --rm ... golang:1.27.1-bookworm go test -p 2 -race ./internal/deadlineconn ./internal/http -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "linux/arm64",
|
||||
"log": "docs/investigations/r8/evidence/linux-race-final.log",
|
||||
"log_sha256": "484577f3b3820ecfc078b38dd808e048f52704a8c3ffc0dad9100bff26ead1f3"
|
||||
},
|
||||
{
|
||||
"name": "darwin-race-final",
|
||||
"command": "go test -race ./internal/deadlineconn ./internal/http -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/darwin-race-final.log",
|
||||
"log_sha256": "e7f0bac82e1eb346ff53422bb2426995bcb7d5d06b1d81c1bb3cc8c2dcdc7774"
|
||||
},
|
||||
{
|
||||
"name": "review-refinements",
|
||||
"command": "go test -race ./internal/http ./internal/deadlineconn -run ^Test(ServerHTTP2Deadlines|StrictReadDeadlineRepeatedRenewal)$ -count=3 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/review-refinements.log",
|
||||
"log_sha256": "c9b46f946cedcca88b8ed3dc7e465a4ad7836b4add338e42db3da7572be6a83b"
|
||||
},
|
||||
{
|
||||
"name": "original-reproducer-fixed",
|
||||
"command": "go test -overlay=/Users/vonng/tmp/silo-r8-01a0a5b9/baseline-overlay.json ./internal/http -run ^TestReviewR8AbsoluteHeaderTimeout$ -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/original-reproducer-fixed.log",
|
||||
"log_sha256": "e787f5e5ad826518a39fdebbb43d28b6ceab36ed8e32267cf3a450af31ce9844"
|
||||
},
|
||||
{
|
||||
"name": "default-30s-transfers",
|
||||
"command": "SILO_TEST_LONG_UPLOAD=1 go test ./internal/http -run ^TestServerDefaultIdleLong -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/default-30s-transfers.log",
|
||||
"log_sha256": "378defff78ae565e95d52830e5b11c1a01a0a11efc14c2822228ca366df58bc3"
|
||||
},
|
||||
{
|
||||
"name": "grid",
|
||||
"command": "go test ./internal/grid -run ^(TestSingleRoundtrip|TestDisconnect)$ -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/grid.log",
|
||||
"log_sha256": "4f677621e0c927e7a37bbd4c8e29ec9c5879ae4aaaf185fe4c3e0a4c41c6ab10"
|
||||
},
|
||||
{
|
||||
"name": "configuration-baseline",
|
||||
"command": "go test -p 2 -overlay=/Users/vonng/tmp/silo-r8-01a0a5b9/config-overlay.json ./cmd -run ^TestServerReadHeaderTimeoutConfig$ -count=1 -v",
|
||||
"exit_code": 1,
|
||||
"expected_failure": true,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/config-baseline.log",
|
||||
"log_sha256": "cc7f7bf345ecfe52db414a785ac3727dc7bf88ec6493de13c1ced1d215e706d8"
|
||||
},
|
||||
{
|
||||
"name": "runtime-v1",
|
||||
"command": "python3 docs/investigations/r8/evidence/runtime_probe.py /Users/vonng/tmp/silo-r8-01a0a5b9/silo-v1 baseline /Users/vonng/tmp/silo-r8-01a0a5b9/runtime-v1",
|
||||
"exit_code": 0,
|
||||
"expected_behavior": "both configured sources still incorrectly accept delayed headers before the binding fix",
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/runtime-v1.json",
|
||||
"log_sha256": "64808fb172e98e81c65c324f5bb967b91a931fa4a757508aa64aaac94b663ce1"
|
||||
},
|
||||
{
|
||||
"name": "lint-initial",
|
||||
"command": "golangci-lint run --allow-serial-runners --timeout=5m ./internal/deadlineconn ./internal/http",
|
||||
"exit_code": 1,
|
||||
"reason": "staticcheck requested the promoted srv.Close selector; fixed without behavior change",
|
||||
"log": "docs/investigations/r8/evidence/lint.log",
|
||||
"log_sha256": "3370461b3b426035790fccc8b862538f3740f3c8455277518872de6befa6990a"
|
||||
},
|
||||
{
|
||||
"name": "configuration-fixed",
|
||||
"command": "go test -p 2 ./cmd -run ^(TestServerReadHeaderTimeoutConfig|TestServerConfigFile)$ -count=1 -v",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/config-fixed.log",
|
||||
"log_sha256": "bf9b7b80ecaa011bcdd4e32d902c0e03d79dfa5f9016f6b43c65678542cc74bb"
|
||||
},
|
||||
{
|
||||
"name": "build-v2",
|
||||
"command": "go build -p 2 -o /Users/vonng/tmp/silo-r8-01a0a5b9/silo-v2 .",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/build-v2.log",
|
||||
"log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
|
||||
},
|
||||
{
|
||||
"name": "lint-final",
|
||||
"command": "golangci-lint run --allow-serial-runners --timeout=5m ./internal/deadlineconn ./internal/http",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/lint-final.log",
|
||||
"log_sha256": "e92606b0bf483111dff0a120c315ea165821348f31365020e2468a0059095c47"
|
||||
},
|
||||
{
|
||||
"name": "runtime-v2",
|
||||
"command": "python3 docs/investigations/r8/evidence/runtime_probe.py /Users/vonng/tmp/silo-r8-01a0a5b9/silo-v2 fixed /Users/vonng/tmp/silo-r8-01a0a5b9/runtime-v2",
|
||||
"exit_code": 0,
|
||||
"platform": "darwin/arm64",
|
||||
"log": "docs/investigations/r8/evidence/runtime-v2.json",
|
||||
"log_sha256": "253b0c192a3267731bfc46545befe0b7fe07cee6f9c5785d10a03ff782189499"
|
||||
},
|
||||
{
|
||||
"name": "configuration-race-extra",
|
||||
"command": "go test -race -p 2 ./cmd -run ^TestServerReadHeaderTimeoutConfig$ -count=1 -v",
|
||||
"exit_code": 1,
|
||||
"blocked_by_environment": "Darwin external linker failed: errno=28 No space left on device",
|
||||
"log": "docs/investigations/r8/evidence/config-race.log",
|
||||
"log_sha256": "4cec7bba425217027939e01cce8d931a0ade98695bfb31529e71a2d748fc6295"
|
||||
},
|
||||
{
|
||||
"name": "legacy-timeout",
|
||||
"command": "/bin/bash /Users/vonng/tmp/silo-r8-01a0a5b9/legacy-timeout/test-timeout-isolated.sh",
|
||||
"exit_code": 255,
|
||||
"status": "supplementary S3 script blocked by host storage capacity; normal PUT independently returns HTTP 507 XMinioStorageFull",
|
||||
"log": "docs/investigations/r8/evidence/legacy-timeout.log",
|
||||
"diagnostic": "docs/investigations/r8/evidence/s3-capacity-probe.json",
|
||||
"log_sha256": "64f838a6a726e5ed2145924ea6bdbfe6ccb4a05dc1977baaa9658e7024888af6"
|
||||
},
|
||||
{
|
||||
"name": "s3-capacity-diagnostic",
|
||||
"command": "python3 /Users/vonng/tmp/silo-r8-01a0a5b9/s3_capacity_probe.py",
|
||||
"exit_code": 0,
|
||||
"observed_http_status": 507,
|
||||
"observed_s3_code": "XMinioStorageFull",
|
||||
"log": "docs/investigations/r8/evidence/s3-capacity-probe.json",
|
||||
"log_sha256": "51111b9d72437089c8642ef2e2c2b02cf9c81227ec9de9857ba938ea280d077a"
|
||||
},
|
||||
{
|
||||
"name": "delivery-whitespace",
|
||||
"command": [
|
||||
"git",
|
||||
"diff",
|
||||
"--check",
|
||||
"9ebe81c1b3611f9cc73e676b5b741c2be62c467a",
|
||||
"--"
|
||||
],
|
||||
"exit_code": 0,
|
||||
"log": "docs/investigations/r8/evidence/delivery-whitespace.log",
|
||||
"log_sha256": "3a403d687fac110e2675ee7f86a4f8b3c095b54fa602535f9805a957c67b92c2",
|
||||
"note": "R8 archive .gitattributes preserves raw .log/.patch whitespace; production and test source still checked normally."
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,16 @@
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.42s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.41s)
|
||||
=== RUN TestServerHTTP2Deadlines
|
||||
--- PASS: TestServerHTTP2Deadlines (0.42s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/http 3.003s
|
||||
=== RUN TestStrictReadDeadlineRepeatedRenewal
|
||||
--- PASS: TestStrictReadDeadlineRepeatedRenewal (0.90s)
|
||||
=== RUN TestStrictReadDeadlineRepeatedRenewal
|
||||
--- PASS: TestStrictReadDeadlineRepeatedRenewal (0.90s)
|
||||
=== RUN TestStrictReadDeadlineRepeatedRenewal
|
||||
--- PASS: TestStrictReadDeadlineRepeatedRenewal (0.90s)
|
||||
PASS
|
||||
ok github.com/minio/minio/internal/deadlineconn 4.915s
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"binary": "/Users/vonng/tmp/silo-r8-01a0a5b9/silo-v1",
|
||||
"binary_sha256": "ed8d30cb40832f854bd82b083b9d1ec3ee16a35598416a54ef2d48bde8384ffc",
|
||||
"expected_rejection": false,
|
||||
"cases": [
|
||||
{
|
||||
"source": "flag",
|
||||
"header_timeout_ms": 100,
|
||||
"idle_timeout_ms": 2000,
|
||||
"header_completion_delay_ms": 400,
|
||||
"rejected": false,
|
||||
"status": "HTTP/1.1 200 OK",
|
||||
"elapsed_seconds": 0.401,
|
||||
"still_alive": true
|
||||
},
|
||||
{
|
||||
"source": "environment",
|
||||
"header_timeout_ms": 100,
|
||||
"idle_timeout_ms": 2000,
|
||||
"header_completion_delay_ms": 400,
|
||||
"rejected": false,
|
||||
"status": "HTTP/1.1 200 OK",
|
||||
"elapsed_seconds": 0.408,
|
||||
"still_alive": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"binary": "/Users/vonng/tmp/silo-r8-01a0a5b9/silo-v2",
|
||||
"binary_sha256": "6b982de3262c25e326280c739b4275444cf80c3eacae48f0942aa18fbb7cd654",
|
||||
"expected_rejection": true,
|
||||
"cases": [
|
||||
{
|
||||
"source": "flag",
|
||||
"header_timeout_ms": 100,
|
||||
"idle_timeout_ms": 2000,
|
||||
"header_completion_delay_ms": 400,
|
||||
"rejected": true,
|
||||
"status": "",
|
||||
"elapsed_seconds": 0.403,
|
||||
"still_alive": true
|
||||
},
|
||||
{
|
||||
"source": "environment",
|
||||
"header_timeout_ms": 100,
|
||||
"idle_timeout_ms": 2000,
|
||||
"header_completion_delay_ms": 400,
|
||||
"rejected": true,
|
||||
"status": "",
|
||||
"elapsed_seconds": 0.401,
|
||||
"still_alive": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
"""Probe the compiled SILO CLI on disposable loopback-only single-disk servers."""
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import signal
|
||||
import socket
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import time
|
||||
import urllib.request
|
||||
|
||||
binary = Path(sys.argv[1]).resolve()
|
||||
expected_rejection = sys.argv[2] == 'fixed'
|
||||
output_dir = Path(sys.argv[3]).resolve()
|
||||
output_dir.mkdir(parents=True, exist_ok=True)
|
||||
results = []
|
||||
for source in ('flag', 'environment'):
|
||||
with socket.socket() as reservation:
|
||||
reservation.bind(('127.0.0.1', 0))
|
||||
port = reservation.getsockname()[1]
|
||||
data_dir = tempfile.mkdtemp(prefix=f'r8-{source}-', dir=output_dir)
|
||||
env = {k: v for k, v in os.environ.items() if not k.startswith(('MINIO_', 'SILO_'))}
|
||||
env.update(MINIO_ROOT_USER='r8localtest', MINIO_ROOT_PASSWORD='r8-local-disposable-test-only', MINIO_BROWSER='off')
|
||||
args = [str(binary), 'server', f'--address=127.0.0.1:{port}', '--console-address=127.0.0.1:0', '--idle-timeout=2s']
|
||||
if source == 'flag':
|
||||
args.append('--read-header-timeout=100ms')
|
||||
else:
|
||||
env['MINIO_READ_HEADER_TIMEOUT'] = '100ms'
|
||||
args.append(data_dir)
|
||||
with (output_dir / f'{source}-server.log').open('w') as server_log:
|
||||
proc = subprocess.Popen(args, env=env, stdout=server_log, stderr=subprocess.STDOUT)
|
||||
try:
|
||||
url = f'http://127.0.0.1:{port}/minio/health/live'
|
||||
started = time.monotonic()
|
||||
while True:
|
||||
if proc.poll() is not None:
|
||||
raise RuntimeError(f'{source}: server exited {proc.returncode}; see its log')
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=1) as resp:
|
||||
if resp.status == 200:
|
||||
break
|
||||
except Exception:
|
||||
pass
|
||||
if time.monotonic() - started > 30:
|
||||
raise RuntimeError(f'{source}: startup timed out')
|
||||
time.sleep(0.1)
|
||||
with socket.create_connection(('127.0.0.1', port), timeout=2) as conn:
|
||||
conn.settimeout(3)
|
||||
conn.sendall(b'GET /minio/health/live HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\nX-Slow: ')
|
||||
before = time.monotonic()
|
||||
time.sleep(0.4)
|
||||
try:
|
||||
conn.sendall(b'done\r\n\r\n')
|
||||
data = conn.recv(4096)
|
||||
except (BrokenPipeError, ConnectionResetError):
|
||||
data = b''
|
||||
rejected = not data
|
||||
status_line = data.split(b'\r\n', 1)[0].decode('ascii', 'replace')
|
||||
elapsed = time.monotonic() - before
|
||||
with urllib.request.urlopen(url, timeout=2) as resp:
|
||||
alive = resp.status == 200
|
||||
result = dict(source=source, header_timeout_ms=100, idle_timeout_ms=2000,
|
||||
header_completion_delay_ms=400, rejected=rejected, status=status_line,
|
||||
elapsed_seconds=round(elapsed, 3), still_alive=alive)
|
||||
results.append(result)
|
||||
if rejected != expected_rejection or not alive:
|
||||
raise AssertionError(result)
|
||||
finally:
|
||||
proc.send_signal(signal.SIGTERM)
|
||||
try:
|
||||
proc.wait(timeout=10)
|
||||
except subprocess.TimeoutExpired:
|
||||
proc.kill()
|
||||
proc.wait(timeout=5)
|
||||
report = dict(binary=str(binary), binary_sha256=hashlib.sha256(binary.read_bytes()).hexdigest(),
|
||||
expected_rejection=expected_rejection, cases=results)
|
||||
print(json.dumps(report, indent=2))
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"status": 507,
|
||||
"body": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>XMinioStorageFull</Code><Message>Storage backend has reached its minimum free drive threshold. Please delete a few objects to proceed.</Message><Key>testobject</Key><BucketName>testbucket</BucketName><Resource>/testbucket/testobject</Resource><RequestId>18D58A9DC7CF7668</RequestId><HostId>04c30fe94f97d234a29260401af8d884660258a809670077dfa5454fa24cb0df</HostId></Error>"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
from pathlib import Path
|
||||
import os,subprocess,socket,tempfile,time,urllib.request,urllib.error,signal,json
|
||||
root=Path('/Users/vonng/tmp/silo-r8-01a0a5b9/capacity-probe');root.mkdir(exist_ok=True)
|
||||
with socket.socket() as reservation:
|
||||
reservation.bind(('127.0.0.1',0));port=reservation.getsockname()[1]
|
||||
env={k:v for k,v in os.environ.items() if not k.startswith(('MINIO_','MC_','SILO_'))}
|
||||
env.update(MINIO_ROOT_USER='silo',MINIO_ROOT_PASSWORD='silo1234',MINIO_BROWSER='off',MINIO_CI_CD='1',MC_HOST_silo=f'http://silo:silo1234@127.0.0.1:{port}/')
|
||||
url=f'http://127.0.0.1:{port}'
|
||||
with (root/'server.log').open('w') as log:
|
||||
proc=subprocess.Popen(['/Users/vonng/tmp/silo-r8-01a0a5b9/silo-v2','server',f'--address=127.0.0.1:{port}','--read-header-timeout=5s','--idle-timeout=5s',str(root/'data')],env=env,stdout=log,stderr=subprocess.STDOUT)
|
||||
try:
|
||||
for _ in range(100):
|
||||
try:
|
||||
with urllib.request.urlopen(url+'/minio/health/live',timeout=1):break
|
||||
except Exception:time.sleep(.1)
|
||||
cli=['/opt/homebrew/bin/mcli','--config-dir',str(root/'mcli')]
|
||||
for args in [['mb','silo/testbucket'],['anonymous','set','public','silo/testbucket']]:
|
||||
r=subprocess.run(cli+args,env=env,text=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT);assert r.returncode==0,r.stdout
|
||||
req=urllib.request.Request(url+'/testbucket/testobject',data=b'x'*30,method='PUT')
|
||||
try:
|
||||
with urllib.request.urlopen(req,timeout=10) as response:result={'status':response.status,'body':response.read().decode()}
|
||||
except urllib.error.HTTPError as error:result={'status':error.code,'body':error.read().decode()}
|
||||
print(json.dumps(result,indent=2))
|
||||
finally:
|
||||
proc.send_signal(signal.SIGTERM)
|
||||
try:proc.wait(timeout=10)
|
||||
except subprocess.TimeoutExpired:proc.kill();proc.wait()
|
||||
@@ -0,0 +1,3 @@
|
||||
$ go mod tidy -diff
|
||||
|
||||
exit_code=0
|
||||
@@ -0,0 +1,3 @@
|
||||
$ go vet ./internal/deadlineconn ./internal/http
|
||||
|
||||
exit_code=0
|
||||
@@ -0,0 +1,3 @@
|
||||
$ git diff --check
|
||||
|
||||
exit_code=0
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"created_at_utc": "2026-09-15T16:17:15.174123+00:00",
|
||||
"baseline_sha": "9ebe81c1b3611f9cc73e676b5b741c2be62c467a",
|
||||
"branch": "codex/r8-http-header-deadline",
|
||||
"binding": "This manifest is committed with the source files it hashes; final local commit ID is reported in delivery.",
|
||||
"accepted_plan": "plan-v2.md",
|
||||
"plan_sha256": "426127ed9fb08aeddf8259ebdc4b1c24ebec8cda751a970ed99338a44b065f4c",
|
||||
"production_diff_sha256": "92d3f43aa2bb4c636da830fc00c8a2939524d69bb8ab4bda4c4b284f043d3cf3",
|
||||
"production_files": {
|
||||
"cmd/common-main.go": "f8777fe8a07d175aceee07b4dd13792b2384449c404c004c38a06893be997843",
|
||||
"cmd/server-main.go": "04c265de211412ba0297396928096d7f2d971244a957a3126154846035263514",
|
||||
"internal/deadlineconn/deadlineconn.go": "b9272ef640f1d4403b3d0af6cdbaba9186c51ad9a0226dfe449e8ef738e1ec4b",
|
||||
"internal/http/listener.go": "49628575367f6ab9b6986caf594726d74d370f7d2ac4eed582903600b6eb3fa2",
|
||||
"internal/http/server.go": "b7b0355f2781f8c5f7c77bc910cd4180cd3e5f22a87de41bd35ef119d36b4cdf"
|
||||
},
|
||||
"test_files": {
|
||||
"cmd/server_deadline_config_test.go": "1013157f83baa5f7882ec2d41c7b1fccb9e05fb418d0fa61263953037c9698c4",
|
||||
"internal/deadlineconn/deadlineconn_strict_test.go": "f405690c9ff044595f48323d68f4a9b33ce695b3ad6820f54f17151067bfae5e",
|
||||
"internal/http/dial_deadline_linux_test.go": "0939d05b72a09760d53fcdf249775989e3f89bca824b9961d0b2a657ebfdf41e",
|
||||
"internal/http/server_deadline_test.go": "a6e687b3904a876fa92a4c5b86453159f3e5a38a4b9412dc213c7772f47fbf0b"
|
||||
},
|
||||
"dependencies_unchanged": {
|
||||
"go.mod": "8351bb86377a8deed95fd0bd67c1e363e11d33f8da7631cea8f68cea11259976",
|
||||
"go.sum": "2287ce975cab91f92f59a3b6e164d49325f141f35d480b8c3d23f796df3772b2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
# R8 plan v1 — phase-aware read deadline preservation
|
||||
|
||||
## Baseline and authorization
|
||||
|
||||
- Worktree: `/Users/vonng/.codex/worktrees/3bae/silo`; HEAD and origin/main: `9ebe81c1b3611f9cc73e676b5b741c2be62c467a` (live checked).
|
||||
- Go: go1.27.1 darwin/arm64; CLI: Claude Code 2.1.270. No production implementation has started.
|
||||
- Root AGENTS.md is ignored and was absent from the generated worktree; copied the actual primary checkout guide into this worktree. Maintained PGSTY stack and inexpensive compatibility govern this repair.
|
||||
- GitHub open PRs: #184 and #187, neither changes R8. No R8 implementation PR found.
|
||||
- Parent workflow permits research and temporary reproductions before consensus; ordinary implementation after explicit same-version Codex/Opus consensus. Merge, publish and deployment excluded.
|
||||
|
||||
## Evidence and cause
|
||||
|
||||
`evidence/baseline.log` is a fresh real TCP run on this SHA with the parent's temporary Go overlay. Header limit 100ms, connection idle 2s, header finishes at 400ms. Standard net/http rejects; SILO returns HTTP 204. This is inherited DeadlineConn behavior, not a new SILO option.
|
||||
|
||||
`DeadlineConn.Read` calls `setReadDeadline`, replacing an explicit future deadline by now+readIdle+250ms. Past deadlines and explicit zero are already special (abort and disable respectively). `cmd/server-main.go` sets ReadTimeout and WriteTimeout to IdleTimeout as well as setting TCPOptions.IdleTimeout. Therefore globally preserving every explicit deadline makes normal HTTP/1 uploads time out at the idle duration in total.
|
||||
|
||||
Current Go source examined: `/opt/homebrew/Cellar/go/1.27.1/libexec/src/net/http/server.go` and `net/http/internal/http2/server.go`. Public semantics: https://pkg.go.dev/net/http#Server and https://pkg.go.dev/net#Conn .
|
||||
|
||||
- StateNew occurs before serving; TLS read timeout is min positive header/read/write timeouts.
|
||||
- HTTP/1 reads under the configured header deadline. After parsing/validation, readRequest sets wholeReqDeadline based on ReadTimeout, then the serving loop calls StateActive (also on malformed input, followed by rejection).
|
||||
- With a body, net/http registers an EOF callback; without a body it immediately calls startBackgroundRead. That clears the read deadline. Body EOF also clears the deadline before launching background disconnect detection.
|
||||
- StateIdle happens after finishRequest/abortPendingRead, before setting keep-alive deadline and peeking the next request. The next header deadline is then installed. Thus StateIdle can restore strictness for both waiting and reading the next header.
|
||||
- TLS wrapping remains `tls.Conn -> DeadlineConn -> TCPConn`; use tls.Conn.NetConn to reach the wrapper in the state callback.
|
||||
- TLS can negotiate h2 (`cmd/utils.go`). HTTP/2 uses per-stream ReadTimeout (currently an absolute body limit), clears the underlying read deadline after handshake, and has independent connection state hooks. Do not impose a connection-wide request timer on multiplexed h2. Preserve this existing behavior; test HTTP/2 smoke and record that its preexisting absolute stream timeout is not fixed by this R8 HTTP/1 change.
|
||||
|
||||
## Options and decision
|
||||
|
||||
1. Globally clamp all future deadlines: too broad; turns ReadTimeout=idle into a total HTTP/1 upload limit, changes Linux internode caller behavior.
|
||||
2. Remove ReadTimeout and interpret zero as rolling idle: wrong; zero is also how net/http disables background read deadlines, and a long handler could be spuriously canceled. H2 loses its existing per-stream read timeout.
|
||||
3. Body-reader/ResponseController timer wrappers: possible but introduce body/drain/EOF bookkeeping, affect buffered/chunked reads, require h2-specific treatment and rewrite behavior beyond the header bug.
|
||||
4. Selected: opt-in preservation of explicit read deadlines during HTTP/1 header/keep-alive/TLS phases; retain legacy rolling reads during the HTTP/1 body/handler phase. Keep generic DeadlineConn default and existing production timeout configuration.
|
||||
|
||||
## Concrete implementation
|
||||
|
||||
### internal/deadlineconn/deadlineconn.go
|
||||
|
||||
- Add mutex-protected last explicit read deadline and a `readDeadlineStrict` boolean (default false). Existing constructors and internode callers retain rolling semantics.
|
||||
- Store the explicit read timestamp in SetReadDeadline and SetDeadline; preserve zero/abort flags and immediate forwarding to net.Conn.
|
||||
- Expose a small `SetReadDeadlineStrict(bool)` method, documented as toggling whether automatic idle renewal may extend explicit deadlines. Lock the same mutex and reset readSetAt so the next read applies the current mode.
|
||||
- In setReadDeadline, recheck abort/inf under the lock, keep existing throttling and idle slack, and when strict and explicit is nonzero take min(idleCandidate, explicit). Never add 250ms slack to the absolute limit. Deadline updates themselves are never throttled.
|
||||
- Writes remain unchanged. Expired explicit times remain expired when strict. Existing explicit zero always disables read renewal, and explicit past time keeps abort semantics.
|
||||
|
||||
### internal/http/listener.go
|
||||
|
||||
- Keep the accepted concrete type *DeadlineConn, read/write idle durations and unwrap compatibility.
|
||||
- Enable strict read mode before returning each newly accepted connection. This covers initial HTTP headers and TLS handshake reads, including a normal net/http Server using this listener.
|
||||
|
||||
### internal/http/server.go
|
||||
|
||||
- In Init, compose (do not drop) the caller's existing ConnState hook.
|
||||
- Find the *DeadlineConn, unwrapping one *tls.Conn with NetConn when necessary.
|
||||
- For HTTP/1 StateActive: turn strict mode off, retaining the current rolling ReadTimeout=idle semantics for bodies and long uploads. Do so before the caller's state hook.
|
||||
- For StateNew/StateIdle: turn strict mode on. Ignore other states.
|
||||
- For negotiated HTTP/2, skip per-request phase changes; after handshake raw zero deadlines stay disabled, and stream timeouts remain native net/http behavior.
|
||||
- Do not remove ReadTimeout/WriteTimeout or change flags. Add a short explanatory comment around the production timeout setup if useful.
|
||||
|
||||
## Failure paths and compatibility
|
||||
|
||||
- Slow/incomplete headers (including byte trickles across many 250ms update intervals): explicit cap must hold.
|
||||
- Continuous uploads: request duration can exceed idle; underlying socket reads renew with existing +250ms slack. A truly stalled socket body read times out. No promise of application CPU/storage wait deadlines.
|
||||
- Empty and completed bodies: net/http's zero deadline must keep disconnect detection from timing out otherwise active long handlers.
|
||||
- Keep-alive: caller sets idle wait, then next header absolute timeout; both remain capped after StateIdle.
|
||||
- TLS: read handshake cap cannot be renewed; completed handshake transitions into fresh HTTP header cap. Write-side handshake deadline behavior is unchanged/out of this read-side defect.
|
||||
- Chunked encoding/Expect 100-continue/early close: preserve existing generic read path; exercise actual requests.
|
||||
- Explicit body deadlines retain historical SILO behavior (future can renew; past abort works); this patch does not promise a generic net.Conn behavior migration.
|
||||
- Linux internode DriveOPTimeout caller uses default mode false; same read/write/zero/abort behavior. Grid raw upgrade still unwraps the same concrete type; TLS upgraded connections stay in legacy body mode. No data/format migration or stored-state rewriting.
|
||||
|
||||
## Validation matrix
|
||||
|
||||
1. Deterministic recording net.Conn tests: strict future cap, strict far-future deadline bounded by idle, no slack on cap, mode transition, default rolling behavior, SetDeadline/read direction separation, zero disable, past cancellation, explicit updates resetting throttle, expired future deadline, concurrent Read/SetReadDeadline (race).
|
||||
2. Real TCP HTTP/1: initial slow header; byte trickle longer than header timeout; successful ordinary request; keep-alive idle and second slow header; continuous long body exceeding scaled idle; truly idle body; chunked body and Expect 100-continue; early body close followed by next request where supported; handler spending >idle after no body/after EOF without request context cancellation.
|
||||
3. Run HTTP/1 body and header matrix through TLS (real tls.Client), plus stalled TLS ClientHello/handshake. Test existing ConnState hook chaining.
|
||||
4. HTTP/2 over real TLS smoke and native timeout preservation; explicitly no cross-stream socket timeout introduced.
|
||||
5. DeadlineConn existing tests and internal/http full suite under race, targeted grid roundtrips/disconnect; Linux compile for modified packages and default caller behavior fixture (Darwin does not exercise dial_linux at runtime).
|
||||
6. One explicit >30s continuously progressing upload using production default idle, both cleartext and TLS HTTP/1 if feasible, to guard against an unintended total-30s cap. This may be opt-in to keep the routine suite fast, but run it for acceptance.
|
||||
7. Scope tests, gofmt, git diff --check. If Linux runtime available without unrelated environment changes, run focused tests there; otherwise report compile vs runtime separately.
|
||||
|
||||
## Work and delivery
|
||||
|
||||
Estimate: 1–3 engineer days including design review and matrix; expected production diff tens of lines plus tests. Isolated `codex/` branch after agreement. Save raw Opus JSONL and stderr outside Git; keep prompt, exact plan SHA256, actual assistant model identity, effort, reviewer text, issue dispositions and consensus record here. No commit/push required for local review, and no merge/release/deploy is authorized in this phase.
|
||||
|
||||
Codex position: recommend option 4. Opus must independently verify the phase ordering, EOF/background behavior, keep-alive, TLS/H2 and shared-caller boundaries. Any blocking disagreement requires a revised plan and another review; a failed/limited/wrong-model response is not consensus.
|
||||
@@ -0,0 +1,115 @@
|
||||
# R8 plan v2 — configuration propagation and phase-aware read deadline preservation
|
||||
|
||||
## Baseline and authorization
|
||||
|
||||
- Worktree: `/Users/vonng/.codex/worktrees/3bae/silo`; HEAD and origin/main: `9ebe81c1b3611f9cc73e676b5b741c2be62c467a` (live checked).
|
||||
- Go: go1.27.1 darwin/arm64; CLI: Claude Code 2.1.270. V1 connection implementation exists after v1 consensus; the additional configuration binding below is NOT implemented yet.
|
||||
- Root AGENTS.md is ignored and was absent from the generated worktree; copied the actual primary checkout guide into this worktree. Maintained PGSTY stack and inexpensive compatibility govern this repair.
|
||||
- GitHub open PRs: #184 and #187, neither changes R8. No R8 implementation PR found. Local branch is `codex/r8-http-header-deadline`; no commits/push/merge/release/deployment.
|
||||
- Parent workflow permits research and temporary reproductions before consensus; ordinary implementation after explicit same-version Codex/Opus consensus. Merge, publish and deployment excluded.
|
||||
|
||||
## V2 revision boundary and new evidence
|
||||
|
||||
This v2 is the complete plan: retain the agreed v1 connection design below and add the missing CLI/env-to-server-context assignment. V1 approval does not authorize this newly discovered binding change. The parent explicitly confirmed that v2 needs its own same-version Opus agreement before the binding is edited.
|
||||
|
||||
Fresh temporary CLI tests are saved in `evidence/config-baseline.log` and `evidence/config_baseline_test.go.txt`. They invoke the real `serverCmd.Flags` through a `cli.App`, then the actual `buildServerCtxt`; no production configuration code was changed to obtain the evidence. The CLI reports default=30s, flag=100ms, env=170ms, flag-over-env=80ms, YAML+flag=100ms, negative=-1s. The context remains 0 in all those cases. Explicit zero naturally remains 0. Initial fixture mistakes (wrong variable name, empty env vs absent env) are saved separately and are not product findings.
|
||||
|
||||
Root cause: `cmd/common-main.go:447` transfers IdleTimeout but omits ReadHeaderTimeout. The only production reads of that field are the Server.UseReadHeaderTimeout call. Thus after the v1 connection fix, a real process still ignores the configured header limit and Go falls back from zero ReadHeaderTimeout to ReadTimeout=idle. Defaults accidentally appear correct only when the two durations match (30s).
|
||||
|
||||
V2 addition is one assignment: `ctxt.ReadHeaderTimeout = ctx.Duration("read-header-timeout")` next to IdleTimeout. No new option/schema, dependency, storage change, or new timeout policy. Preserve the current cli library's precedence and error checking, including the fact that an explicitly empty environment duration is invalid.
|
||||
|
||||
## Evidence and cause
|
||||
|
||||
`evidence/baseline.log` is a fresh real TCP run on this SHA with the parent's temporary Go overlay. Header limit 100ms, connection idle 2s, header finishes at 400ms. Standard net/http rejects; SILO returns HTTP 204. This is inherited DeadlineConn behavior, not a new SILO option.
|
||||
|
||||
`DeadlineConn.Read` calls `setReadDeadline`, replacing an explicit future deadline by now+readIdle+250ms. Past deadlines and explicit zero are already special (abort and disable respectively). `cmd/server-main.go` sets ReadTimeout and WriteTimeout to IdleTimeout as well as setting TCPOptions.IdleTimeout. Therefore globally preserving every explicit deadline makes normal HTTP/1 uploads time out at the idle duration in total.
|
||||
|
||||
Current Go source examined: `/opt/homebrew/Cellar/go/1.27.1/libexec/src/net/http/server.go` and `net/http/internal/http2/server.go`. Public semantics: https://pkg.go.dev/net/http#Server and https://pkg.go.dev/net#Conn .
|
||||
|
||||
- StateNew occurs before serving; TLS read timeout is min positive header/read/write timeouts.
|
||||
- HTTP/1 reads under the configured header deadline. After parsing/validation, readRequest sets wholeReqDeadline based on ReadTimeout, then the serving loop calls StateActive (also on malformed input, followed by rejection).
|
||||
- With a body, net/http registers an EOF callback; without a body it immediately calls startBackgroundRead. That clears the read deadline. Body EOF also clears the deadline before launching background disconnect detection.
|
||||
- StateIdle happens after finishRequest/abortPendingRead, before setting keep-alive deadline and peeking the next request. The next header deadline is then installed. Thus StateIdle can restore strictness for both waiting and reading the next header.
|
||||
- TLS wrapping remains `tls.Conn -> DeadlineConn -> TCPConn`; use tls.Conn.NetConn to reach the wrapper in the state callback.
|
||||
- TLS can negotiate h2 (`cmd/utils.go`). HTTP/2 uses per-stream ReadTimeout (currently an absolute body limit), clears the underlying read deadline after handshake, and has independent connection state hooks. Do not impose a connection-wide request timer on multiplexed h2. Preserve this existing behavior; test HTTP/2 smoke and record that its preexisting absolute stream timeout is not fixed by this R8 HTTP/1 change.
|
||||
|
||||
## Options and decision
|
||||
|
||||
1. Globally clamp all future deadlines: too broad; turns ReadTimeout=idle into a total HTTP/1 upload limit, changes Linux internode caller behavior.
|
||||
2. Remove ReadTimeout and interpret zero as rolling idle: wrong; zero is also how net/http disables background read deadlines, and a long handler could be spuriously canceled. H2 loses its existing per-stream read timeout.
|
||||
3. Body-reader/ResponseController timer wrappers: possible but introduce body/drain/EOF bookkeeping, affect buffered/chunked reads, require h2-specific treatment and rewrite behavior beyond the header bug.
|
||||
4. Selected: opt-in preservation of explicit read deadlines during HTTP/1 header/keep-alive/TLS phases; retain legacy rolling reads during the HTTP/1 body/handler phase. Keep generic DeadlineConn default and existing production timeout configuration.
|
||||
|
||||
## Concrete implementation
|
||||
|
||||
### cmd/common-main.go (V2 addition, pending new consensus)
|
||||
|
||||
- Add the single assignment shown above in buildServerCtxt beside the other TCP/HTTP duration options.
|
||||
- Default 30s becomes effective independently of idle. An explicit positive header timeout is honored; flag precedence over env stays in the CLI. Zero retains Go's fallback to ReadTimeout; a negative value disables Go's header cap. Socket idle and past/zero DeadlineConn rules remain as described below.
|
||||
- YAML merging does not contain or overwrite these duration fields; do not invent a YAML option. Test that CLI/env values survive the existing merge.
|
||||
- This expands the user-visible behavior changes listed in v1: previously ignored defaults/overrides now take effect. With idle customized or disabled, header timeout can therefore differ from prior observed behavior, exactly as the declared option intends. No new migration or confirmation required for the ordinary code fix after consensus.
|
||||
|
||||
### internal/deadlineconn/deadlineconn.go
|
||||
|
||||
- Add mutex-protected last explicit read deadline and a `readDeadlineStrict` boolean (default false). Existing constructors and internode callers retain rolling semantics.
|
||||
- Store the explicit read timestamp in SetReadDeadline and SetDeadline; preserve zero/abort flags and immediate forwarding to net.Conn.
|
||||
- Expose a small `SetReadDeadlineStrict(bool)` method, documented as toggling whether automatic idle renewal may extend explicit deadlines. Lock the same mutex and reset readSetAt so the next read applies the current mode.
|
||||
- In setReadDeadline, recheck abort/inf under the lock, keep existing throttling and idle slack, and when strict and explicit is nonzero take min(idleCandidate, explicit). Never add 250ms slack to the absolute limit. Deadline updates themselves are never throttled.
|
||||
- Writes remain unchanged. Expired explicit times remain expired when strict. Existing explicit zero always disables read renewal, and explicit past time keeps abort semantics.
|
||||
|
||||
### internal/http/listener.go
|
||||
|
||||
- Keep the accepted concrete type *DeadlineConn, read/write idle durations and unwrap compatibility.
|
||||
- Enable strict read mode before returning each newly accepted connection. This covers initial HTTP headers and TLS handshake reads, including a normal net/http Server using this listener.
|
||||
|
||||
### internal/http/server.go
|
||||
|
||||
- In Init, compose (do not drop) the caller's existing ConnState hook.
|
||||
- Find the *DeadlineConn, unwrapping one *tls.Conn with NetConn when necessary.
|
||||
- For HTTP/1 StateActive: turn strict mode off, retaining the current rolling ReadTimeout=idle semantics for bodies and long uploads. Do so before the caller's state hook.
|
||||
- For StateNew/StateIdle: turn strict mode on. Ignore other states.
|
||||
- For negotiated HTTP/2, skip per-request phase changes; after handshake raw zero deadlines stay disabled, and stream timeouts remain native net/http behavior.
|
||||
- Do not remove ReadTimeout/WriteTimeout or change flags. Add a short explanatory comment around the production timeout setup if useful.
|
||||
|
||||
## Failure paths and compatibility
|
||||
|
||||
- Slow/incomplete headers (including byte trickles across many 250ms update intervals): explicit cap must hold.
|
||||
- Continuous uploads: request duration can exceed idle; underlying socket reads renew with existing +250ms slack. A truly stalled socket body read times out. No promise of application CPU/storage wait deadlines.
|
||||
- Empty and completed bodies: net/http's zero deadline must keep disconnect detection from timing out otherwise active long handlers.
|
||||
- Keep-alive: caller sets idle wait, then next header absolute timeout; both remain capped after StateIdle.
|
||||
- TLS: read handshake cap cannot be renewed; completed handshake transitions into fresh HTTP header cap. Write-side handshake deadline behavior is unchanged/out of this read-side defect.
|
||||
- Chunked encoding/Expect 100-continue/early close: preserve existing generic read path; exercise actual requests.
|
||||
- Explicit body deadlines retain historical SILO behavior (future can renew; past abort works); this patch does not promise a generic net.Conn behavior migration.
|
||||
- Linux internode DriveOPTimeout caller uses default mode false; same read/write/zero/abort behavior. Grid raw upgrade still unwraps the same concrete type; TLS upgraded connections stay in legacy body mode. No data/format migration or stored-state rewriting.
|
||||
|
||||
## Validation matrix
|
||||
|
||||
V2 adds two separately evidenced chains:
|
||||
|
||||
- Configuration: use the real CLI parser and actual buildServerCtxt; cover default, explicit flag, environment, flag-over-env, YAML merge, zero and negative duration. Run focused `./cmd` tests. Verify parser output and context output independently.
|
||||
- Compiled process: build SILO on this exact worktree; launch disposable single-disk servers bound only to 127.0.0.1 with browser disabled and isolated test credentials/data. For both flag and env source, set header=100ms, idle=2s, finish a real health request header after 400ms. Preserve pre-binding evidence (v1 binary still accepts), and require the v2 binary to reject while a subsequent ordinary health request still succeeds. Stop only the child processes this test started. Use `evidence/runtime_probe.py`, retaining binary SHA256 and logs in the task's temp directory. This is local runtime verification, not deployment or S3 production acceptance.
|
||||
|
||||
The retained connection matrix follows:
|
||||
|
||||
1. Deterministic recording net.Conn tests: strict future cap, strict far-future deadline bounded by idle, no slack on cap, mode transition, default rolling behavior, SetDeadline/read direction separation, zero disable, past cancellation, explicit updates resetting throttle, expired future deadline, concurrent Read/SetReadDeadline (race).
|
||||
2. Real TCP HTTP/1: initial slow header; byte trickle longer than header timeout; successful ordinary request; keep-alive idle and second slow header; continuous long body exceeding scaled idle; truly idle body; chunked body and Expect 100-continue; early body close followed by next request where supported; handler spending >idle after no body/after EOF without request context cancellation.
|
||||
3. Run HTTP/1 body and header matrix through TLS (real tls.Client), plus stalled TLS ClientHello/handshake. Test existing ConnState hook chaining.
|
||||
4. HTTP/2 over real TLS smoke and native timeout preservation; explicitly no cross-stream socket timeout introduced.
|
||||
5. DeadlineConn existing tests and internal/http full suite under race, targeted grid roundtrips/disconnect; Linux compile for modified packages and default caller behavior fixture (Darwin does not exercise dial_linux at runtime).
|
||||
6. One explicit >30s continuously progressing upload using production default idle, both cleartext and TLS HTTP/1 if feasible, to guard against an unintended total-30s cap. This may be opt-in to keep the routine suite fast, but run it for acceptance.
|
||||
7. Scope tests, gofmt, git diff --check. If Linux runtime available without unrelated environment changes, run focused tests there; otherwise report compile vs runtime separately.
|
||||
|
||||
## Work and delivery
|
||||
|
||||
Estimate: 1–3 engineer days including design review and matrix; expected production diff tens of lines plus tests. Isolated `codex/` branch after agreement. Save raw Opus JSONL and stderr outside Git; keep prompt, exact plan SHA256, actual assistant model identity, effort, reviewer text, issue dispositions and consensus record here. No commit/push required for local review, and no merge/release/deploy is authorized in this phase.
|
||||
|
||||
Codex position: recommend option 4 plus the one-line configuration binding; both are needed for the configured HTTP header deadline to work in the actual server. Opus must independently verify the phase ordering, EOF/background behavior, keep-alive, TLS/H2 and shared-caller boundaries. Any blocking disagreement requires a revised plan and another review; a failed/limited/wrong-model response is not consensus.
|
||||
|
||||
## Current v1 implementation evidence and review refinements
|
||||
|
||||
- Actual initial 100ms/400ms standard/SILO TCP comparison passes after the connection fix (`original-reproducer-fixed.log`).
|
||||
- macOS and Linux arm64 full `internal/deadlineconn` + `internal/http` race suites pass. Linux explicitly exercises the optional DriveOPTimeout dialer. Grid roundtrip/disconnect and focused go vet pass.
|
||||
- With default 30s idle, plaintext and TLS HTTP/1 uploads AND downloads continued for 33s and succeeded (`default-30s-transfers.log`).
|
||||
- Nine v1 review notes are individually resolved in `consensus.md`: pipelined parsing test; explicit h2-only TLS negotiation and HTTP/2 response assertions; background EOF and hijack zero semantics; long download coverage; unchanged TLS write-handshake limitation; default internode DriveOPTimeout currently commented out.
|
||||
- The H2 test initially fell back to H1, then the native read/write timers produced differing errors when racing. Both fixture problems were fixed, retained as raw evidence, and the final test isolates the read timer by clearing the stream write deadline; checks concurrent healthy streams and reuse of the same TLS connection. No production H2 behavior changed.
|
||||
- V1 production diff remains exactly the previously reviewed phase-aware design. V2 will not be declared complete until both configuration and connection chains pass. Remaining boundaries: HTTP/2's preexisting absolute per-stream timeout and the legacy TLS handshake write deadline behavior remain outside R8.
|
||||
@@ -0,0 +1,149 @@
|
||||
diff --git a/cmd/common-main.go b/cmd/common-main.go
|
||||
index 393ab17d0..c127759fc 100644
|
||||
--- a/cmd/common-main.go
|
||||
+++ b/cmd/common-main.go
|
||||
@@ -445,6 +445,7 @@ func buildServerCtxt(ctx *cli.Context, ctxt *serverCtxt) (err error) {
|
||||
ctxt.SendBufSize = ctx.Int("send-buf-size")
|
||||
ctxt.RecvBufSize = ctx.Int("recv-buf-size")
|
||||
ctxt.IdleTimeout = ctx.Duration("idle-timeout")
|
||||
+ ctxt.ReadHeaderTimeout = ctx.Duration("read-header-timeout")
|
||||
ctxt.UserTimeout = ctx.Duration("conn-user-timeout")
|
||||
|
||||
if conf := ctx.String("config"); len(conf) > 0 {
|
||||
diff --git a/cmd/server-main.go b/cmd/server-main.go
|
||||
index 48ed0f87d..c8a3a19ca 100644
|
||||
--- a/cmd/server-main.go
|
||||
+++ b/cmd/server-main.go
|
||||
@@ -901,6 +901,8 @@ func serverMain(ctx *cli.Context) {
|
||||
close(globalGridStart)
|
||||
close(globalLockGridStart)
|
||||
|
||||
+ // The HTTP/1 listener preserves absolute header deadlines and renews the
|
||||
+ // body read/write idle limits, so transfers may outlast IdleTimeout.
|
||||
httpServer := xhttp.NewServer(getServerListenAddrs()).
|
||||
UseHandler(setCriticalErrorHandler(corsHandler(handler))).
|
||||
UseTLSConfig(newTLSConfig(getCert)).
|
||||
diff --git a/internal/deadlineconn/deadlineconn.go b/internal/deadlineconn/deadlineconn.go
|
||||
index 95bb43eff..5fa5a1403 100644
|
||||
--- a/internal/deadlineconn/deadlineconn.go
|
||||
+++ b/internal/deadlineconn/deadlineconn.go
|
||||
@@ -34,6 +34,8 @@ type DeadlineConn struct {
|
||||
net.Conn
|
||||
readDeadline time.Duration // sets the read deadline on a connection.
|
||||
readSetAt time.Time
|
||||
+ readExplicit time.Time // last deadline requested by the caller.
|
||||
+ readDeadlineStrict bool // idle renewal must not extend readExplicit.
|
||||
writeDeadline time.Duration // sets the write deadline on a connection.
|
||||
writeSetAt time.Time
|
||||
abortReads, abortWrites atomic.Bool // A deadline was set to indicate caller wanted the conn to time out.
|
||||
@@ -59,17 +61,31 @@ func (c *DeadlineConn) setReadDeadline() {
|
||||
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
- if c.abortReads.Load() {
|
||||
+ if c.abortReads.Load() || c.infReads.Load() {
|
||||
return
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
if now.Sub(c.readSetAt) > updateInterval {
|
||||
- c.Conn.SetReadDeadline(now.Add(c.readDeadline + updateInterval))
|
||||
+ deadline := now.Add(c.readDeadline + updateInterval)
|
||||
+ if c.readDeadlineStrict && !c.readExplicit.IsZero() && c.readExplicit.Before(deadline) {
|
||||
+ deadline = c.readExplicit
|
||||
+ }
|
||||
+ c.Conn.SetReadDeadline(deadline)
|
||||
c.readSetAt = now
|
||||
}
|
||||
}
|
||||
|
||||
+// SetReadDeadlineStrict controls whether idle renewal may extend a deadline set
|
||||
+// by SetReadDeadline or SetDeadline. The default is false. Explicit zero and
|
||||
+// past deadlines retain their disable/cancel semantics in either mode.
|
||||
+func (c *DeadlineConn) SetReadDeadlineStrict(strict bool) {
|
||||
+ c.mu.Lock()
|
||||
+ defer c.mu.Unlock()
|
||||
+ c.readDeadlineStrict = strict
|
||||
+ c.readSetAt = time.Time{}
|
||||
+}
|
||||
+
|
||||
func (c *DeadlineConn) setWriteDeadline() {
|
||||
// Do not set a Write deadline, if upstream wants to cancel all reads.
|
||||
if c.writeDeadline <= 0 || c.abortWrites.Load() || c.infWrites.Load() {
|
||||
@@ -115,6 +131,7 @@ func (c *DeadlineConn) SetDeadline(t time.Time) error {
|
||||
defer c.mu.Unlock()
|
||||
|
||||
c.readSetAt = time.Time{}
|
||||
+ c.readExplicit = t
|
||||
c.writeSetAt = time.Time{}
|
||||
c.abortReads.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
c.abortWrites.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
@@ -132,6 +149,7 @@ func (c *DeadlineConn) SetReadDeadline(t time.Time) error {
|
||||
c.abortReads.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
c.infReads.Store(t.IsZero())
|
||||
c.readSetAt = time.Time{}
|
||||
+ c.readExplicit = t
|
||||
return c.Conn.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
diff --git a/internal/http/listener.go b/internal/http/listener.go
|
||||
index bc6de3af9..14d34f6ea 100644
|
||||
--- a/internal/http/listener.go
|
||||
+++ b/internal/http/listener.go
|
||||
@@ -70,7 +70,10 @@ func (listener *httpListener) Accept() (conn net.Conn, err error) {
|
||||
if result.err != nil {
|
||||
return nil, result.err
|
||||
}
|
||||
- return deadlineconn.New(result.conn).WithReadDeadline(listener.opts.IdleTimeout).WithWriteDeadline(listener.opts.IdleTimeout), result.err
|
||||
+ conn := deadlineconn.New(result.conn).WithReadDeadline(listener.opts.IdleTimeout).WithWriteDeadline(listener.opts.IdleTimeout)
|
||||
+ // Server.Init switches to rolling reads only after HTTP/1 headers are read.
|
||||
+ conn.SetReadDeadlineStrict(true)
|
||||
+ return conn, nil
|
||||
case <-listener.ctxDoneCh:
|
||||
}
|
||||
return nil, syscall.EINVAL
|
||||
diff --git a/internal/http/server.go b/internal/http/server.go
|
||||
index 2934fda6c..d9c19a33f 100644
|
||||
--- a/internal/http/server.go
|
||||
+++ b/internal/http/server.go
|
||||
@@ -29,6 +29,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
+ "github.com/minio/minio/internal/deadlineconn"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -123,6 +124,32 @@ func (srv *Server) Init(listenCtx context.Context, listenErrCallback func(listen
|
||||
srv.listener = listener
|
||||
srv.listenerMutex.Unlock()
|
||||
|
||||
+ connState := srv.ConnState
|
||||
+ srv.ConnState = func(conn net.Conn, state http.ConnState) {
|
||||
+ raw := conn
|
||||
+ if tlsConn, ok := raw.(*tls.Conn); ok {
|
||||
+ if tlsConn.ConnectionState().NegotiatedProtocol == "h2" {
|
||||
+ // HTTP/2 owns its stream deadlines; do not change the connection.
|
||||
+ raw = nil
|
||||
+ } else {
|
||||
+ raw = tlsConn.NetConn()
|
||||
+ }
|
||||
+ }
|
||||
+ if dc, ok := raw.(*deadlineconn.DeadlineConn); ok {
|
||||
+ switch state {
|
||||
+ case http.StateNew, http.StateIdle:
|
||||
+ dc.SetReadDeadlineStrict(true)
|
||||
+ case http.StateActive:
|
||||
+ // net/http has finished reading the headers, including buffered
|
||||
+ // requests. Keep ReadTimeout as a rolling idle limit for uploads.
|
||||
+ dc.SetReadDeadlineStrict(false)
|
||||
+ }
|
||||
+ }
|
||||
+ if connState != nil {
|
||||
+ connState(conn, state)
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
var l net.Listener = listener
|
||||
if tlsConfig != nil {
|
||||
l = tls.NewListener(listener, tlsConfig)
|
||||
@@ -0,0 +1,16 @@
|
||||
# V1 implementation-review dispositions (carried into v2)
|
||||
|
||||
The real Opus implementation review returned REQUEST_CHANGES with one test/dependency blocker and no production-behavior defect. This is not recorded as implementation approval.
|
||||
|
||||
- B1 accepted: the test's direct x/net/http2 import would change the indirect annotation during tidy. Removed that import and use the Go1.27 standard-library HTTP/2 client with an explicit Protocols set containing only HTTP/2. Keep the server's HTTP/1-first ALPN order, and assert actual h2 negotiation and HTTP/2.0 response. No go.mod/go.sum change. Revalidation and dependency hygiene follow.
|
||||
- N1 accepted: add repeated-renewal recording-connection test across three actual 300ms intervals, without resetting the cap.
|
||||
- N2 noted: the existing concurrent test is a race probe; semantic assertions are supplied by separate deadline and HTTP tests, not inferred from that probe.
|
||||
- N3 accepted for h2: give the fixture a 3s server keep-alive idle period while retaining 400ms ReadTimeout and isolating the native read timer. Small scaled streaming tests retain their prior margin, separately backed by 33s production-default runs.
|
||||
- N4 retained: local conn shadowing is legal, no behavior concern; avoid unrelated cleanup.
|
||||
- N5 retained: redundant deadline calls are low-cost and intentional; no performance redesign.
|
||||
- N6 retained: explicit h2 exclusion documents the multiplexed boundary and is safe; zero deadlines remain the fundamental compatibility mechanism.
|
||||
- N7/N8 accepted: release notes distinguish header/handshake-read tightening from unchanged h2 stream and TLS handshake-write limitations.
|
||||
- N9 resolved with direct final macOS/Linux race logs, then recheck modified fixtures after this review's changes.
|
||||
- N10 accepted: record explicit command and exit status for vet and final checks, not only empty stdout.
|
||||
|
||||
The new common-main.go binding is still unmodified and awaits complete-plan v2 agreement. V1 approval cannot cover it. V2 review must also verify B1's chosen no-new-dependency resolution.
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"internal/deadlineconn/deadlineconn.go": "b9272ef640f1d4403b3d0af6cdbaba9186c51ad9a0226dfe449e8ef738e1ec4b",
|
||||
"internal/http/listener.go": "49628575367f6ab9b6986caf594726d74d370f7d2ac4eed582903600b6eb3fa2",
|
||||
"internal/http/server.go": "b7b0355f2781f8c5f7c77bc910cd4180cd3e5f22a87de41bd35ef119d36b4cdf",
|
||||
"cmd/server-main.go": "04c265de211412ba0297396928096d7f2d971244a957a3126154846035263514",
|
||||
"internal/deadlineconn/deadlineconn_strict_test.go": "fec37273f338d3cb6f56c71eb6d8d677f8d5e4c2a7c55bc5ab2e64c56ad4a50b",
|
||||
"internal/http/server_deadline_test.go": "c56460fd8258a7fe8cf25d88fb2030ecfee0e142e0559fad0eb1a05d43d27c0f",
|
||||
"internal/http/dial_deadline_linux_test.go": "0939d05b72a09760d53fcdf249775989e3f89bca824b9961d0b2a657ebfdf41e"
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
I'll start by reading the review artifacts and the plan documents.
|
||||
|
||||
已完成只读复核。我独立读取了 Go 1.27.1 的 `net/http` 源码、全部 7 个当前实现文件、既有测试与全部 evidence 日志。
|
||||
|
||||
---
|
||||
|
||||
# R8 实现评审 — Opus 5.0(只读,实测复核)
|
||||
|
||||
## 结论:**REQUEST_CHANGES**
|
||||
|
||||
生产代码(`deadlineconn.go` / `listener.go` / `server.go` / `server-main.go`)我**未发现任何行为性缺陷**,与已同意的 v1(SHA256 `7cb6…6366`)逐条吻合。唯一阻塞项在**测试侧引入的依赖,会确定性地打红仓库自身的 CI 质量门**(`make check-gen`),一行 `go.mod` 即可修复,不需要改动任何生产语义。
|
||||
|
||||
> 诚实性声明:① 我**没有执行任何测试、`go vet`、`gofmt`、`go mod tidy` 或哈希计算**(本会话仅 Read/Grep/Glob);所有 SHA256(plan、production diff、implementation-files.json)均沿用你提供的值,**未独立重算**。② 我逐字节比对了 `review/implementation.patch` 与四个生产文件的当前内容,二者一致。③ 下文所有"已核验"均指**我亲自读过的源码**(含 `/opt/homebrew/Cellar/go/1.27.1/libexec/src/net/http/`);所有"日志显示"均指**我读日志得出的转述,非我运行**。④ 未使用子代理。
|
||||
|
||||
---
|
||||
|
||||
## 一、对 v1 的实现符合性(逐条,全部达成)
|
||||
|
||||
| v1 条款 | 实现位置 | 结论 |
|
||||
|---|---|---|
|
||||
| mutex 保护的 explicit 时间 + `readDeadlineStrict`(默认 false) | `deadlineconn.go:37-38,43` | ✅ |
|
||||
| `SetReadDeadline`/`SetDeadline` 记录 explicit,保留 zero/abort 与立即转发 | `deadlineconn.go:134,152` + `136-139,149-150` | ✅ |
|
||||
| `SetReadDeadlineStrict(bool)`,同锁、重置 `readSetAt`、带文档 | `deadlineconn.go:79-87` | ✅ |
|
||||
| 锁内复检 abort/inf;保留节流与 250ms 松弛;strict 下取 `min(idle, explicit)`;绝对上限不加松弛 | `deadlineconn.go:64-66,69-76`(`deadline = c.readExplicit`,未 `Add`) | ✅ |
|
||||
| 写侧完全不动 | `deadlineconn.go:89-105,161-168` 与基线一致 | ✅ |
|
||||
| listener 保留具体类型/读写 idle/Unwrap 兼容,返回前开启 strict | `listener.go:73-76` | ✅ |
|
||||
| Init **组合而非丢弃** 调用方 ConnState;先切模式再调用方 hook | `server.go:127,138-151`(`connState(conn,state)` 在 switch 之后) | ✅ |
|
||||
| 一层 `*tls.Conn` 用 `NetConn()` 解包;h2 跳过;其他状态忽略 | `server.go:130-137,139-147` | ✅ |
|
||||
| 不删 ReadTimeout/WriteTimeout、不改 flag;生产超时处加说明注释 | `cmd/server-main.go:904-905`(其余 906-915 未变) | ✅ |
|
||||
|
||||
验证矩阵 1–7 项的**内容**也已全部落地(含 N2 pipelined、N5 真 h2 断言、N6 >30s 下载三项补充)。
|
||||
|
||||
---
|
||||
|
||||
## 二、你点名的 8 项独立核验(结果)
|
||||
|
||||
1. **Go 1.27.1 相位序(实读源码)**:`setState(c.rwc,StateNew,runHooks)` 在 `go c.serve()` **之前**、accept 循环内同步执行(`server.go:3580-3581`、hook 同步调用见 `1881-1883`);首个 header deadline 在 serve loop 之前(`2038-2040`);`StateActive` 在 `readRequest` **返回之后**(`2054-2059`);整请求 deadline **无条件**下发(`1103`,`ReadTimeout<=0` 时下发 zero);`StateIdle`(`2152`) → idle deadline(`2163-2167`) → `Peek(4)`(`2173`) → 第二个 header deadline(`2177-2181`) **全部落在 strict 窗口内**。结论:v1 的相位切分正确。
|
||||
2. **mutex/atomic 交互**:`readExplicit`/`readDeadlineStrict`/`readSetAt` 三者只在 `mu` 下读写;`abortReads`/`infReads` 原子量在锁内**复检**(`deadlineconn.go:64`),恰好堵住"`Read` 已过外层门 → 并发 `SetReadDeadline(zero)` → 滚动 deadline 覆盖 net/http 背景读的零值"这一 TOCTOU;锁内无阻塞 I/O(`SetReadDeadline` 只是 runtime 定时器调整),因此 accept 循环里的 hook 不会被卡住。未见数据竞争面。
|
||||
3. **>250ms 更新不得续期 header 上限**:`deadlineconn.go:69-76` 每次到期重算都会再次 clamp 回同一个绝对 `readExplicit`,绝不外推。推演 trickle 用例(header 650ms、100ms 一字节):t=0/300/600ms 三次落入更新分支,每次都 clamp 到 t0+650ms,650ms 必断。**不变量成立**。
|
||||
4. **nonzero/zero/past**:nonzero → `min()`;zero → `infReads` 在外层与锁内双重短路(`58`/`64`),背景读、hijack、h2 全部维持"永不超时";past → `abortReads` 使 `Read` 直接返回 `context.DeadlineExceeded`(实现 `net.Error.Timeout()`)。strict 下**已过期的未来时间保持过期**(clamp 出一个过去时刻)。
|
||||
5. **H1 body 滚动**:`1103` 在 `2058` 之前就把 socket deadline 改成 `t0+ReadTimeout` 并同步刷新 `readExplicit`,二者之间**不存在任何读**;`StateActive` 关 strict 且清 `readSetAt`,首个 body 读立刻续期 → 长上传不被硬顶。`ReadTimeout<=0` 时退化为 `infReads`,与补丁前一致。
|
||||
6. **buffered/pipelined 与 keep-alive**:`StateActive` 的触发条件 `c.r.remain != initialReadLimitSize()` 在**成功路径上恒成立**——`readRequest` 在 `1067` 调 `setInfiniteReadLimit()`(`remain=maxInt64`),故纯缓冲的流水线第二个请求同样会关 strict(opus-v1 N2 得到证实)。keep-alive 侧 `2163` 会立刻覆盖掉上一请求遗留的 `readExplicit`,中间窗口无读,无陈旧值风险。
|
||||
7. **TLS/h2**:握手读上限 = `min(正 RHT,RT,WT)`(`server.go:969-983,1962-1968`),成功后两侧清零(`1988-1992`)→ 再进入新的 header 上限。协商 h2 时 net/http 走 `setState(...,skipHooks)`(`2002`)且在 `ServeConn` 前把两侧 deadline 清零(`http2.go:100-101`);h2 自身只上报 Active/Idle(`internal/http2/server.go:568-572,796-800`),我们的 h2 分支跳过它们,即便不跳过也被 `infReads` 短路。h2 的 per-stream `ReadTimeout` 是 `time.AfterFunc` 计时器(`1970-1972` → `onReadTimeout` `1836-1841`,返回包装后的 `os.ErrDeadlineExceeded`,满足 `net.Error`),**未新增任何连接级读超时**。
|
||||
8. **grid/hijack 与默认调用方**:`hijackLocked` 先 `abortPendingRead` 再 `rwc.SetDeadline(zero)`,之后才 `StateHijacked`(`server.go:322-326,336`);grid 随后 `deadlineconn.Unwrap(conn)` 取回裸 `*net.TCPConn`(`internal/grid/manager.go:193`),strict 根本触达不到 grid。内节点 dialer 走默认 false(`internal/http/dial_linux.go:126-131`),且 `DriveOPTimeout` 在生产仍被注释(`cmd/server-main.go:421-422`),生产内节点连接压根不经过 DeadlineConn。
|
||||
|
||||
---
|
||||
|
||||
## 三、阻塞项(1 项,不涉及生产语义)
|
||||
|
||||
**B1 — 新测试的直接依赖会打红 `make check-gen` / CI `quality` job**
|
||||
- `internal/http/server_deadline_test.go:35` 直接 `import "golang.org/x/net/http2"`,而 `go.mod:297` 为 `golang.org/x/net v0.59.0 // indirect`;全仓库(Grep 确认)**只有这一个文件**直接导入 `golang.org/x/net/*`。
|
||||
- `Makefile:49-58` 的 `check-gen` 会执行 `go mod tidy -compat=1.27`,随后 `git diff --name-only -- … go.mod go.sum` 非空即 `exit 1`;`.github/workflows/go.yml:75-76` 把它作为必跑步骤。`go mod tidy` 会因"主模块的测试直接导入"而把该行提升为直接依赖(去掉 `// indirect`)→ **go.mod 产生 diff → CI 红**。
|
||||
- 注意这**不是构建失败**:`go.sum:765` 已有完整 `h1:` 哈希,所以本地 `go test` 能过(日志也显示过了),git status 里 go.mod/go.sum 也确实未变——问题只在 tidy 门禁。
|
||||
- 两种修法任选其一:(a) 把 `golang.org/x/net v0.59.0` 移入直接 require 块(不改版本、不引新模块,零风险);(b) 去掉该依赖,用标准库 h2 客户端(`stdhttp.Transport` + `TLSClientConfig.NextProtos=[]string{"h2"}`)——被测服务端本就是 net/http 内置 http2,(b) 反而更贴切。
|
||||
- 声明:我**无法执行** `go mod tidy` 验证,此结论由 `go.mod:297` + `Makefile:49-58` + `go.yml:75-76` + Grep 结果推得。
|
||||
|
||||
---
|
||||
|
||||
## 四、非阻塞项
|
||||
|
||||
- **N1(最值得补的测试缺口)** `deadlineconn_strict_test.go:40-100` 中每次 `Read` 之前都有 `SetReadDeadline*`,而它们会把 `readSetAt` 清零(`deadlineconn.go:86,151`),因此**只覆盖了"第一次更新"的 clamp,从未覆盖"跨 250ms 的第二/第三次更新仍 clamp"**——而这正是本缺陷的核心不变量。目前它只由真实 socket 的 trickle 用例(`server_deadline_test.go:145-151`)间接覆盖。建议加一个确定性用例:strict + 设上限 → `Read` → `sleep(300ms)` → `Read` → 断言 `raw.read` 仍等于上限。
|
||||
- **N2** `TestConcurrentStrictReadDeadline`(`:140-162`)无断言,且 setter 每轮立刻把 deadline 归零,**从未让 `Read` 与"正在生效的 clamp"并发**;作为 race 探针可以,但别把它当作语义回归。
|
||||
- **N3(flake 风险)** `TestServerHTTP2Deadlines`(`:376-478`)里 `IdleTimeout=400ms` 会被 net/http 映射为 h2 连接级 idle(`net/http/http2.go:57-61`);两次初始 GET 之后、以及 `<-done` 到最后一次 GET 之间,连接处于 idle,若 runner 抖动 >400ms,连接会被 h2 自身关闭 → `connections.Load()==1` 假失败。同理 `TestServerContinuousUpload` 每块只有 550ms 余量。建议 h2 fixture 单独用更大的 idle。(fixture 清写定时器的修法本身是对的:`onWriteTimeout` 产生的是 `StreamError/INTERNAL_ERROR`(`internal/http2/server.go:1846-1852`),不满足 `net.Error`,正是初版失败的原因。)
|
||||
- **N4** `listener.go:73` 的局部 `conn` 遮蔽了具名返回值 `conn net.Conn`(且 `err` 也不再使用);合法但可读性差,`dc := …` 更干净。
|
||||
- **N5(微小开销)** clamp 命中时 `deadlineconn.go:74` 会把 socket 已持有的同一时刻再写一遍;加上每次相位切换清 `readSetAt`(`server.go:141,145`),每个 H1 请求多出约 2 次 deadline 重算。相对 net/http 自身每请求 3 次 `SetReadDeadline` 可忽略,无需改。
|
||||
- **N6** `server.go:131` 每次状态转换都调 `tlsConn.ConnectionState()`(持 `handshakeMutex`)。正确且安全(StateNew 发生在 `go c.serve()` 之前),但如 opus-v1 N3 所述该分支严格冗余(`http2.go:100-101` 已清零,`infReads` 必然短路)。保留可作纵深防御,建议注释点明"仅为防御,非必要条件"。
|
||||
- **N7(发布说明,已在 consensus N7 登记)** 两处用户可见收紧:TLS 握手读被 `min(RHT,RT,WT)`(生产 30s)硬顶;请求头被 ReadHeaderTimeout 硬顶(即便字节持续到达)。
|
||||
- **N8(已知边界,非本轮)** 生产 `NextProtos{"http/1.1","h2"}`(`cmd/utils.go:970`)下,只宣告 h2 的客户端仍受 h2 **绝对** per-stream `ReadTimeout`(30s)约束;plan 第 24 行/consensus N3 已声明不修,交付说明请重述。
|
||||
- **N9(证据对齐,已更正)** 我核对了日志里的 `t.Logf` 归属行(注意 `runContinuousUpload/Download` 调了 `t.Helper()`,报的是**调用点**):`implementation-focused.log:85` 的 `:259`、`default-30s-transfers.log:24` 的 `:274` 与当前文件 **完全一致**;下载区整体偏移 +36/+37 行,与"仅 H2 fixture 被重写(当前 `:376-478`,初版失败点 `:435` → 现 `:463`)+ 长用例补了 `t.Parallel()`"完全吻合。**结论:现存日志并非整体过期,H2 用例之前的部分与当前源码同版;H2 用例及其后的部分尚无对应通过记录**——与你说的"最终 race 复跑进行中"一致,我不将其计为已通过。
|
||||
- **N10** `evidence/vet.log` 为 **0 字节**。无输出多半就是干净,但空文件不自证;建议在其中记录命令行与退出码。
|
||||
|
||||
---
|
||||
|
||||
## 五、未由我执行的部分(请勿当作我背书的通过)
|
||||
|
||||
`implementation-focused.log` / `darwin-race.log` / `linux-race.log` / `grid.log`(仅 `TestDisconnect`+`TestSingleRoundtrip`)/ `default-30s-transfers.log`(33.03s 明文与 TLS 上传/下载)/ `vet.log` 均为**我阅读的记录**,非我运行。Linux 的 `dial_deadline_linux_test.go`(`//go:build linux`)在本机 Darwin 上不会运行,我只静态核验了它确实断言了默认滚动语义的三种情形(50ms 显式被续期、zero 禁用、1min 显式仍被 idle 截断)。最终全量 race 复跑结果待你回填。
|
||||
|
||||
修掉 B1(或明确判定 tidy 门禁不适用)后,我这边即可转 APPROVE。
|
||||
@@ -0,0 +1,5 @@
|
||||
Read-only implementation review of SILO R8 on baseline 9ebe81c1b3611f9cc73e676b5b741c2be62c467a. You previously agreed plan v1 SHA256 7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366; this is a fresh actual Opus 5.0 review. Read docs/investigations/r8/plan-v1.md, consensus.md, review/opus-v1.md, review/implementation.patch (production diff SHA256 88716d9af433b55527308e09949b0adaab6980aca3bf1ad38b677e9c1c0ce083), and every current file in review/implementation-files.json. These are actual edits, including new untracked tests not represented in git diff. Do not edit or try to write a plan file; deliver findings in the response. Allowed tools are Read/Grep/Glob only.
|
||||
|
||||
Independent checks: exact phase ordering in current Go1.27.1 net/http, mutex/atomic interaction, no header cap renewal across >250ms updates, nonzero/zero/past handling, H1 body rolling, buffered/pipelined and keep-alive transitions, TLS/h2 and grid/hijack default-caller compatibility. Detect concrete bugs and weak tests, avoid hypothetical unrelated expansions. Also see evidence/implementation-focused.log, evidence/default-30s-transfers.log (>33s plaintext and TLS H1 uploads/downloads passed), evidence/grid.log, and evidence/linux-race.log. The first Darwin race run failed only because the H2 fixture's equal read/write timers raced to supply different timeout error types (not a data race); final fixture clears the per-stream write timer to isolate native ReadTimeout and checks healthy multiplexed requests and connection reuse. Final full race reruns are in progress; do not treat pending checks as passed.
|
||||
|
||||
Give Chinese verdict APPROVE or REQUEST_CHANGES, concrete file/line findings separated into blocking and nonblocking, and explicit implementation conformance to accepted v1. Clearly distinguish independently inspected source from tests you did not personally execute. If no blockers, say so.
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"requested_model": "claude-opus-5",
|
||||
"effort": "max",
|
||||
"cli_version": "2.1.270",
|
||||
"baseline_sha": "9ebe81c1b3611f9cc73e676b5b741c2be62c467a",
|
||||
"plan_sha256": "7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366",
|
||||
"production_diff_sha256": "88716d9af433b55527308e09949b0adaab6980aca3bf1ad38b677e9c1c0ce083",
|
||||
"status": "completed",
|
||||
"created_at_utc": "2026-09-15T15:54:25.631091+00:00",
|
||||
"actual_assistant_models": [
|
||||
"claude-opus-5"
|
||||
],
|
||||
"result_subtype": "success",
|
||||
"is_error": false,
|
||||
"session_id": "541429b8-dc15-4c36-8bf9-f6117e086ae3",
|
||||
"duration_ms": 382141,
|
||||
"raw_path": "/Users/vonng/tmp/silo-r8-01a0a5b9/opus-implementation.jsonl",
|
||||
"raw_sha256": "d5ec088b66ceed9024afc74fc5df40340dc6d208e73d99a8638beb1fde906952",
|
||||
"review_sha256": "e5861d0da930fe590606722563109d2b87b03b1497abc4a758b7846f446e1eba",
|
||||
"completed_at_utc": "2026-09-15T16:01:49.467166+00:00",
|
||||
"scope_note": "Covers v1 connection implementation only; newly discovered config binding requires v2 agreement."
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
diff --git a/cmd/server-main.go b/cmd/server-main.go
|
||||
index 48ed0f87d..c8a3a19ca 100644
|
||||
--- a/cmd/server-main.go
|
||||
+++ b/cmd/server-main.go
|
||||
@@ -901,6 +901,8 @@ func serverMain(ctx *cli.Context) {
|
||||
close(globalGridStart)
|
||||
close(globalLockGridStart)
|
||||
|
||||
+ // The HTTP/1 listener preserves absolute header deadlines and renews the
|
||||
+ // body read/write idle limits, so transfers may outlast IdleTimeout.
|
||||
httpServer := xhttp.NewServer(getServerListenAddrs()).
|
||||
UseHandler(setCriticalErrorHandler(corsHandler(handler))).
|
||||
UseTLSConfig(newTLSConfig(getCert)).
|
||||
diff --git a/internal/deadlineconn/deadlineconn.go b/internal/deadlineconn/deadlineconn.go
|
||||
index 95bb43eff..5fa5a1403 100644
|
||||
--- a/internal/deadlineconn/deadlineconn.go
|
||||
+++ b/internal/deadlineconn/deadlineconn.go
|
||||
@@ -34,6 +34,8 @@ type DeadlineConn struct {
|
||||
net.Conn
|
||||
readDeadline time.Duration // sets the read deadline on a connection.
|
||||
readSetAt time.Time
|
||||
+ readExplicit time.Time // last deadline requested by the caller.
|
||||
+ readDeadlineStrict bool // idle renewal must not extend readExplicit.
|
||||
writeDeadline time.Duration // sets the write deadline on a connection.
|
||||
writeSetAt time.Time
|
||||
abortReads, abortWrites atomic.Bool // A deadline was set to indicate caller wanted the conn to time out.
|
||||
@@ -59,17 +61,31 @@ func (c *DeadlineConn) setReadDeadline() {
|
||||
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
- if c.abortReads.Load() {
|
||||
+ if c.abortReads.Load() || c.infReads.Load() {
|
||||
return
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
if now.Sub(c.readSetAt) > updateInterval {
|
||||
- c.Conn.SetReadDeadline(now.Add(c.readDeadline + updateInterval))
|
||||
+ deadline := now.Add(c.readDeadline + updateInterval)
|
||||
+ if c.readDeadlineStrict && !c.readExplicit.IsZero() && c.readExplicit.Before(deadline) {
|
||||
+ deadline = c.readExplicit
|
||||
+ }
|
||||
+ c.Conn.SetReadDeadline(deadline)
|
||||
c.readSetAt = now
|
||||
}
|
||||
}
|
||||
|
||||
+// SetReadDeadlineStrict controls whether idle renewal may extend a deadline set
|
||||
+// by SetReadDeadline or SetDeadline. The default is false. Explicit zero and
|
||||
+// past deadlines retain their disable/cancel semantics in either mode.
|
||||
+func (c *DeadlineConn) SetReadDeadlineStrict(strict bool) {
|
||||
+ c.mu.Lock()
|
||||
+ defer c.mu.Unlock()
|
||||
+ c.readDeadlineStrict = strict
|
||||
+ c.readSetAt = time.Time{}
|
||||
+}
|
||||
+
|
||||
func (c *DeadlineConn) setWriteDeadline() {
|
||||
// Do not set a Write deadline, if upstream wants to cancel all reads.
|
||||
if c.writeDeadline <= 0 || c.abortWrites.Load() || c.infWrites.Load() {
|
||||
@@ -115,6 +131,7 @@ func (c *DeadlineConn) SetDeadline(t time.Time) error {
|
||||
defer c.mu.Unlock()
|
||||
|
||||
c.readSetAt = time.Time{}
|
||||
+ c.readExplicit = t
|
||||
c.writeSetAt = time.Time{}
|
||||
c.abortReads.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
c.abortWrites.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
@@ -132,6 +149,7 @@ func (c *DeadlineConn) SetReadDeadline(t time.Time) error {
|
||||
c.abortReads.Store(!t.IsZero() && time.Until(t) < 0)
|
||||
c.infReads.Store(t.IsZero())
|
||||
c.readSetAt = time.Time{}
|
||||
+ c.readExplicit = t
|
||||
return c.Conn.SetReadDeadline(t)
|
||||
}
|
||||
|
||||
diff --git a/internal/http/listener.go b/internal/http/listener.go
|
||||
index bc6de3af9..14d34f6ea 100644
|
||||
--- a/internal/http/listener.go
|
||||
+++ b/internal/http/listener.go
|
||||
@@ -70,7 +70,10 @@ func (listener *httpListener) Accept() (conn net.Conn, err error) {
|
||||
if result.err != nil {
|
||||
return nil, result.err
|
||||
}
|
||||
- return deadlineconn.New(result.conn).WithReadDeadline(listener.opts.IdleTimeout).WithWriteDeadline(listener.opts.IdleTimeout), result.err
|
||||
+ conn := deadlineconn.New(result.conn).WithReadDeadline(listener.opts.IdleTimeout).WithWriteDeadline(listener.opts.IdleTimeout)
|
||||
+ // Server.Init switches to rolling reads only after HTTP/1 headers are read.
|
||||
+ conn.SetReadDeadlineStrict(true)
|
||||
+ return conn, nil
|
||||
case <-listener.ctxDoneCh:
|
||||
}
|
||||
return nil, syscall.EINVAL
|
||||
diff --git a/internal/http/server.go b/internal/http/server.go
|
||||
index 2934fda6c..d9c19a33f 100644
|
||||
--- a/internal/http/server.go
|
||||
+++ b/internal/http/server.go
|
||||
@@ -29,6 +29,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/dustin/go-humanize"
|
||||
+ "github.com/minio/minio/internal/deadlineconn"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -123,6 +124,32 @@ func (srv *Server) Init(listenCtx context.Context, listenErrCallback func(listen
|
||||
srv.listener = listener
|
||||
srv.listenerMutex.Unlock()
|
||||
|
||||
+ connState := srv.ConnState
|
||||
+ srv.ConnState = func(conn net.Conn, state http.ConnState) {
|
||||
+ raw := conn
|
||||
+ if tlsConn, ok := raw.(*tls.Conn); ok {
|
||||
+ if tlsConn.ConnectionState().NegotiatedProtocol == "h2" {
|
||||
+ // HTTP/2 owns its stream deadlines; do not change the connection.
|
||||
+ raw = nil
|
||||
+ } else {
|
||||
+ raw = tlsConn.NetConn()
|
||||
+ }
|
||||
+ }
|
||||
+ if dc, ok := raw.(*deadlineconn.DeadlineConn); ok {
|
||||
+ switch state {
|
||||
+ case http.StateNew, http.StateIdle:
|
||||
+ dc.SetReadDeadlineStrict(true)
|
||||
+ case http.StateActive:
|
||||
+ // net/http has finished reading the headers, including buffered
|
||||
+ // requests. Keep ReadTimeout as a rolling idle limit for uploads.
|
||||
+ dc.SetReadDeadlineStrict(false)
|
||||
+ }
|
||||
+ }
|
||||
+ if connState != nil {
|
||||
+ connState(conn, state)
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
var l net.Listener = listener
|
||||
if tlsConfig != nil {
|
||||
l = tls.NewListener(listener, tlsConfig)
|
||||
@@ -0,0 +1,70 @@
|
||||
I'll start by reading the required materials to ground my review.
|
||||
|
||||
Now let me verify the actual Go 1.27.1 `net/http` behavior rather than trusting the plan's summary.
|
||||
|
||||
Verification complete. Writing my review record to the plan file.
|
||||
|
||||
Write 工具在本会话被禁用(确为只读评审),故评审记录直接以回复形式交付。
|
||||
|
||||
---
|
||||
|
||||
# R8 独立评审 — Opus 5.0 reviewer
|
||||
|
||||
**结论:CONSENSUS —— 同意 `docs/investigations/r8/plan-v1.md`(SHA256 `7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366`),无遗留阻塞性分歧。** 共 9 条非阻塞意见。
|
||||
|
||||
> 诚实性声明(先行):① SHA256 采用你给出的值——本会话只读工具集不含哈希命令,我**未独立重算**;② `evidence/baseline.log` 对应的临时测试文件已不在 worktree(`git status` 仅 `docs/investigations/r8/` 未跟踪),我**未重跑**该日志,只是从 Go 源码独立推导出的机制与该日志完全吻合;③ 未使用子代理、未模拟工具、未声称运行过任何测试。
|
||||
|
||||
## 一、逐条核验(Go 1.27.1 源码,`/opt/homebrew/Cellar/go/1.27.1/libexec/src/net/http/`)
|
||||
|
||||
| 核验项 | 事实 | 位置 |
|
||||
|---|---|---|
|
||||
| ConnState 相位序 | `setState(c.rwc, StateNew, runHooks)` 在 `go c.serve()` **之前**,hook 同步执行、传入 `c.rwc` | `server.go:3580`, `1865-1884` |
|
||||
| 首个 header deadline | 在 serve loop **之前**设置,此时 state 仍为 StateNew | `server.go:2038-2040` |
|
||||
| StateActive 时机 | `readRequest` **返回之后**才触发;成功路径必然触发(`setInfiniteReadLimit()` 把 `remain` 置 `maxInt64`) | `2054-2059`, `1067` |
|
||||
| whole-request deadline | Go 1.27 **无条件** `SetReadDeadline(t0+ReadTimeout)`(旧版的 `!hdrDeadline.Equal(...)` 条件已删) | `1103`, `1038-1041` |
|
||||
| TLS 握手 | 读写 deadline = `now + min(正RHT,RT,WT)` = SILO 30s;成功后两侧清零 | `1962-1968`, `964-984`, `1988-1992` |
|
||||
| zero / background EOF | 有 body → EOF 回调启动 background read;无 body → 立即启动,且 `SetReadDeadline(zero)` | `2123-2127`, `731-743` |
|
||||
| abort / finishRequest | `abortPendingRead` 设 `aLongTimeAgo` → 等待 → 清零;由 `finishRequest` 调用 | `785-797`, `1694-1707` |
|
||||
| keep-alive 第二个 header | StateIdle hook → `SetReadDeadline(now+idle)` → `Peek(4)` → `SetReadDeadline(now+RHT)`,**全部落在 strict 窗口内** | `2152`, `2163-2181` |
|
||||
| Hijack(grid/ws) | `abortPendingRead` + `rwc.SetDeadline(zero)` + StateHijacked | `318-337` |
|
||||
| 写侧 | 每请求由 `readRequest` 的 defer 重新武装,请求结束清零 | `1042-1046`, `2145` |
|
||||
| H2 是否启用 | SILO 设了 `TLSConfig` 且 `NextProtos` 含 `"h2"` → `shouldConfigureHTTP2ForServe()` 为真 → `s.h2` 配置,走内置 http2 | `3469-3489`, `http2.go:82` |
|
||||
| H2 与 hook | h2 **会**调用用户 hook(带 nil 保护);进入 ServeConn 前把两侧 deadline 清零;除 per-stream 定时器外无任何 conn 级 `SetReadDeadline` | `http2.go:100-101,188-198`; `internal/http2/server.go:571-572, 799-800, 1567, 2100, 1970-1972` |
|
||||
|
||||
SILO 侧:`cmd/server-main.go:907-913`(RT=WT=Idle=30s,RHT=30s)、`internal/http/listener.go:73`、`dial_linux.go:126-132`、`grid/manager.go:193`、`cmd/utils.go:970`。全仓库 `*.go` **无任何 `ConnState` 使用**;现有 `internal/deadlineconn`、`internal/http` 测试均不设显式 deadline,故不受 strict 影响。
|
||||
|
||||
## 二、相位推导:option 4 为何正确
|
||||
|
||||
- **strict ON 覆盖**:accept/StateNew → TLS 握手读 → 首个 header(`2038`);以及 `2152` StateIdle 到下一轮 `2058` StateActive 之间的 idle 等待(`2163`)**与第二个 header**(`2177`)。
|
||||
- **strict OFF 覆盖**:`2058` 之后到 `2152` 之前,即 body 读 + handler 全程 → 保留 rolling,长上传不被硬顶。
|
||||
- **`1103` 与 `2058` 之间**虽仍 strict 且 explicit 已变为 `t0+ReadTimeout`,但该区间**不存在任何读**(只有 `2106` 的 header 检查与 `2118-2127` 的登记)——无副作用。
|
||||
- **zero 优先于 strict**(`infReads` 提前 return)→ background read、hijack、h2 全部保持原语义;长 handler(如 `mc admin trace` 这类流式 GET)不会被误杀。
|
||||
- 节流与 `readSetAt` 重置的组合可保证:strict 上限一旦写入 socket 就不会被后续 `Read` 重新拉长;模式切换重置 `readSetAt` 使下一次读立即按新模式重算。
|
||||
|
||||
**对 baseline 的验证**:strict 下 header 上限 = `min(now+2s+250ms, now+100ms)` = `now+100ms` → 400ms 完成的 header 必被拒,与标准 `net/http` 一致。
|
||||
|
||||
## 三、非阻塞意见(N1–N9)
|
||||
|
||||
1. **N1 措辞订正**:计划 20 行说 header deadline 在 `readRequest` 内设;实际在 `2038`/`2177`。且 Go 1.27 的 `1103` 是**无条件**的——这反而让 option 1 的否决理由更硬:RT=30s 会硬顶「header+body」整请求。
|
||||
2. **N2 不变量要写死**:StateActive 的触发依据应记为 `1067` 的 `setInfiniteReadLimit()`,而非「读到字节」。pipelined 请求即使 header 全来自 `bufio` 缓冲、零 socket 读也必然触发。建议补一个 pipelined 用例。
|
||||
3. **N3 可简化**:h2 特判可省——`http2.go:100-101` 已清零两侧 deadline,strict 分支恒被 `infReads` 短路。保留亦正确,只多一次 `ConnectionState()` 加锁;若保留,注意 StateNew 时握手尚未发生,不能依赖其返回值。
|
||||
4. **N4 可简化**:`Accept` 里开 strict 是冗余的(`3580` 严格 happens-before 任何读)。保留可作纵深防御,但会让「未装 hook 的 httpListener 使用者」隐式获得 strict body 语义(今天不存在,`httpListener` 未导出、仅 `Server.Init` 构造)。两者皆可,请写明这层耦合。
|
||||
5. **N5 测试有效性(最重要)**:`cmd/utils.go:970` 顺序为 `{"http/1.1","h2"}`,Go 的 ALPN 以**服务端顺序**优先 → 普通 Go HTTP/2 客户端会落回 http/1.1。H2 smoke 必须用只声明 `NextProtos: []string{"h2"}` 的 `tls.Client`,并断言 `NegotiatedProtocol == "h2"` 与 `resp.Proto == "HTTP/2.0"`,否则是假阳性。
|
||||
6. **N6 回归护栏**:写侧 rolling 是大对象 GET 的命门(`1042-1046` 每请求 `now+30s`,全靠每 250ms 续期)。计划正确地不动写侧;建议在 `setWriteDeadline` 旁注明「不可对称 strict」,并在矩阵补一个 >30s 的持续**下载**用例。
|
||||
7. **N7 发布说明**:两处用户可见收紧——TLS 握手读侧被 `min(RHT,RT,WT)=30s` 硬顶;请求头被 `ReadHeaderTimeout` 硬顶(即便字节持续到达)。这正是 stock `net/http` 语义,但极慢链路客户端可能受影响,需文档化。
|
||||
8. **N8 影响面比计划更小**:`cmd/server-main.go:421-422` 的 `DriveOPTimeout` 仍被 FIXME 注释掉 → `dial_linux.go:126` 分支不成立,**生产内节点连接根本不经过 DeadlineConn**。计划结论正确,建议据实补记。
|
||||
9. **N9 已知项**:握手写侧仍会被续期,慢读 ServerHello 的客户端仍能拉长写侧占用。既有缺陷、本轮不修,建议显式登记而非静默。
|
||||
|
||||
## 四、替代方案对比(是否存在更简单的正确解:无)
|
||||
|
||||
- **全局 clamp**:`1103` 无条件设 `wholeReqDeadline`,RT=30s 直接破功大对象上传。❌
|
||||
- **去 ReadTimeout + 把 zero 解释成 rolling**:与 `731-743`(background read)、`326`(hijack)冲突,两处都用 zero 表达「永不超时」。❌
|
||||
- **body/ResponseController wrapper**:引入 drain/EOF/chunked 记账 + h2 专门处理,范围远超本缺陷。❌
|
||||
- **由 hook 自行推算 cap(`now+RHT` 等)**:等于在 SILO 侧复刻 stdlib 的 deadline 算术,会随 Go 版本漂移(1.27 相对旧版已改两处)。计划「记住 stdlib 实际要求的值」更稳健。❌
|
||||
- **按「显式值是否短于 idle 窗口」自动判定**:生产默认 RHT = RT = Idle = 30s 三者相等,无法区分相位,仅在 baseline 的 100ms/2s 配置下看似有效,**不是通用正确解**。❌
|
||||
|
||||
所需信息(deadline 由哪一层请求 + 当前 HTTP 相位)只在 `DeadlineConn` API 边界与 `ConnState` 两处可得,**option 4 是最小正确形状**。
|
||||
|
||||
## 五、后续(实现仍需实际执行验证,不得以推断代替)
|
||||
|
||||
同意计划的 7 项矩阵,并请纳入 N2(pipelined)、N5(真·h2 断言)、N6(>30s 持续下载)三项补充;`-race` 下必须覆盖 `Read` / `SetReadDeadline` / `SetReadDeadlineStrict` 三者并发。Linux 部分若只有编译而无运行时验证,请分别如实报告。
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"baseline_sha": "9ebe81c1b3611f9cc73e676b5b741c2be62c467a",
|
||||
"plan": "plan-v1.md",
|
||||
"plan_sha256": "7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366",
|
||||
"requested_model": "claude-opus-5",
|
||||
"effort": "max",
|
||||
"cli_version": "2.1.270",
|
||||
"status": "completed",
|
||||
"created_at_utc": "2026-09-15T15:44:56.500168+00:00",
|
||||
"actual_assistant_models": [
|
||||
"claude-opus-5"
|
||||
],
|
||||
"result_subtype": "success",
|
||||
"is_error": false,
|
||||
"session_id": "7e51fd30-3842-47e9-9d19-47604d87b45b",
|
||||
"duration_ms": 292649,
|
||||
"raw_path": "/Users/vonng/tmp/silo-r8-01a0a5b9/opus-v1.jsonl",
|
||||
"stderr_path": "/Users/vonng/tmp/silo-r8-01a0a5b9/opus-v1.stderr.log",
|
||||
"raw_sha256": "7922230a171b041a3b736fa9b162282ce1d38614b57d0cf0c42f2f5eade566b7",
|
||||
"review_sha256": "a6e7c616fe3a158f73e90af7414569f699eedc93e259289dcd0b5c94d75f2dbf",
|
||||
"completed_at_utc": "2026-09-15T15:50:14.799630+00:00",
|
||||
"verdict": "CONSENSUS",
|
||||
"blocking_disagreements": 0
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
I'll begin by reading the plan and its supporting evidence directly — as an independent reviewer I won't delegate verification.
|
||||
|
||||
Now the actual production code — the core of what I must verify independently.
|
||||
|
||||
Now the Go 1.27.1 source, to verify zero/negative semantics of `ReadHeaderTimeout` myself.
|
||||
|
||||
已完成独立只读复核。我亲自读取了 Go 1.27.1 `net/http` 源码、`minio/cli@v1.24.2` 源码、全部相关生产文件与新测试、以及 r8 目录下的计划/共识/证据文档。
|
||||
|
||||
---
|
||||
|
||||
# R8 完整方案 v2 评审 — Opus 5.0(独立、只读)
|
||||
|
||||
## 结论:**CONSENSUS**
|
||||
|
||||
我对 **`docs/investigations/r8/plan-v2.md`(v2,SHA256 `426127ed9fb08aeddf8259ebdc4b1c24ebec8cda751a970ed99338a44b065f4c`,基线 `9ebe81c1b3611f9cc73e676b5b741c2be62c467a`)的完整范围**(v1 连接层设计 + 新增配置绑定)表示同意,**零条阻塞性分歧**。
|
||||
|
||||
**据此授权在该方案范围内实施所提议的配置绑定**:在 `cmd/common-main.go` 的 `buildServerCtxt` 中于 `IdleTimeout` 旁新增 `ctxt.ReadHeaderTimeout = ctx.Duration("read-header-timeout")`。实现与测试验收仍是独立环节,不在本次同意范围内;合并、发布、部署同样不在内。
|
||||
|
||||
**B1 判定:已解决。** 全仓库 `.go` 文件 Grep `golang.org/x/net` **零命中**;`internal/http/server_deadline_test.go:20-35` 只引入标准库与 `internal/deadlineconn`。h2 改由标准库 `stdhttp.Protocols` + `SetHTTP2(true)`(`:409-411`)强制,断言 `NegotiatedProtocol=="h2" && Proto=="HTTP/2.0"`(`:420`)与 `ProtoMajor!=2` 保护(`:383-384`)均保留——即使协议回落也会响亮失败而非静默降级。由于主模块无任何包(含测试)直接导入 `golang.org/x/net/*`,`go mod tidy` 没有理由把 `go.mod:297` 的 `// indirect` 提升为直接依赖,`Makefile:49-58` 的 `check-gen` 门禁不会被打红,也不会因此丢失该 require(它仍被其他模块间接需要)。N1 亦已落实:`deadlineconn_strict_test.go:165-178` 跨 3 个真实 300ms 周期、全程不重设上限地断言 clamp 不外推。N3 仅对 h2 夹具放宽 keep-alive idle(`server_deadline_test.go:406` `srv.IdleTimeout = 3 * time.Second`),未触及其他用例。
|
||||
|
||||
> **诚实性声明**:① 本会话仅有 Read/Grep/Glob,**无 shell**。因此我**没有重算 v2 的 SHA256**,也没有运行任何 `go test`/`go vet`/`go mod tidy`/`git`;我核验的是该路径下实际文件的**内容**(116 行,与下文逐条引用一致)。② 所有"日志显示"均为我**阅读记录**的转述,非我运行。③ 未使用子代理。④ 未验证当前 HEAD 是否等于所述基线。
|
||||
|
||||
---
|
||||
|
||||
## 一、最小充分性:我独立确认的闭链(C1–C8)
|
||||
|
||||
| # | 结论 | 我核验的依据 |
|
||||
|---|---|---|
|
||||
| C1 | 一行赋值**充分** | 全库仅 `cmd/server-main.go:912` 读 `globalServerCtxt.ReadHeaderTimeout`;唯一 HTTP server 构造点也仅 `server-main.go:906`(`xhttp.NewServer` 全库两处命中,另一处在 patch 文档里) |
|
||||
| C2 | 链路闭合 | `buildServerCtxt`(`common-main.go:370`)是 serverCtxt 唯一填充函数;`serverMain` 在 `server-main.go:799` 用它填 `globalServerCtxt` |
|
||||
| C3 | **默认行为零变化** | `DefaultIdleTimeout == DefaultReadHeaderTimeout == 30s`(`internal/http/server.go:44-48`)→ `readHeaderTimeout()`(Go `server.go:3752-3757`)绑定前后都返回 30s;`tlsHandshakeTimeout()`(`:969-983`)也都是 30s。plan 第 17 行"两值相等时默认值恰好看起来正常"我独立证实 |
|
||||
| C4 | YAML 不可能覆盖 | `ServerConfigCommon`/`Opts`(`internal/config/server.go:20-45`)**根本没有超时字段**;`configCommonToSrvCtx`(`server-main.go:274-302`)只处理 RootUser/Pwd/Addr/ConsoleAddr/CertsDir/FTP/SFTP。即便 merge 发生在赋值之后(`common-main.go:450-454`)也无字段可覆盖 |
|
||||
| C5 | 优先级/错误面**完全不变** | `minio/cli@v1.24.2/flag.go:569-594`:env 作为 flag 默认值、命令行再覆盖 → flag > env > 静态默认;"存在但为空"的 env 在 `time.ParseDuration("")` 处报错,**发生在 flag 解析阶段,与本绑定无关、绑定前已如此**(`config-baseline-env-fixture-failure.log` 正是该现象)。新行不引入任何新错误路径 |
|
||||
| C6 | h2 不受影响 | `net/http/http2.go:199-211` 只把 `ReadTimeout`/`WriteTimeout`/`IdleTimeout` 交给 h2,`ReadHeaderTimeout` **完全不进入** h2 配置。plan 第 34/71 行正确 |
|
||||
| C7 | 共享调用方不受影响 | `deadlineconn.New` 仅 `listener.go:73` 与 `dial_linux.go:130`(后者不开 strict);`SetReadDeadlineStrict` 生产调用仅 `listener.go:75`、`server.go:141/145` |
|
||||
| C8 | v1 在 v2 中**逐字保留**,实现与之一致 | plan-v1 `13-24/26-31/35-55/57-66/70-76/78-80` ↔ plan-v2 `23-34/36-41/52-72/74-83/94-100/102-104`;当前生产文件 `deadlineconn.go:37-38,56-87,129-154`、`listener.go:73-76`、`server.go:127-151`、`server-main.go:904-915` 与之吻合。v2 没有夹带修改已同意的 v1 语义 |
|
||||
|
||||
关于**证据可信度**:我不采信"已执行"的口头声明,但 `config_baseline_test.go.txt:26,36` 的设计本身具备自证力——同一夹具用 `MINIO_IDLE_TIMEOUT=2s` 并断言 `IdleTimeout==2s` 在全部 7 个子用例成立,这是一个**对照组**,排除了"夹具坏了"的解释;而 `ReadHeaderTimeout` 恒为 0。再叠加我上面对 `flag.go:569-594` 的独立源码核验,`config-baseline.log` 的每一行(30s/100ms/170ms/80ms/-1s)都可从源码推导出来。
|
||||
|
||||
**阻塞性发现:0 条。**
|
||||
|
||||
---
|
||||
|
||||
## 二、非阻塞发现(N1–N9)
|
||||
|
||||
1. **N1(新耦合,建议写入交付说明)** 绑定后 RHT 首次参与 TLS 握手窗口:`tlsHandshakeTimeout()`(Go `server.go:964-983`)取 RHT/RT/WT 中**正值的最小者**,并在 `:1962-1968` 同时下发读写 deadline。绑定前 RHT 恒为 0 → 窗口 = idle;绑定后 `--read-header-timeout=1s` 会把 TLS 握手(含 h2 的握手阶段)一起压到 1s。默认下无变化(30s)。
|
||||
|
||||
2. **N2(唯一"变松"的组合,最值得单列)** 相对**当前已实现的 v1**:用户只设 `--idle-timeout=2s`、不设 RHT 时,请求头上限从 2s 变为默认 30s。相对**真实基线 v0**(滚动续期、滴入可无限延长)仍是收紧。这是两个独立旋钮的正确语义,但它是全部组合中唯一"看起来放松"的一种,交付说明应明确点名,避免被误读为回归。
|
||||
|
||||
3. **N3(负值语义在明文/TLS 下不对称)** `--read-header-timeout=-1s` → `readHeaderTimeout()` 返回 -1s(`:3752-3757`),首请求处 `server.go:2038` 的 `d>0` 不成立 → **不下发任何 deadline**:明文连接因 `readExplicit` 为零值而在 `deadlineconn.go:71` 短路 clamp,回落到滚动 idle;TLS 连接则已在 `:1990-1991` 被清零 → `infReads=true` → 首个请求头**真正无上限**。keep-alive 第二个请求处 `:2179-2180` 显式下发零值,两者统一为无上限。这是 Go 文档化的 "negative = no timeout"(`:3072-3078`)且需用户显式选择,不要求改设计;建议测试断言并在说明中写明这一差异。
|
||||
|
||||
4. **N4(正面变化,但仍是可见变化)** `--idle-timeout=0`/负值时:绑定前 RT≤0 且 RHT=0 → `readHeaderTimeout()` 返回 0 → **完全没有请求头上限**,`tlsHandshakeTimeout()` 也为 0;绑定后默认 30s 生效。这是修复带来的安全性改善,建议同样纳入说明并补一条用例。
|
||||
|
||||
5. **N5(验证矩阵缺口)** v2 矩阵未提及 `buildscripts/test-timeout.sh`(`Makefile:177-179`),而它是仓库现存唯一端到端超时测试且直接使用 `--read-header-timeout 5s --idle-timeout 5s`。我推演结论不变:两值相等 → 绑定前后 `readHeaderTimeout()` 都是 5s,三个用例(20s 慢头 / 40s 慢 body / 1s+1s 正常)判定与 `:69` 的 `<= 11s` 时限均满足。建议验收时实跑并记录。顺带值得写进报告:该脚本用的是"一次长睡眠"而非"持续滴入"(`:44-61`),这正是 R8 缺陷长期未被它捕获的原因。
|
||||
|
||||
6. **N6(强烈建议)** 把配置用例固化为仓库内**常驻**回归测试,而非仅留 `evidence/*.txt`。缺陷本质是"结构体少复制一行",只有常驻断言能防止再次静默回归;夹具可直接落地(`cmd/testdata/config/1.yaml` 存在)。注意 `zero-fallback` 子用例期望值为 0,**绑定前后都通过、不具判别力**,应保留但标注。
|
||||
|
||||
7. **N7(备案,无需改动)** 第二调用方 `cmd/fmt-gen.go:80` 也执行 `buildServerCtxt`,而 `fmtGenFlags`(`:30-45`)未注册该 flag。我核验 `minio/cli@v1.24.2/flag_generated.go:141-151`:`lookupDuration` 对未注册 flag 返回 0 且不 panic;现存 `ctx.Duration("idle-timeout")` 已在该路径长期运行,证明模式安全,且 fmt-gen 不启动 HTTP server。
|
||||
|
||||
8. **N8(勿顺手清理)** `common-main.go:444` 与 `:448` 重复赋值 `ctxt.UserTimeout`,属既有无害冗余。新行紧邻该处,**请不要在本次改动中一并清理**,以保持 diff 最小。
|
||||
|
||||
9. **N9(证据闭环)** `vet.log` 仍为 0 字节(v1 评审 N10 已接受尚未回填);v2 两条新链建议统一记录命令行、退出码与二进制 SHA256。`runtime-v1.json` 只是**修复前**证据(`expected_rejection=false`,两例均 `HTTP/1.1 200 OK`),必须补一份 `expected_rejection=true` 的同探针输出才算闭环。我另行核验了探针判据 `rejected = not data`(`runtime_probe.py:59`)**正确**:读头超时后 Go 走 `isCommonNetReadError`(`server.go:1915-1926`,`net.Error.Timeout()` 为真)→ `:2090-2091` `return // don't reply`,确实不写任何响应字节,不会出现 408 误判。
|
||||
|
||||
---
|
||||
|
||||
## 三、边界(不由本次修复覆盖,请在交付说明中重述)
|
||||
|
||||
- HTTP/2 既有的**绝对** per-stream `ReadTimeout` 不在 R8 范围(`http2.go:203` 直接透传 `ReadTimeout`)。
|
||||
- TLS 握手**写**侧仍为滚动截止,属既有边界。
|
||||
- 我未执行任何测试;`darwin-race.log` / `linux-race.log` / `grid.log` / `default-30s-transfers.log` 等均为我阅读的记录,不构成我的背书。修改过的 h2 与 strict 夹具需在本轮变更后重跑并回填。
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"baseline_sha": "9ebe81c1b3611f9cc73e676b5b741c2be62c467a",
|
||||
"plan": "plan-v2.md",
|
||||
"plan_sha256": "426127ed9fb08aeddf8259ebdc4b1c24ebec8cda751a970ed99338a44b065f4c",
|
||||
"requested_model": "claude-opus-5",
|
||||
"effort": "max",
|
||||
"cli_version": "2.1.270",
|
||||
"status": "completed",
|
||||
"created_at_utc": "2026-09-15T15:59:43.188547+00:00",
|
||||
"actual_assistant_models": [
|
||||
"claude-opus-5"
|
||||
],
|
||||
"result_subtype": "success",
|
||||
"is_error": false,
|
||||
"session_id": "a1e9e8a2-3417-440b-93b6-c749cbca204f",
|
||||
"duration_ms": 211549,
|
||||
"raw_path": "/Users/vonng/tmp/silo-r8-01a0a5b9/opus-v2.jsonl",
|
||||
"stderr_path": "/Users/vonng/tmp/silo-r8-01a0a5b9/opus-v2.stderr.log",
|
||||
"raw_sha256": "28a1266b05b8813295168530d9b9dcc792a379a798e74419ee1f06aad364defd",
|
||||
"review_sha256": "da31df576da632377c963da2ad32e96a9bf4d5f747fb8e2493573b32a899a4ed",
|
||||
"completed_at_utc": "2026-09-15T16:07:10.728735+00:00",
|
||||
"verdict": "CONSENSUS",
|
||||
"blocking_disagreements": 0
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
You are the independent actual Opus 5.0 reviewer for SILO R8. Read-only review; no code changes. Read AGENTS.md, docs/investigations/r8/plan-v1.md (SHA256 7cb609e37e3199ecd93c992f08d123968ba8082682a108f20490e0644d735366), docs/investigations/r8/evidence/baseline.log, internal/deadlineconn/deadlineconn.go, internal/http/listener.go, internal/http/server.go, cmd/server-main.go (timeout configuration), internal/http/dial_linux.go, internal/grid/manager.go (unwrap), cmd/utils.go (TLS NextProtos). Inspect actual Go1.27.1 net/http code as needed using allowed Read/Grep tools; baseline is 9ebe81c1b3611f9cc73e676b5b741c2be62c467a. No production patch exists yet.
|
||||
|
||||
The user requires real Opus discussion and explicit same-plan agreement before implementation. Independently challenge correctness and minimal compatibility. Verify exact ConnState phase ordering, TLS handshake, zero deadline/background EOF behavior, keep-alive second header, long uploads, strict mode concurrency, H2 preservation and Linux internode/grid callers. State blocking vs nonblocking findings with concrete source reasoning; compare alternatives if there is a simpler correct approach. Respond in Chinese (technical identifiers preserved), with verdict CONSENSUS or REVISE. CONSENSUS must explicitly name plan v1 and SHA256 and mean there are no remaining blocking disagreements; test implementation still follows. If any blocker exists do not give consensus. Do not simulate tools or pretend tests were run.
|
||||
@@ -0,0 +1,11 @@
|
||||
You are the actual independent Opus 5.0 reviewer. Read-only; do not attempt to write any file. The user requires explicit same-version agreement for the COMPLETE R8 scope before the new configuration change is implemented.
|
||||
|
||||
Review plan v2 at docs/investigations/r8/plan-v2.md, SHA256 426127ed9fb08aeddf8259ebdc4b1c24ebec8cda751a970ed99338a44b065f4c, on baseline 9ebe81c1b3611f9cc73e676b5b741c2be62c467a. V1 connection repair is already implemented after actual v1 CONSENSUS; see consensus.md and review/opus-v1.md. V1 does not cover the newly found CLI binding omission. The only new proposed production edit is ctxt.ReadHeaderTimeout = ctx.Duration("read-header-timeout") beside IdleTimeout in cmd/common-main.go. It has NOT been applied.
|
||||
|
||||
Evidence: evidence/config-baseline.log and config_baseline_test.go.txt exercise the REAL cli.App with serverCmd.Flags and buildServerCtxt. CLI parses correct default/flag/env/precedence/YAML/negative durations, but context is 0. Explicit zero remains 0. Also read evidence/runtime-v1.json and runtime_probe.py: a compiled v1 SILO binary was launched on disposable localhost-only storage; both flag and env set 100ms, idle 2s, but a 400ms health request header still returns HTTP 200 because missing binding leaves ReadHeaderTimeout=0 and Go falls back to idle. These are real tests by Codex, not claims that you ran them.
|
||||
|
||||
Read actual cmd/common-main.go buildServerCtxt; cmd/server-main.go ServerFlags, configCommonToSrvCtx, server setup; current DeadlineConn/listener/server files and new tests; review/implementation-opus.md if it now exists (v1 implementation review only); v2 validation matrix and compatibility notes. Independently confirm minimal sufficiency and side effects of binding defaults and custom values, zero/negative semantics, env precedence, YAML retention, header vs idle behavior, keepalive, TLS, h2, body/download renewal and shared callers. Do not trust a patch/plan claim as execution. Inspect Go1.27.1 source as needed.
|
||||
|
||||
Return Chinese verdict CONSENSUS or REVISE for COMPLETE plan v2, explicitly naming v2 and its SHA256. If consensus, say there are zero blocking disagreements and authorize the proposed configuration binding within that plan, with implementation/testing still separate. List numbered blocking/nonblocking findings with concrete evidence. Any substantive required design change must use REVISE. No rate-limit or missing reply counts as agreement.
|
||||
|
||||
Additional completed v1 implementation review: review/implementation-opus.md returned REQUEST_CHANGES for one TEST dependency issue (new direct x/net/http2 import while go.mod marked module indirect), explicitly no production behavior defect. Read review/implementation-dispositions.md. The test now uses the standard Go HTTP/2-only Protocols setting, so no external x/net import or go.mod change is needed; h2 assertions remain. Also added repeated-clamp unit coverage and widened only h2 keep-alive idle. Independently decide whether B1 is resolved and whether COMPLETE v2 has any remaining blockers.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"internal/deadlineconn/deadlineconn.go": "b9272ef640f1d4403b3d0af6cdbaba9186c51ad9a0226dfe449e8ef738e1ec4b",
|
||||
"internal/http/listener.go": "49628575367f6ab9b6986caf594726d74d370f7d2ac4eed582903600b6eb3fa2",
|
||||
"internal/http/server.go": "b7b0355f2781f8c5f7c77bc910cd4180cd3e5f22a87de41bd35ef119d36b4cdf",
|
||||
"cmd/server-main.go": "04c265de211412ba0297396928096d7f2d971244a957a3126154846035263514",
|
||||
"cmd/common-main.go": "c06df6c3051ceb264f7ddbdddea33ebe38a59e0c113b5c4c44906c1c2e08a01b",
|
||||
"internal/deadlineconn/deadlineconn_strict_test.go": "f405690c9ff044595f48323d68f4a9b33ce695b3ad6820f54f17151067bfae5e",
|
||||
"internal/http/server_deadline_test.go": "36103c155795ab24a7b8f3101f2091c793f9cbe1f2459b5bea51a8a2dc192a52",
|
||||
"internal/http/dial_deadline_linux_test.go": "0939d05b72a09760d53fcdf249775989e3f89bca824b9961d0b2a657ebfdf41e"
|
||||
}
|
||||
Reference in New Issue
Block a user