fix(notify): 根治低带宽控制面阻塞与传输写入卡死
- 为控制消息增加优先级、公平调度、队列字节预算和自适应批处理 - 支持可取消的写门等待,收紧 shared/dedicated bulk、stream 和 Reply 写入边界 - 修复 bulk reset/close、连接 handoff 和安全 profile 切换时序 - 保留旧取消与超时错误契约,新增阶段化 TransportSendError - 增加 ReplyCtx、ReplyObjCtx、写超时配置及黑洞连接和竞态回归测试
This commit is contained in:
+24
-8
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user