zookeeper-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andor Molnar (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (ZOOKEEPER-3014) watch can be added to non-existed path by exist command
Date Wed, 28 Mar 2018 09:47:00 GMT

    [ 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)

Mime
View raw message