On Thu, 30 Apr 2026 16:14:35 GMT, Jaikiran Pai <[email protected]> wrote:
>> Ashay Rane has updated the pull request with a new target base due to a
>> merge or a rebase. The incremental webrev excludes the unrelated changes
>> brought in by the merge/rebase. The pull request contains four additional
>> commits since the last revision:
>>
>> - Address PR suggestions
>>
>> 1. Added an assertion to check whether sendlock is held by the current
>> thread.
>>
>> 2. Replaced lambda (`captureAndAddtoBuffers`) with a private static
>> method (`copyBuffer`) since the lambda doesn't really save us any
>> significant lines of code.
>>
>> 3. Used `${test.main.class}` instead of explicitly spelling out the
>> class name.
>>
>> 4. Used junit instead of JDK test library assertions, updated the rest
>> of the test accordingly.
>>
>> 5. Used `HttpTestServer` and `URIBuilder` in the test, dropped the
>> initial warmup since the HTTP version is "2" by construction.
>>
>> 6. Used junit's `assertSame` method for ensuring that the connection
>> object and the cache header buffer are the same across various
>> `send()` invocations.
>>
>> 7. Minor fixes (updated copyright year and comments)
>> - Merge branch 'master' into JDK-8383248-reuse-buffer-in-header-encoding
>> - Merge branch 'master' of https://github.com/openjdk/jdk into
>> JDK-8383248-reuse-buffer-in-header-encoding
>> - Reuse buffer for encoding headers instead of allocating one per request
>>
>> Prior to this patch, every HTTP request created a new 16KB buffer for
>> encoding the header, which are typically only a few hundred bytes long.
>> This increased pressure on the garbage collector when the client created
>> lots of requests. This patch instead makes the header encoder reuse the
>> buffer that is created during the handling of the first request.
>>
>> The caveat, however, is that the downstream consumers of the header are
>> asynchronous, so the encoder needs to take special care to ensure that
>> it doesn't modify or invalidate the buffer after it hands the buffer
>> over to the downstream asynchronous pipeline. To resolve this, this
>> patch snapshots the buffer data into compact copies sized to the actual
>> encoded length. Doing so makes the buffer immediately available for
>> reuse via `clear()` and `limit()`.
>>
>> For typical requests, this reduces per-request allocation from ~16KB to
>> a few hundred bytes (i.e. the size of the compact copy of the encoded
>> headers), with...
>
> test/jdk/java/net/httpclient/http2/HeaderEncodingBufferReuseTest.java line 70:
>
>> 68: httpUri = URIBuilder.newBuilder()
>> 69: .scheme("http")
>> 70: .host("localhost")
>
> I haven't looked at the updated PR (will do in the coming days), but a quick
> note about the usage `localhost` here. `localhost` may resolve to a
> non-loopback address. The server that is created a few lines above is bound
> to loopback address. Trying to issue a request to localhost can thus result
> in failures. Instead, please use
> `.host(testServer.getAddress().getAddress())` here.
>
> That brings me to the next point. GitHub actions job which gets run against
> these PRs only runs `tier1` tests. The networking tests are in `tier2`, so
> please run tier2 tests locally to verify that existing and this new test
> continues to pass with the proposed changes. `doc/testing.md` has additional
> details on how to run these tests.
In fact since `HttpTestServer.create(HTTP_2);` creates a server on the loopback
you could just replace ` .host("localhost")` with `.loopback()`: that's what we
do in most tests. It will take care of the issue mentioned by @jaikiran .
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/30931#discussion_r3172888175