If I use a ASync version of getData and implement DataCallback on the
DataMonitor, it works with a No Node in the below mentioned use case. I can
update this IF this is the correct way of doing this.....


    /* DataCallback */

    public void processResult(int rc, String path, Object ctx, byte[] data,
Stat stat) {

        boolean exists;
        switch (rc) {
        case Code.Ok:
            exists = true;
            break;
        case Code.NoNode:
        System.out.println("No node");

            exists = false;
            break;
        case Code.SessionExpired:
        case Code.NoAuth:
            dead = true;
            listener.closing(rc);
            return;
        default:
            // Retry errors
            zk.exists(znode, true, this, null);
            return;
        }

        if (exists) {

        if ((data == null && data != prevData)
                || (data != null && !Arrays.equals(prevData, data))) {
        listener.exists(data);
        prevData = data;
        }
    }
    }



    /* Exists Callback */


    public void processResult(int rc, String path, Object ctx, Stat stat) {

        boolean exists;
        switch (rc) {
        case Code.Ok:
            exists = true;
            break;
        case Code.NoNode:
            exists = false;
            break;
        case Code.SessionExpired:
        case Code.NoAuth:
            dead = true;
            listener.closing(rc);
            return;
        default:
            // Retry errors
            zk.exists(znode, true, this, null);
            return;
        }


        if (exists) {
        try {
        System.out.println("SLEEP 10 seconds");

        Thread.sleep(10000);
        zk.getData(znode, false, this, null);
        }
        catch (InterruptedException ie) {
        System.out.println(ie);
        }

        }

    }

On Mon, Sep 27, 2010 at 6:56 PM, Milind Parikh <milindpar...@gmail.com>wrote:

> In the explanation of the Java binding, it is mentioned "If the file (or
> znode) exists, it gets the data from the znode, and then invoke the exists()
> callback of Executor if the state has changed. Note, it doesn't have to do
> any Exception processing for the getData call because it has watches pending
> for anything that could cause an error: if the node is deleted before it
> calls ZooKeeper.getData(), the watch event set by the 
> ZooKeeper.exists()triggers a callback.... "
>
> I read this to mean that if I insert a Thread.sleep() before the getData
> call & removed the node from the cli, somehow (magically) there would be no
> error. But of course, it does not happen....
>
> Sleeps for 10 seconds
> org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode =
> NoNode for /zk_test
>     at
> org.apache.zookeeper.KeeperException.create(KeeperException.java:102)
>     at org.apache.zookeeper.KeeperException.create(KeeperException.java:42)
>     at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:921)
>     at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:950)
>     at DataMonitor.processResult(DataMonitor.java:114)
>     at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:512)
>
> Am I doing something wrong (or reading something wrong)?
>
> -- Milind

Reply via email to