[ 
https://issues.apache.org/jira/browse/HTTPCORE-377?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13976732#comment-13976732
 ] 

Dmitry Potapov commented on HTTPCORE-377:
-----------------------------------------

Since HTTP delineates message bodies, HTTP clients doesn't require SO_LINGER 
with non-zero timeout. When HTTP client closes connection, not only the request 
is completely sent to server, but the response is completely read, there is no 
data in underlying socket anymore, so it can be discarded with RST.

I'm using SO_LINGER with HttpClient because otherwise in case of problems on 
server all my sockets will fall into TIME_WAIT states, and further processing 
will stop. With non-zero SO_LINGER I'll spend too much time for expired 
connections closing. I've done some load-testing on simple proxy with 
HttpClient with slow backend. With 1 second SO_LINGER maximum rps of 
successfully requests was 250, with 0 second SO_LINGER maximum rps was 2500.

I'm using non-zero SO_LINGER on server side, because I want to get client some 
time to read last response chunk from socket, but I wish to control the maximum 
socket lifetime, in case of broken client.

> Allow to enable SO_LINGER option with zero timeout
> --------------------------------------------------
>
>                 Key: HTTPCORE-377
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-377
>             Project: HttpComponents HttpCore
>          Issue Type: Improvement
>          Components: HttpCore, HttpCore NIO
>    Affects Versions: 4.3.2
>            Reporter: Dmitry Potapov
>            Priority: Minor
>         Attachments: httpcore-enable-linger.patch
>
>
> According to 
> http://docs.oracle.com/javase/8/docs/api/java/net/StandardSocketOptions.html#SO_LINGER
>  linger option is disabled by default. Currently if SocketConfig.soLinger is 
> set to zero (default value is -1), then Socket.setSoLinger(false, 0) will be 
> called, so linger will be disabled, which is undesirable. My suggestion is 
> interpret zero soLinger value as Socket.setSoLinger(true, 0).
> I understand that this change will break backward compatibility of config 
> interpretation, but can we have this in 4.4?



--
This message was sent by Atlassian JIRA
(v6.2#6252)

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

Reply via email to