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)