fix: 修复监听 accept 退避与握手前超时上限
This commit is contained in:
@@ -373,6 +373,25 @@
|
||||
- 备选方案:放到 `internal/admin`(超出 N 目录)。
|
||||
- 影响:A/I 接线时调用这些方法即可。
|
||||
|
||||
### 复审修复 L-02
|
||||
|
||||
1. **accept 临时错误退避重试**
|
||||
- 原条款:无(issue #21);net/http `Serve` 对 Accept 临时错误退避。
|
||||
- 实际做法:`acceptLoop` 仅在已关闭或 `errors.Is(err, net.ErrClosed)` 时退出;其余错误记日志后从 5ms 倍增到最多 1s 再 Accept。
|
||||
- 原因:文件描述符短暂耗尽不应永久停收新连接。
|
||||
- 备选方案:只对 `net.Error.Timeout` 重试(Go 已弃用 Temporary)。
|
||||
- 影响:进程在瞬时 EMFILE/ENOBUFS 后可自行恢复。
|
||||
|
||||
### 复审修复 L-01
|
||||
|
||||
1. **握手前超时、CONNECT 预读上限、HTTP IdleTimeout、握手前信号量**
|
||||
- 原条款:DEVELOPMENT 4.2 仅规定首字节 10s;issue #20。
|
||||
- 实际做法:TLS `Handshake` 前 `SetDeadline(10s)`;MQTT CONNECT 剩余长度 >64KiB 立即关闭;预读 CONNECT 头超时同样 10s;`OnMQTT` / `AttachWS` 前再设读超时;`http.Server` 设 `IdleTimeout=120s`、`MaxHeaderBytes=64KiB`;accept 到分流完成占用容量 1024 的信号量,满则关新连接。测试用 `HandshakeTimeout`/`IdleTimeout`/`PreHandshakeLimit` 缩短等待。
|
||||
- 原因:`MaximumClients` 只统计认证后会话,握手前可被慢连接占满。
|
||||
- 备选方案:给 HTTP 再加 `ReadTimeout`(须在 WS Accept 前清掉,改动面更大)。
|
||||
- 影响:不完整 TLS/CONNECT 约 10s 内断开;超长 remaining length 的 CONNECT 不再让 mochi 预分配近 768KiB。
|
||||
- 未做:L-01 验收里「接真实 broker 只发 0x10」在 listener 层用 `OnMQTT` 回调等价覆盖(预读阶段即关闭,不进入 broker)。WebSocket 升级后超时只在 `ws.go` 设读 deadline,未另写 broker 测试(范围限制)。
|
||||
|
||||
## 消息 M
|
||||
|
||||
### M1 2026-09-30
|
||||
|
||||
Reference in New Issue
Block a user