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

Matthias Spycher commented on ZOOKEEPER-1159:
---------------------------------------------

It's possible that the send thread dies, but the state of the connection 
remains alive (due to race conditions). In that case, we queue a Disconnected 
event:
<code>
            ...
            cleanup();
            clientCnxnSocket.close();
            if (state.isAlive()) {
                eventThread.queueEvent(new WatchedEvent(Event.EventType.None,
                        Event.KeeperState.Disconnected, null));
            }
            ZooTrace.logTraceMessage(LOG, ZooTrace.getTextTraceLevel(),
                                     "SendThread exitedloop.");
        }
</code>
I would expect a Expired event here. But improved state management would be 
even better.


> 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.4.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.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to