Thanks for the input, Jordan.

My understanding is that the standard watches do but persistent watches
don't. Not sure if I miss anything or if this is a bug. Looking forward to
any feedback/input on this.

1.  We have the following in the standard watch section of Zookeeper
documentation and it looks like missing notifications are triggered.

When a client reconnects, any previously registered watches will be
> reregistered and triggered if needed.



https://zookeeper.apache.org/doc/r3.9.3/zookeeperProgrammers.html#sc_WatchSemantics


2. In the code base, Zookeeper client library maintains lastZXid in memory
and sends it to the server when resetting watches upon reconnection. The
server detects if any missing notifications need to be triggered based on
the lastZxid.

https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxn.java#L1040-L1041
https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java#L1497

3. The problem is that missing notifications seem only being triggered for
standard watches but not for persistent watches when reconnecting.

For example, for standard watches, watches.process() is invoked for sending
missing notifications.

for (String path : dataWatches) {
>             DataNode node = getNode(path);
>             if (node == null) {
>                 watcher.process(new WatchedEvent(EventType.NodeDeleted,
> KeeperState.SyncConnected, path));
>             } else if (node.stat.getMzxid() > relativeZxid) {
>                 watcher.process(new
> WatchedEvent(EventType.NodeDataChanged, KeeperState.SyncConnected, path));
>             } else {
>                 this.dataWatches.addWatch(path, watcher);
>             }
>         }


https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java#L1494-L1521

However, for persistence watches, we only register the watches, not
detecting and sending missing notifications.

 for (String path : persistentRecursiveWatches) {
>             this.dataWatches.addWatch(path, watcher,
> WatcherMode.PERSISTENT_RECURSIVE);
>         }


https://github.com/apache/zookeeper/blob/master/zookeeper-server/src/main/java/org/apache/zookeeper/server/DataTree.java#L1494-L1521

Thanks,

Li

Reply via email to