Skip to content

test: [P2] RapidServerInitiatedReconnects 在持续负载的三目标顺序执行下间歇真实楔死(main 既有) #97

Open

Description

@CSJ608

现象

ReconnectWedgeTests.RapidServerInitiatedReconnects_PortStaysAcceptable 在本机(Win10 22H2,i5-12500H)三目标顺序执行(dotnet test StreamFrame.slnx,net10→net8→net48 连续)且机器已持续高负载运行一段时间后,间歇性失败:

已排除

  • 非 refactor: [P2] 收敛连接状态转换与会话资源所有权,降低重连和停机竞态维护成本 #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 后校验唯一性。

关联

Activity

  1. CSJ608 commented on Oct 23, 2026

    @CSJ608
    OwnerAuthor

    发布前定向复验已完成:基线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。

  2. added a commit that references this issue on Oct 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions