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
+33 -3
View File
@@ -671,6 +671,21 @@ func (s *streamHandle) CloseWrite() error {
return s.close(false)
}
func (s *streamHandle) newControlContext() (context.Context, func(), error) {
if s == nil {
return nil, func() {}, io.ErrClosedPipe
}
s.mu.Lock()
parent := context.Background()
writeTimeout := s.writeTimeout
s.mu.Unlock()
ctx, cancel, _, err := s.newWriteContext(parent, writeTimeout)
if err != nil {
return nil, func() {}, err
}
return ctx, cancel, nil
}
func (s *streamHandle) close(full bool) error {
if s == nil {
return nil
@@ -692,7 +707,12 @@ func (s *streamHandle) close(full bool) error {
s.mu.Unlock()
if closeFn != nil {
if err := closeFn(context.Background(), s, true); err != nil && !errors.Is(err, errStreamNotFound) {
ctx, cancel, err := s.newControlContext()
if err != nil {
return err
}
defer cancel()
if err := closeFn(ctx, s, true); err != nil && !errors.Is(err, errStreamNotFound) {
return err
}
}
@@ -716,7 +736,12 @@ func (s *streamHandle) close(full bool) error {
s.mu.Unlock()
if closeFn != nil {
if err := closeFn(context.Background(), s, full); err != nil && !errors.Is(err, errStreamNotFound) {
ctx, cancel, err := s.newControlContext()
if err != nil {
return err
}
defer cancel()
if err := closeFn(ctx, s, full); err != nil && !errors.Is(err, errStreamNotFound) {
return err
}
}
@@ -758,7 +783,12 @@ func (s *streamHandle) Reset(err error) error {
s.mu.Unlock()
if resetFn != nil {
if sendErr := resetFn(context.Background(), s, streamResetMessage(resetErr)); sendErr != nil {
ctx, cancel, err := s.newControlContext()
if err != nil {
return err
}
defer cancel()
if sendErr := resetFn(ctx, s, streamResetMessage(resetErr)); sendErr != nil {
return sendErr
}
}