[
https://issues.apache.org/jira/browse/HTTPCORE-707?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17467014#comment-17467014
]
Lubos Husivarga commented on HTTPCORE-707:
------------------------------------------
Hi [~olegk]
I have produced full wire and context log, but I don't find it helpful. I do
multiple exchanges before the exchange ex-0000000007 which fails with frame
size exceeded error.
[^context_wire_log.txt]
The log does not trace remote config setting which is:
[headerTableSize=4096, pushEnabled=true, maxConcurrentStreams=256,
initialWindowSize=65536, {*}maxFrameSize{*}=16777215,
maxHeaderListSize=2147483647, compressionEnabled=true]
Exception's stack trace is here:
Daemon Thread [httpclient-dispatch-1] (Suspended (breakpoint at line 70 in
FrameOutputBuffer))
FrameOutputBuffer.write(RawFrame, WritableByteChannel) line: 70
ClientH2StreamMultiplexer(AbstractH2StreamMultiplexer).streamDataFrame(int,
AtomicInteger, ByteBuffer, int) line: 342
ClientH2StreamMultiplexer(AbstractH2StreamMultiplexer).streamData(int,
AtomicInteger, ByteBuffer) line: 363
AbstractH2StreamMultiplexer.access$11(AbstractH2StreamMultiplexer, int,
AtomicInteger, ByteBuffer) line: 345
AbstractH2StreamMultiplexer$H2StreamChannelImpl.write(ByteBuffer) line:
1424
ClientH2StreamHandler$1.write(ByteBuffer) line: 92
LoggingAsyncClientExchangeHandler$1.write(ByteBuffer) line: 102
BasicAsyncEntityProducer.produce(DataStreamChannel) line: 129
SimpleRequestProducer(BasicRequestProducer).produce(DataStreamChannel)
line: 104
BasicClientExchangeHandler<T>.produce(DataStreamChannel) line: 91
LoggingAsyncClientExchangeHandler.produce(DataStreamChannel) line: 90
ClientH2StreamHandler.produceOutput() line: 172
AbstractH2StreamMultiplexer$H2Stream.produceOutput() line: 1620
ClientH2StreamMultiplexer(AbstractH2StreamMultiplexer).produceOutput()
line: 1176
ClientH2StreamMultiplexer(AbstractH2StreamMultiplexer).onOutput() line: 474
ClientH2IOEventHandler(AbstractH2IOEventHandler).outputReady(IOSession)
line: 74
ClientH2IOEventHandler.outputReady(IOSession) line: 39
SSLIOSession.encryptData(IOSession) line: 633
SSLIOSession.access$400(SSLIOSession, IOSession) line: 73
SSLIOSession$1.outputReady(IOSession) line: 207
InternalDataChannel.onIOEvent(int) line: 150
InternalDataChannel(InternalChannel).handleIOEvent(int) line: 51
SingleCoreIOReactor.processEvents(Set<SelectionKey>) line: 178
SingleCoreIOReactor.doExecute() line: 127
SingleCoreIOReactor(AbstractSingleCoreIOReactor).execute() line: 85
IOReactorWorker.run() line: 44
Thread.run() line: 748
In my use case I create the HTTP Client like this:
_httpManager = PoolingAsyncClientConnectionManagerBuilder.create()_
_.setDefaultConnectionConfig(ConnectionConfig.custom()_
_.setTimeToLive(TimeValue.NEG_ONE_MILLISECOND)_
_.build())_
_.setDefaultTlsConfig(TlsConfig.custom()_
_.setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_2)_
_.build())_
_.build();_
_httpClient = HttpAsyncClients.createMinimal(_
_H2Config.DEFAULT,_
_Http1Config.DEFAULT,_
_IOReactorConfig.DEFAULT,_
_httpManager);_
_httpClient.start();_
Then I lease an endpoint and execute HttpPost built like this:
_endpoint = httpClient.lease(host, callback);_
_SimpleHttpRequest post = SimpleRequestBuilder.post("/v2/file")_
_.setHttpHost(host)_
_.addHeader("Authorization", "Bearer " +
request.mondayAccessToken)_
_.addHeader(ctHeader.getName(), ctHeader.getValue())_
_.setBody(baos.toByteArray(),
ContentType.MULTIPART_FORM_DATA)_
_.build();_
_endpoint.execute(SimpleRequestProducer.create(post),_
_SimpleResponseConsumer.create(),_ _callback);_
Size of POST body is: 179517
FrameOutputBuffer's maxFramePayloadSize is: 65536
Hope it helps, let me know any thoughts and thanks in advance!
> AbstractH2StreamMultiplexer: FrameOutputBuffer: Frame size exceeds maximum
> --------------------------------------------------------------------------
>
> Key: HTTPCORE-707
> URL: https://issues.apache.org/jira/browse/HTTPCORE-707
> Project: HttpComponents HttpCore
> Issue Type: Bug
> Components: HttpCore NIO
> Affects Versions: 5.2-alpha1
> Reporter: Lubos Husivarga
> Priority: Major
> Attachments: context_wire_log.txt
>
>
> AbstractH2StreamMultiplexer initializes outputBuffer with frame size from
> local config:
> _this.outputBuffer = new FrameOutputBuffer(this.outputMetrics,
> this.{*}localConfig{*}.getMaxFrameSize());_
>
> Data are streamed using streamData(...) method which checks maxPayloadSize
> against remote config:
> _final int maxPayloadSize = Math.min(capacity,
> {*}remoteConfig{*}.getMaxFrameSize());_
>
> Issue: When remote config has greater max frame size than local config and
> the payload is also greater than local max frame size, the FrameOutputBuffer
> throws "Frame size exceeds maximum" error, since it compares the payload size
> against local frame size as it was initialized with it, not remote frame size.
>
> My suggestion: AbstractH2StreamMultiplexer.{*}applyRemoteSettings{*}(...)
> should update the outputBuffer's max frame size based on remote config.
>
> I will appreciate your help, as it is really annoying issue depending on
> remote site config and payload size, so it may be spotted randomly.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]