John Leacox created HTTPCORE-726:
------------------------------------

             Summary: SharedInputBuffer expands unbounded on large responses
                 Key: HTTPCORE-726
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-726
             Project: HttpComponents HttpCore
          Issue Type: Bug
          Components: HttpCore
    Affects Versions: 5.1.3
         Environment: MacOS 12, Debian 9, Debian 10
            Reporter: John Leacox
         Attachments: SharedInputBuffer_Unbounded_Growth_Example.patch, 
SharedInputBuffer_Unbounded_Growth_Possible_Fix.patch

Large responses can result in the {{SharedInputBuffer}} expanding unbounded, 
but with small intervals. Each expansion is the minimum 1024 byte aligned size 
bigger than the current buffer that is filling it beyond its current capacity. 
This leads to a ton of heap allocations and garbage collection each time is 
expands.

 

It looks like the capacity updates to {{CapacityChannel}} are reporting current 
capacity rather than deltas/increments, so that even when small reads occur, 
the whole capacity is reported again to the channel and the capacity window 
also grows unbounded.

 

I've attached a patch that includes some {{println}} statements for the 
capacity window size and for buffer being expanded along with the integration 
test {{testLargeResponseConsumer}} that shows the buffer and window growing 
quite large (the test passes, but the println statements show how large they 
are growing).

 

For a fix I was thinking of updating the capacity tracking to be similar to 
{{ReactiveDataConsumer}} in tracking the number of bytes read and then 
reporting that delta to {{CapacityChannel}}. This does seem to prevent the 
buffer from expanding to huge sizes, but it still expands more than I would 
expect because after each read from the {{SharedInputBuffer}}. This remaining 
expansion appears to be from {{CapacityWindow}} always setting the IO sessions 
with {{OP_READ}} even when the window is still negative after the update.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to