On Tue, 2025-07-01 at 11:26 -0700, Ryan Schmitt wrote:
> What is the intended behavior of `setValidateAfterInactivity` on the
> async client with HTTP/1.1 connections? The current implementation
> is:
> 
> if (poolEntry.hasConnection()) {
>     final ManagedAsyncClientConnection connection =
> poolEntry.getConnection();
>     final TimeValue timeValue =
> connectionConfig.getValidateAfterInactivity();
>     if (connection.isOpen() && TimeValue.isNonNegative(timeValue)) {
>         if (timeValue.getDuration() == 0
>                 || Deadline.calculate(poolEntry.getUpdated(),
> timeValue).isExpired()) {
>             final ProtocolVersion protocolVersion =
> connection.getProtocolVersion();
>             if (protocolVersion != null &&
> protocolVersion.greaterEquals(HttpVersion.HTTP_2_0)) {
>                 connection.submitCommand(new PingCommand(/* ... */,
> Command.Priority.IMMEDIATE);
>                 return;
>             }
>             if (LOG.isDebugEnabled()) {
>                 LOG.debug("{} connection {} is closed", id,
> ConnPoolSupport.getId(connection));
>             }
>             poolEntry.discardConnection(CloseMode.IMMEDIATE);
>         }
>     }
> }
> 
> In other words, the current implementation is actually just a
> connection TTL. I got a report from someone who was seeing zero
> connection reuse with their client after upgrading to 5.4, and it
> turns out that it's because they were calling
> `setValidateAfterInactivity(0)`. The intention was to _always_ check
> for a stale connection before reuse, but it actually resulted in all
> pooled connections being immediately closed, since 5.4 fixes the
> handling of validateAfterInactivity/connectionTimeToLive being set to
> `0`. This seems like a bug, but does Java provide us any way to fix
> it?

I do not think so. I do not know of a way to reliably perform a
validity check on non-blocking connections other than sending a ping
message. This obviously can only work with HTTP/2 only, so probably
`validateAfterInactivity` should not apply to HTTP/1.1 connections at
all. Generally non-blocking connections should never get stale like
their blocking counterparts.

Oleg

>  I thought the usual trick was to perform a blocking read with a
> 1ms timeout, which will surface the fact that the remote peer has
> closed the connection.



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to