You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Andor Molnar (JIRA)" <ji...@apache.org> on 2018/03/28 09:47:00 UTC

[jira] [Commented] (ZOOKEEPER-3014) watch can be added to non-existed path by exist command

    [ https://issues.apache.org/jira/browse/ZOOKEEPER-3014?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16417101#comment-16417101 ] 

Andor Molnar commented on ZOOKEEPER-3014:
-----------------------------------------

Hi [~tassemble]

Thanks for the bugreport.

Maybe I'm missing something here, but 2 things are suspicious in your explanation:
 # "it calls the exist command with watch periodically to check if it is available"

Why periodically?

Client should call the exist() method with a watcher parameter and check the return value:

if exists() returns null, the node doesn't exist, otherwise the watcher will be triggered whenever the state changes. No need to call this manually.

      2. "the code doesn't check node existence"

Which code? 

DataTree.statNode() does it indeed when checks for (n == null).

> 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.5, 3.4.6
>            Reporter: CHQ
>            Priority: Major
>             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)