fix(notify): 根治低带宽控制面阻塞与传输写入卡死

- 为控制消息增加优先级、公平调度、队列字节预算和自适应批处理
- 支持可取消的写门等待,收紧 shared/dedicated bulk、stream 和 Reply 写入边界
- 修复 bulk reset/close、连接 handoff 和安全 profile 切换时序
- 保留旧取消与超时错误契约,新增阶段化 TransportSendError
- 增加 ReplyCtx、ReplyObjCtx、写超时配置及黑洞连接和竞态回归测试
This commit is contained in:
2026-08-14 10:16:37 +08:00
parent 98ef9e7fcc
commit 0826e17063
45 changed files with 4231 additions and 293 deletions
+24 -8
View File
@@ -239,6 +239,14 @@ func (c *ClientCommon) writeToTransport(data []byte) error {
}
func (c *ClientCommon) writePayloadToTransport(payload []byte) error {
return c.writePayloadToTransportContext(context.Background(), payload)
}
func (c *ClientCommon) writePayloadToTransportContext(ctx context.Context, payload []byte) error {
return c.writePayloadToTransportContextTimeout(ctx, payload, 0)
}
func (c *ClientCommon) writePayloadToTransportContextTimeout(ctx context.Context, payload []byte, writeTimeout time.Duration) error {
binding := c.clientTransportBindingSnapshot()
if binding == nil {
return net.ErrClosed
@@ -247,15 +255,23 @@ func (c *ClientCommon) writePayloadToTransport(payload []byte) error {
if queue == nil {
return errClientSessionQueueUnavailable
}
return binding.withConnWriteLock(func(conn net.Conn) error {
if c.maxWriteTimeout.Seconds() != 0 {
_ = conn.SetWriteDeadline(time.Now().Add(c.maxWriteTimeout))
}
writeTimeout = shorterPositiveDuration(c.maxWriteTimeoutSnapshot(), writeTimeout)
lockAcquired, err := binding.withConnWriteLockContextStopTimeout(ctx, nil, writeTimeout, func(conn net.Conn) error {
return writeFramedPayloadUnlocked(conn, queue, payload)
})
if lockAcquired && err != nil {
if conn := binding.connSnapshot(); conn != nil && !isPacketTransportConn(conn) {
binding.closeConn()
}
}
return err
}
func (c *ClientCommon) writeControlPayloadToTransport(payload []byte) error {
func (c *ClientCommon) writeControlPayloadToTransport(ctx context.Context, payload []byte, priority controlPriority) error {
return c.writeControlPayloadToTransportTimeout(ctx, payload, priority, 0)
}
func (c *ClientCommon) writeControlPayloadToTransportTimeout(ctx context.Context, payload []byte, priority controlPriority, writeTimeout time.Duration) error {
binding := c.clientTransportBindingSnapshot()
if binding == nil {
return net.ErrClosed
@@ -266,11 +282,11 @@ func (c *ClientCommon) writeControlPayloadToTransport(payload []byte) error {
}
conn := binding.connSnapshot()
if conn == nil || isPacketTransportConn(conn) {
return c.writePayloadToTransport(payload)
return c.writePayloadToTransportContextTimeout(ctx, payload, writeTimeout)
}
sender := binding.controlBatchSenderSnapshot()
if sender == nil {
return c.writePayloadToTransport(payload)
return c.writePayloadToTransportContextTimeout(ctx, payload, writeTimeout)
}
return sender.submit(payload, writeDeadlineFromTimeout(c.maxWriteTimeout))
return sender.submitContext(ctx, payload, shorterPositiveDuration(c.maxWriteTimeoutSnapshot(), writeTimeout), priority)
}