curator-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rohit Agarwal (JIRA)" <j...@apache.org>
Subject [jira] [Created] (CURATOR-339) CuratorFramework misses session expired events
Date Thu, 04 Aug 2016 13:25:20 GMT
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)

Mime
View raw message