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

Jordan Zimmerman commented on ZOOKEEPER-1159:
---------------------------------------------

FWIW - here's a little test that shows the problem:

{code}
TestingServer           server = new TestingServer();   // uses Curator's 
TestingServer
final CountDownLatch    connectedLatch = new CountDownLatch(1);
final CountDownLatch    expiredLatch = new CountDownLatch(1);
Watcher                 watcher = new Watcher()
{
    @Override
    public void process(WatchedEvent event)
    {
        System.out.println(event);
        if ( event.getState() == Event.KeeperState.SyncConnected )
        {
            connectedLatch.countDown();
        }
        else if ( event.getState() == Event.KeeperState.Expired )
        {
            expiredLatch.countDown();
        }
    }
};
ZooKeeper       zk = new ZooKeeper(connectString, 5000, watcher);
connectedLatch.await();
zk.exists("/", true);

server.close();

if ( !expiredLatch.await(10, TimeUnit.SECONDS) )
{
    Assert.fail("Expired never happened");
}
{code}
                
> ClientCnxn does not propagate session expiration indication
> -----------------------------------------------------------
>
>                 Key: ZOOKEEPER-1159
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1159
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: java client
>    Affects Versions: 3.4.0
>            Reporter: Andrew Purtell
>            Priority: Blocker
>             Fix For: 3.5.0
>
>
> ClientCnxn does not always propagate session expiration indication up to 
> clients. If a reconnection attempt fails because the session has since 
> expired, the KeeperCode is still Disconnected, but shouldn't it be set to 
> Expired? Perhaps like so:
> {code}
> --- a/src/java/main/org/apache/zookeeper/ClientCnxn.java
> +++ b/src/java/main/org/apache/zookeeper/ClientCnxn.java
> @@ -1160,6 +1160,7 @@ public class ClientCnxn {
>                      clientCnxnSocket.doTransport(to, pendingQueue, 
> outgoingQueue);
>  
>                  } catch (Exception e) {
> +                    Event.KeeperState eventState = 
> Event.KeeperState.Disconnected;
>                      if (closing) {
>                          if (LOG.isDebugEnabled()) {
>                              // closing so this is expected
> @@ -1172,6 +1173,7 @@ public class ClientCnxn {
>                          // this is ugly, you have a better way speak up
>                          if (e instanceof SessionExpiredException) {
>                              LOG.info(e.getMessage() + ", closing socket 
> connection");
> +                            eventState = Event.KeeperState.Expired;
>                          } else if (e instanceof SessionTimeoutException) {
>                              LOG.info(e.getMessage() + RETRY_CONN_MSG);
>                          } else if (e instanceof EndOfStreamException) {
> @@ -1191,7 +1193,7 @@ public class ClientCnxn {
>                          if (state.isAlive()) {
>                              eventThread.queueEvent(new WatchedEvent(
>                                      Event.EventType.None,
> -                                    Event.KeeperState.Disconnected,
> +                                    eventState,
>                                      null));
>                          }
>                          clientCnxnSocket.updateNow();
> {code}
> This affects HBase. HBase master and region server processes will shut down 
> by design if their session has expired, but will attempt to reconnect if they 
> think they have been disconnected. The above prevents proper termination.

--
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

Reply via email to