## 现象 `ReconnectWedgeTests.RapidServerInitiatedReconnects_PortStaysAcceptable` 在本机(Win10 22H2,i5-12500H)**三目标顺序执行**(`dotnet test StreamFrame.slnx`,net10→net8→net48 连续)且机器已持续高负载运行一段时间后,间歇性失败: - 失败形态:`WaitConnectedAsync` 全预算挂起(10s 预算时代 12–16s 失败;PR #96 已把该处预算对齐 30s 后出现 31–32s 全预算挂起)——**真实楔死**,非慢收敛:客户端 TCP connect 成功、服务端停在 Connecting。 - 频率:约 10–20% 的 TFM-run(net8/net10 均出现,net48 从未)。 - 不出现于:单 TFM 单跑、同类组合跑、CI(ubuntu + windows 矩阵,含 #94/#95/#96 多次全绿)。 ## 已排除 - **非 #68 三个 PR 引入**:干净 main(fb94cab)同样复现(1/9 TFM-run,12s 挂起);PR-3 源码完全回退后亦复现。PR-3 调试期间曾以 4/4 连红误导为回归,实为本机状态依赖的既有问题被持续负载放大。 - 曾短暂引入"被取代循环迟到 accept 当场释放"实现:该实现会让此测试**确定性**失败(真实客户端被重置吞掉),已回退——与本 issue 的间歇形态不同,但说明该测试对"客户端接入被吞"敏感,可作调查探针。 ## 调查方向建议 1. 楔死意味着客户端 SYN 落在了某个**无循环 accept** 的监听 socket 上(TCP 层完成握手、无人消费)。怀疑重点:`SO_REUSEADDR` 在 Windows 上的语义允许同端口双 bind——若新旧监听器短暂并存(重绑窗口),连接可能落到孤儿监听器的 backlog。需要端口级取证(netstat/Get-NetTCPConnection 快照 + 楔死瞬间抓取)。 2. 复现配方:本机连续跑三目标全套 ×N 轮预热机器状态后命中率上升;可脚本化复现 + 楔死时 dump `_server`/`_acceptLoopId`/`_acceptLock` 状态(白盒)定位是"双监听器"还是"循环全退"。 3. 若确认 Windows 双 bind 语义问题:`InitServer` 可改用 `ExclusiveAddressUse` + 受控重绑窗口,或 bind 后校验唯一性。 ## 关联 - #47(该测试的来源与代次门控设计)、#96(预算对齐与迟到接入语义定稿的 PR 描述里有完整取证记录)、#68(DESIGN 已知限制/竞速语义章节)。
Activity
CSJ608 commentedon Oct 23, 2026
发布前定向复验已完成:基线29d4b92,原Win10 19045机器,SDK10.0.402;受控持续CPU背景负载(半数逻辑CPU对应的工作进程,80%工作/20%休息,60秒预热),按net10→net8→net48全套连续十轮,轮间不重启/清场。30/30 TFM-run成功,普通测试累计5320通过、0失败;Wedge关键用例30/30通过,各含八轮重连和新会话双向报文。三个Soak按默认Skip,不计入此次长测。此前45场600秒长测另有记录。现有#104修复及新判据已覆盖相关监听/交接风险,本轮未复现恢复停滞,故恢复2.7.1发布准备。注意:旧“握手成功+Connecting超时”不足以唯一证明孤儿监听器;新测试等待旧会话结束改变了接入时序,本次不是历史现场唯一因果复现。暂保留Issue开放作为观察入口,不宣称历史根因已唯一确认。仓库将归档 docs/ISSUE-97-VALIDATION.md。
build: 准备 2.7.1 发布并记录 #97 十轮定向验证