Repository navigation
feat: 内置指标 + StxEtx 向量化 + 浸泡套件 + epoch 收口 + demo 场景 5 - #46
Merged
Merged
Conversation
added 2 commits
August 29, 2026 02:50
- 内置指标(Meter StreamFrame,System.Diagnostics.Metrics,零外部依赖): 帧/字节收发计数、重连次数、会话时长直方图、发送队列水位(入队采样), 单一 endpoint 标签;ns2.0 经 System.Diagnostics.DiagnosticSource 包获得 同款 API(netfx 可用)。README 双语新增"内置指标"章节,MeterListener 可观测性测试覆盖全部仪器 - StxEtxFramer 切帧向量化:net8+ 用 SearchValues 跳扫候选(两套独立实现, 语义逐字节等价),实测 ≈1.1µs/帧 → ≈50ns/帧(约 22 倍);ns2.0 回退原实现。 README/bench 性能数据以 2026-08-28 重跑刷新(含指标接入后的真实路径: 端到端 ≈16万条/秒、RTT ≈51µs,机器相关) - 会话纪元改为 Connected 发布点分配(与会话编号同点):闭合"发布后、任务 未创建"窗口内旧纪元幽灵卷入新生会话的瞬态误杀(评审附带发现), 发布窗口注入幽灵的回归测试锁定 - 浸泡/混沌套件(STREAMFRAME_SOAK_SECONDS 环境变量门控,默认不跑): 长流完整性(顺序/无丢失/无重复)+ 随机故障混沌(FIN/RST/半帧/突发, 终局无悬挂、普通消息续送核对、绑定消息无重复投递),20s/60s 双档验证 - demo 场景 5:会话感知收发全流程演示 - 覆盖率:分支 79.8% → 81.2%(worker 编号校验分支/XML 超限与坏帧/守卫)
- ConnectionLifecycle 测试误把 1024B 负载写成了入站方向(本地时序竞态 掩盖,ubuntu CI 暴露 Single 断言收到两帧)——出站仅 sendTask,入站 恰好一帧 - 恢复二分调试期间临时禁用的半帧注入与 RST 杀死动作,清理残留的 不可达分支与未引用标签;完整混沌 20s 冒烟通过
This was referenced Aug 29, 2026
CSJ608
pushed a commit
that referenced
this pull request
Aug 29, 2026
排查结论:原始"用户 Reconnect() 竞速楔死监听"无法复现——顺序复现(8 轮 服务端主动重连,全部秒级可用)与并发复现(杀对端自动重连 + 用户 Reconnect 竞速)均 3× 通过;混沌套件恢复该动作后 20s/30s 多轮全绿。此前观察到的楔死 系当时混沌测试自身的缺陷组合(双重连接泄漏 + 收尾未释放对端 + 变量遮蔽致 静默编译失败),已在 PR #46 排除。 仍修复排查中识别的两个真实弱点(防御性): - AcceptAsync 改为逐次尝试持锁、重试延迟锁外等待——旧实现整个重试循环 持有 _acceptLock,绑定/接受持续失败期间会堵死其它接受循环,故障期被放大 - 监听 socket 设置 SO_REUSEADDR——服务端主动关闭后立即重绑不受 2MSL/ TIME_WAIT 限制;Windows 实测宽松,Linux 无此选项会遇 EADDRINUSE, 一并设置保持跨平台一致 新增确定性回归测试 RapidServerInitiatedReconnects_PortStaysAcceptable; 混沌套件恢复用户重连动作并常驻验证。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
上轮规划的四项 + 小项全部落地。
1. 内置指标(System.Diagnostics.Metrics,零外部依赖)
Meter
StreamFrame、单一endpoint标签,七台仪器:frames_sent/received、bytes_sent/received、reconnects(计数器)+session_duration、send_queue_length(直方图)。接线点:worker 整帧写完、解码器切帧、收发字节分片、Retry 发布、会话拆除、每次入队。README 双语新增章节(含最简 MeterListener 订阅示例)。实现说明:ns2.0 不需要 shim——
System.Diagnostics.DiagnosticSource10.x 的 ns2.0 资产自带完整 Metrics API(初版写了 no-op shim 与真类型冲突后移除),显式 PackageReference 固定依赖。可观测性测试用
MeterListener对既有仪器直接EnableMeasurementEvents(绕开"InstrumentPublished 只对新发布仪器回调"的限制),驱动一次完整连接生命周期断言七台仪器全部有真实记录。2. StxEtx 向量化
net8+ 用
SearchValues<byte>跳扫候选字节(不含 STX/ETX 的整段直接跳过);ns2.0 保留逐字节实现——两套独立完整实现(初版共享循环体的重构有 continue 跳过 i++ 的死循环 bug,拆开杜绝此类错位)。语义逐字节等价,现有 StxEtx/FrameDecoder 测试全绿。实测(2026-08-28 本机):≈1.1 µs/帧 → ≈50 ns/帧(约 22 倍),扫描吞吐 ≈1.2 GB/s。README/bench 性能段以本轮数据刷新,端到端数字含指标接入后的真实路径(≈16 万条/秒、RTT ≈51 µs,机器相关、附复现入口)。
3. 浸泡/混沌套件(默认不运行)
STREAMFRAME_SOAK_SECONDS=120 dotnet test --filter FullyQualifiedName~Soak启用;未设置即跳过,不影响 CI 与提交前验证。两个用例:已通过 20s/60s 双档验证。过程中排掉三个测试自身 bug(重复连接、收尾未释放对端、变量遮蔽导致的静默编译失败),库本体在纯对端死亡混沌下完整性成立;混沌刻意不含用户显式
Reconnect()——它与自动重连并发竞速会触发双 StartAsync 接受循环的存量脆弱点(监听状态机楔死),属"状态过渡原子化"的独立设计任务,建议后续开 issue。4. epoch 线性化收口(评审附带发现)
会话纪元改为在 Connected 发布点与会话编号同点分配(StartSession 改为接收发布期分配的 id+epoch,病态重入兜底同时刷新两者):"发布后、任务未创建"窗口内的旧纪元幽灵在入口即被丢弃。回归测试在 Connected 发布回调内(最紧时序)反射注入旧纪元幽灵,断言新生会话存活。
5. 小项
测试
83×3 = 249 全绿(新增 6:指标 1、幽灵回归 1、XML 2、soak 2[env 门控]。soak 在无环境变量时即刻返回)。