You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Chris Nauroth (JIRA)" <ji...@apache.org> on 2013/05/09 22:27:18 UTC

[jira] [Updated] (ZOOKEEPER-1702) ZooKeeper client may write operation packets before receiving successful response to connection request, can cause TCP RST

     [ https://issues.apache.org/jira/browse/ZOOKEEPER-1702?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Chris Nauroth updated ZOOKEEPER-1702:
-------------------------------------

    Attachment: ZOOKEEPER-1702.1.patch

I'm attaching a patch that disables write interest on the client socket's selection key right after sending the initial connection request packet.  Write interest gets restored later after successful completion of the connection.  With this patch in place, the failing tests in Hadoop Common pass consistently on mutliple platforms: OS X, Linux, and Windows.

I tried to write a test for this.  Unfortunately, none of my attempts at a functional test were able to reproduce the problem, and my attempt at mocking broke down when I discovered that {{SocketChannel#register}} is final and therefore can't be mocked.  Existing test suites passed for me after the patch.

The same patch can apply to both trunk and branch-3.4.

                
> ZooKeeper client may write operation packets before receiving successful response to connection request, can cause TCP RST
> --------------------------------------------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-1702
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1702
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: java client
>    Affects Versions: 3.4.2
>            Reporter: Chris Nauroth
>         Attachments: ZOOKEEPER-1702.1.patch
>
>
> The problem occurs when a connection attempt is pending and there are multiple outbound packets in the queue for other operations.  In {{ClientCnxnSocketNIO#doIO}}, it is possible to receive notification that the socket is writable for the next operation packet before receiving notification that the socket is readable for the connection response from the server.  If the server decides that the session is expired, then it responds by immediately closing the socket on its side.  If the client has written packets after the server has closed its end of the socket, then the TCP stack may choose to abort the connection with an RST.  When this happens, the client doesn't receive an orderly shutdown, and ultimately it fails to deliver a session expired event to the application.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira