Rohit Agarwal created CURATOR-339:
-------------------------------------
Summary: CuratorFramework misses session expired events
Key: CURATOR-339
URL: https://issues.apache.org/jira/browse/CURATOR-339
Project: Apache Curator
Issue Type: Bug
Reporter: Rohit Agarwal
Assignee: Jordan Zimmerman
I was using {{CuratorFramework}} and was unable to see some expected session
expiration events.
Here's a simpler demonstration of these missed events (without using
{{CuratorFramework}})
----
Code that works:
This code doesn't misses any events, note that here I am holding onto a
particular zk instance through out.
{code}
import org.apache.curator.CuratorZookeeperClient;
import org.apache.curator.retry.RetryOneTime;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
public class CuClient implements Watcher {
public static void main(String[] args) throws Exception {
CuClient zkc = new CuClient();
zkc.connect(args[0]);
}
private void connect(String zkConnect) throws Exception {
CuratorZookeeperClient czc = new CuratorZookeeperClient(
zkConnect,
4000,
1000,
this,
new RetryOneTime(1000)
);
czc.start();
ZooKeeper zk = czc.getZooKeeper();
for (int i = 0; i < 100; i++) {
Thread.sleep(1000);
System.out.println("creating " + i);
try {
zk.create("/rollup/" + i, null, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
} catch (KeeperException ke) {
System.out.println(ke.getMessage());
}
}
czc.close();
}
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent);
}
}
{code}
I caused a network partition after node 6 and then healed it after the session
expired
{code}
WatchedEvent state:SyncConnected type:None path:null
creating 0
creating 1
creating 2
creating 3
creating 4
creating 5
creating 6
WatchedEvent state:Disconnected type:None path:null
creating 7
KeeperErrorCode = ConnectionLoss for /rollup/7
creating 8
KeeperErrorCode = ConnectionLoss for /rollup/8
creating 9
KeeperErrorCode = ConnectionLoss for /rollup/9
creating 10
KeeperErrorCode = ConnectionLoss for /rollup/10
creating 11
WatchedEvent state:Expired type:None path:null
WatchedEvent state:SyncConnected type:None path:null
KeeperErrorCode = Session expired for /rollup/11
creating 12
KeeperErrorCode = Session expired for /rollup/12
creating 13
KeeperErrorCode = Session expired for /rollup/13
creating 14
KeeperErrorCode = Session expired for /rollup/14
^C
{code}
----
Code that doesn't work:
This is the same code, except instead of holding onto a zookeeper instance, I
am calling getZookeeper again and again.
{code}
import org.apache.curator.CuratorZookeeperClient;
import org.apache.curator.retry.RetryOneTime;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
public class CuClient implements Watcher {
public static void main(String[] args) throws Exception {
CuClient zkc = new CuClient();
zkc.connect(args[0]);
}
private void connect(String zkConnect) throws Exception {
CuratorZookeeperClient czc = new CuratorZookeeperClient(
zkConnect,
4000,
1000,
this,
new RetryOneTime(1000)
);
czc.start();
for (int i = 0; i < 100; i++) {
Thread.sleep(1000);
System.out.println("creating " + i);
try {
czc.getZooKeeper().create("/rollup/" + i, null,
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} catch (KeeperException ke) {
System.out.println(ke.getMessage());
}
}
czc.close();
}
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent);
}
}
{code}
Again, network partitioned after node 5 and then healed once the session
expired. Note the missing 'WatchedEvent state:Expired type:None path:null' line.
{code}
WatchedEvent state:SyncConnected type:None path:null
creating 0
creating 1
creating 2
creating 3
creating 4
creating 5
WatchedEvent state:Disconnected type:None path:null
creating 6
KeeperErrorCode = ConnectionLoss for /rollup/6
creating 7
KeeperErrorCode = ConnectionLoss
creating 8
KeeperErrorCode = ConnectionLoss
creating 9
KeeperErrorCode = ConnectionLoss for /rollup/9
creating 10
KeeperErrorCode = ConnectionLoss
creating 11
KeeperErrorCode = ConnectionLoss
WatchedEvent state:SyncConnected type:None path:null
creating 12
creating 13
creating 14
creating 15
creating 16
creating 17
^C
{code}
The same happens when I use {{CuratorFramework}} (I get SyncConnected events
but no Expired events). Am I doing something wrong? I want to do all the
operations in one session (because I am creating some ephemeral nodes etc.) I
want a reliable way of getting notified when the session expired.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)