[
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