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

Camille Fournier commented on ZOOKEEPER-1159:
---------------------------------------------

Now I remember my own analysis here. The only way to get a SessionExpired 
exception there so far as I can tell is if onConnected detects a 
SessionExpired. At which point it sets the state variable to CLOSED, so the 
"if(state.isAlive())" check will fail and it will never call that queueEvent.

This is about where my digging into this issue ended. I couldn't reproduce this 
error and nothing in the code seems to me that it should be able to get that 
SessionExpired exception and not set the state to CLOSED, which will then 
always show a SESSIONEXPIRED exception to the client. If you can reproduce this 
error though, perhaps it is worth more investigation.


> 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