Got it, thank you for the explanation :)

Nikita

> On 3. Aug 2021, at 00:17, Oleg Kalnichevski <ol...@apache.org> wrote:
> 
> [ External sender. Exercise caution. ]
> 
> 
> On 8/2/2021 8:44 PM, Nikita Salnikov-Tarnovski wrote:
>> 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
> 
> The main limitation of the classic i/o is that network sockets can react to 
> events only when blocked in an i/o operation. Persistent connections while 
> kept idle in the connection pool can become half-closed or reset by the 
> opposite endpoint without the local endpoint realizing it. The only way to 
> find out whether or not the connection is still valid is by performing an i/o 
> operation on it. This is percisely what the stale connection check is about. 
> It is a very short read operation (~ 1 ms) that either times out if that the 
> socket is still valid, returns immediately with -1 if the socket has been 
> half-closed or causes a socket exception if the socket has been reset.
> 
> Hope this helps
> 
> Oleg
> 
> 
>>> 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 
>> <mailto:httpclient-users-unsubscr...@hc.apache.org>
>> For additional commands, e-mail: httpclient-users-h...@hc.apache.org 
>> <mailto:httpclient-users-h...@hc.apache.org>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org 
> <mailto:httpclient-users-unsubscr...@hc.apache.org>
> For additional commands, e-mail: httpclient-users-h...@hc.apache.org 
> <mailto:httpclient-users-h...@hc.apache.org>

Reply via email to