Skip to content

why send flow control error when connection window is 0 #13676

@iJIAJIA

Description

@iJIAJIA

对于dubbo自定义的http2 流控窗口逻辑有点疑惑.

复现步骤:
dubbo version: 3.2.x

  1. 调整peer initialize window size from 8M to 64k(65535) 越小越容易复现.
  2. provider实现一个大数据返参接口.(如 listUser)

TriHttp2RemoteFlowController

// FlowState
int writeAllocatedBytes(int allocated) {
            ...
            try {
                ...
            } finally {
                ...
                // 当connection window为0时, 此时会直接发送flow control error, 阻断连接. 
                if(monitor.isOverFlowControl()){
                    logger.info(String.format("[HTTP2] connection window throttling, stream:%d overflow flow controlling", stream.id()));
//                    cause = new Throwable();
//                    cancel(FLOW_CONTROL_ERROR,cause);
                }
            }
            return writtenBytes;
        }

provider报:

Caused by: io.netty.handler.codec.http2.Http2Exception$StreamException: TotalPendingBytes size overflow for stream: 3
at io.netty.handler.codec.http2.Http2Exception.streamError(Http2Exception.java:153)
at org.apache.dubbo.rpc.protocol.tri.TriHttp2RemoteFlowController$ListenerWritabilityMonitor.checkConnectionThenStreamWritabilityChanged(TriHttp2RemoteFlowController.java:794)
at org.apache.dubbo.rpc.protocol.tri.TriHttp2RemoteFlowController$ListenerWritabilityMonitor.stateCancelled(TriHttp2RemoteFlowController.java:755)
... 35 common frames omitted

这里很好奇, http2 官方协议并没有规定, 当 connection window为0 时 直接发送 flow_control_error. 常规做法不应该是暂停发送, 等待
窗口更新后 继续传输么?

Metadata

Metadata

Assignees

No one assigned

    Labels

    component/sdkRelated with apache/dubbohelp wantedEverything needs help from contributorstype/enhancementEverything related with code enhancement or performance

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions