Skip to content

fix: 被取代接受循环的杂音 Connecting 与迟到接入语义定稿(#68 PR-3) - #96

Merged
CSJ608 merged 3 commits into
mainfrom
fix-68-superseded-accept-gate
Oct 15, 2026
Merged

CSJ608 merged 3 commits into
mainfrom
fix-68-superseded-accept-gate

Conversation

@CSJ608

@CSJ608 CSJ608 commented Oct 15, 2026

Copy link
Copy Markdown
Owner

关闭范围:#68 的 PR-3——统一发布入口的最后一块:被取代接受循环的 Connecting 发布与迟到 accept 的处置语义。至此 #68 的代码侧范围(行为基线、Session 对象化、拆除分段、发布收敛)全部完成。

改动

① 代次复查前置:被取代的接受循环从重试退避中醒来时,此前会先发布 Connecting 再检查代次退出——状态序列混入替换者之外的杂音。现复查前置,被取代循环零发布。

② 迟到 accept 收编语义定稿(实现 + 文档 + 测试锁定):被取代循环迟到完成的 accept 照常发布 Connected 并建立会话。理由:监听器是连接级共享资源(InitServer 复用 _server),客户端向服务器端口的接入本身合法;收编后由纪元机制与会话隔离收敛(取代者循环取锁后经代次检查静默退出)。

  • 曾实现并验证过反方向("迟到连接当场释放"):RapidServerInitiatedReconnects 回归测试随即确定性复现真实客户端被重置吞掉——违背接入契约,已回退并在 DESIGN/CHANGELOG 记录否决理由。
  • 代次门控的边界因此定稿为:监听器生命周期(创建/关闭/接受串行化)与 Connecting 发布,而非客户端接入。

测试

  • 新增确定性回归 ReconnectWhileAccepting_LateClientStillAdmittedBySupersededLoop:accept 等待期间 Reconnect 取代循环(Retry/Connecting 发布在 Reconnect 返回前同步完成,全确定性),迟到客户端照常收编,状态序列恰为 Connecting→Retry→Connecting→Connected。
  • RapidServerInitiatedReconnects 首次连接等待预算 10s→30s,与同测试下方 30s 及其注释哲学对齐(探测永久不可用,并行负载下偶发慢收敛不应误报;bug: 用户显式 Reconnect() 与自动重连竞速可长期楔死被动端监听(重绑失败 + 接受循环持有锁重试) #47 契约由 20s 重绑死线探测,不受影响)。

验证与如实披露

  • 三 TFM 全套 5 轮:14/15 TFM-run 全绿;唯一红点是 RapidServerInitiatedReconnects(3 次,含一次 30s 全预算挂起)。
  • 该失败为 main 既有问题:干净 main(fb94cab)同样复现(1/9 TFM-run,12s 挂起);PR-3 源码完全回退后亦复现。特征:仅本机三目标顺序执行的持续负载下出现(net8/net10),单跑/组合/CI(ubuntu 矩阵)从未复现;真实楔死而非慢收敛。建议后续单独立 issue 调查(怀疑方向:SO_REUSEADDR 在 Windows 上的双监听器语义),本 PR 不改变其触发条件。

关联

@CSJ608
CSJ608 merged commit d0bca60 into main Oct 15, 2026
5 checks passed
@CSJ608
CSJ608 deleted the fix-68-superseded-accept-gate branch October 15, 2026 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant