CHQ created ZOOKEEPER-3014:
------------------------------

             Summary: watch can be added to non-existed path by exist command
                 Key: ZOOKEEPER-3014
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3014
             Project: ZooKeeper
          Issue Type: Bug
          Components: server
    Affects Versions: 3.4.6, 3.4.5
            Reporter: CHQ
             Fix For: 3.4.12


We have client A which create a znode ,and its path is /zk/lock/100000.  
Another client B thread is acquiring for the lock, so it calls the exist 
command with watch periodically to check if it is available. Then Client A has 
finished this work, and  delete this znode. Client b still calls exist command 
with watch. Because the code doesn't check node existence, when the  Watch add 
operation comes , it will add to non-exist node path.

This problem may be cause by the follow code. 
{code:java}
public Stat statNode(String path, Watcher watcher)
throws KeeperException.NoNodeException {
Stat stat = new Stat();
DataNode n = nodes.get(path);
if (watcher != null) {
dataWatches.addWatch(path, watcher);
}
if (n == null) {
throw new KeeperException.NoNodeException();
}
synchronized (n) {
n.copyStat(stat);
return stat;
}
}
{code}
The zk version we use is 3.4.5. We meet a problem that is the zk client try to 
reestablish to zk cluster failed after disconnect for some reason.We find it 
causes by ZOOKEEPER-706. But we try to know why there are so many watches. Then 
we find this problem.

 

 

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to