I am sorry if my response seemed rude. That was not my intention.

I am now confused what does it mean for a connection to be stale? Am I correct 
in thinking that when server closes a connection then it becomes stale? How can 
reading from a connection detect this situation? If not read timeout that what 
signals it?

Nikita

> On 2. Aug 2021, at 20:27, Oleg Kalnichevski <ol...@apache.org> wrote:
> 
> [ External sender. Exercise caution. ]
> 
> On Mon, 2021-08-02 at 15:52 +0300, Nikita Salnikov-Tarnovski wrote:
>> Thank you for you reply. I have debug some more and unfortunately
>> have to disagree with you. I currently observer the following:
>> 
> 
> You are very welcome to disagree with me but it is not going to change
> the way HttpClient validates persistent connections.
> 
> 
>> At some point during application run this line throws a
>> "java.net.SocketTimeoutException: Read timed out"
>> https://github.com/apache/httpcomponents-client/blob/29ba623ebeec67cd6e8d940b2fed9151c16e4daa/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/LoggingInputStream.java#L81
>> <https://github.com/apache/httpcomponents-
>> client/blob/29ba623ebeec67cd6e8d940b2fed9151c16e4daa/httpclient5/src/
>> main/java/org/apache/hc/client5/http/impl/io/LoggingInputStream.java#
>> L81>
>> 
>> This results in "[read] I/O error: Read timed out\” being written to
>> logs.
>> That SocketTimeoutException is then propagated to here:
>> https://github.com/apache/httpcomponents-core/blob/1f51a73277bda05839ed8b1ccd6fa97db954be35/httpcore/src/main/java/org/apache/http/impl/BHttpConnectionBase.java#L364
>> <https://github.com/apache/httpcomponents-
>> core/blob/1f51a73277bda05839ed8b1ccd6fa97db954be35/httpcore/src/main/
>> java/org/apache/http/impl/BHttpConnectionBase.java#L364>
>> 
>> after which `isStale` method returns false. Thus we have a
>> connection, which threw SocketTimeoutException but is not considered
>> as stale. From your reply to my previous email I assume that this
>> exception should mean that connection is stale, right?
> 
> 
> No, it absolutely should not. That basically means the connection was
> unable to produce any input data within one ms time period but
> otherwise was perfectly valid.
> 
> Oleg
> 
>> 
>> Nikita
>> 
>>> On 2. Aug 2021, at 12:50, Oleg Kalnichevski <ol...@apache.org>
>>> wrote:
>>> 
>>> [ External sender. Exercise caution. ]
>>> 
>>> 
>>> On 8/2/2021 10:43 AM, Nikita Salnikov-Tarnovski wrote:
>>>> Good morning. I got the following log from my customer and I
>>>> think it demonstrates some problem with stale connection
>>>> detection. The used versions are httpclient:4.5.13 and
>>>> httpcore:4.4.14.  The interesting part is highlighted in bold.
>>>> My understanding of the situation is the following. A connection
>>>> with id 273 is used and returned to the connection pool.
>>>> PoolingHttpClientConnectionManager uses default configuration of
>>>> “setValidateAfterInactivity(2000)”. A minute later the connection
>>>> is requested from the pool. Connection 273 is checked for
>>>> staleness as suggested by “"http-outgoing-273 << \"[read] I/O
>>>> error: Read timed out\”"” message. 
>>> 
>>> Hi Nikita
>>> 
>>> To the contrary a timeout on a read operation basically means the
>>> connection is still perfectly valid (not stale), at least as far as
>>> JRE is concerned. Otherwise a socket exception would have occurred.
>>> 
>>> Oleg
>>> 
>>> 
>>> But then that connection 273 is nevertheless leased out to the
>>> client. Client tries to send data via that connection and,
>>> obviously, gets a "end of stream” error.
>>>> How can it happen, that connection is checked for staleness and
>>>> is still leased out?
>>>> Kind regards
>>>> Nikita Salnikov-Tarnovski
>>>> {"timestamp":"2021-07-
>>>> 22T21:41:59.419Z","level":"DEBUG","message":"Connection can be
>>>> kept alive
>>>> indefinitely","logger":"com.signalfx.shaded.apache.http.impl.exec
>>>> chain.MainClientExec","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 73
>>>> {"timestamp":"2021-07-
>>>> 22T21:41:59.419Z","level":"DEBUG","message":"Connection [id:
>>>> 273][route: {s}->https://ingest.signalfx.com:443 <
>>>> https://ingest.signalfx.com/>;] can be kept alive
>>>> indefinitely","logger":"com.signalfx.shaded.apache.http.impl.conn
>>>> .PoolingHttpClientConnectionManager","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 74
>>>> {"timestamp":"2021-07-
>>>> 22T21:41:59.419Z","level":"DEBUG","message":"http-outgoing-273:
>>>> set socket timeout to
>>>> 0","logger":"com.signalfx.shaded.apache.http.impl.conn.DefaultMan
>>>> agedHttpClientConnection","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 75
>>>> {"timestamp":"2021-07-
>>>> 22T21:41:59.419Z","level":"DEBUG","message":"Connection released:
>>>> [id: 273][route: {s}->https://ingest.signalfx.com:443][total <
>>>> https://ingest.signalfx.com:443][total> available: 1; route
>>>> allocated: 1 of 2; total allocated: 1 of
>>>> 20]","logger":"com.signalfx.shaded.apache.http.impl.conn.PoolingH
>>>> ttpClientConnectionManager","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 76
>>>> 79
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.325Z","level":"DEBUG","message":"Connection request:
>>>> [route: {s}->https://ingest.signalfx.com:443][total <
>>>> https://ingest.signalfx.com:443][total> available: 1; route
>>>> allocated: 1 of 2; total allocated: 1 of
>>>> 20]","logger":"com.signalfx.shaded.apache.http.impl.conn.PoolingH
>>>> ttpClientConnectionManager","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 80
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.331Z","level":"DEBUG","message":"http-outgoing-273 <<
>>>> \"[read] I/O error: Read timed
>>>> out\"","logger":"com.signalfx.shaded.apache.http.wire","thread":"
>>>> signalfx-metrics-publisher","level_value":10000}
>>>> 81
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"Connection leased:
>>>> [id: 273][route: {s}->https://ingest.signalfx.com:443][total <
>>>> https://ingest.signalfx.com:443][total> available: 0; route
>>>> allocated: 1 of 2; total allocated: 1 of
>>>> 20]","logger":"com.signalfx.shaded.apache.http.impl.conn.PoolingH
>>>> ttpClientConnectionManager","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 82
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"http-outgoing-273:
>>>> set socket timeout to
>>>> 2000","logger":"com.signalfx.shaded.apache.http.impl.conn.Default
>>>> ManagedHttpClientConnection","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 83
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"http-outgoing-273:
>>>> set socket timeout to
>>>> 2000","logger":"com.signalfx.shaded.apache.http.impl.conn.Default
>>>> ManagedHttpClientConnection","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 84
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"Executing request
>>>> POST /v2/datapoint
>>>> HTTP/1.1","logger":"com.signalfx.shaded.apache.http.impl.execchai
>>>> n.MainClientExec","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 85
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"Target auth state:
>>>> UNCHALLENGED","logger":"com.signalfx.shaded.apache.http.impl.exec
>>>> chain.MainClientExec","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 86
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"Proxy auth state:
>>>> UNCHALLENGED","logger":"com.signalfx.shaded.apache.http.impl.exec
>>>> chain.MainClientExec","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 87
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.333Z","level":"DEBUG","message":"http-outgoing-273 >>
>>>> POST /v2/datapoint
>>>> HTTP/1.1","logger":"com.signalfx.shaded.apache.http.headers","thr
>>>> ead":"signalfx-metrics-publisher","level_value":10000}
>>>> 88
>>>> 136
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.418Z","level":"DEBUG","message":"http-outgoing-273 <<
>>>> \"end of
>>>> stream\"","logger":"com.signalfx.shaded.apache.http.wire","thread
>>>> ":"signalfx-metrics-publisher","level_value":10000}
>>>> 137
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.418Z","level":"DEBUG","message":"http-outgoing-273:
>>>> Close
>>>> connection","logger":"com.signalfx.shaded.apache.http.impl.conn.D
>>>> efaultManagedHttpClientConnection","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 138
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.422Z","level":"DEBUG","message":"http-outgoing-273:
>>>> Shutdown
>>>> connection","logger":"com.signalfx.shaded.apache.http.impl.conn.D
>>>> efaultManagedHttpClientConnection","thread":"signalfx-metrics-
>>>> publisher","level_value":10000}
>>>> 139
>>>> {"timestamp":"2021-07-
>>>> 22T21:42:59.422Z","level":"DEBUG","message":"Connection
>>>> discarded","logger":"com.signalfx.shaded.apache.http.impl.execcha
>>>> in.MainClientExec","thread":"signalfx-metrics-
>>>> publisher","level_value"
>>> 
>>> -----------------------------------------------------------------
>>> ----
>>> To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
>>> For additional commands, e-mail: 
>>> httpclient-users-h...@hc.apache.org
>>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
> For additional commands, e-mail: httpclient-users-h...@hc.apache.org
> 


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

Reply via email to