Jared Cantwell commented on ZOOKEEPER-890:

I don't believe the C-client makes the guarantee that "watcher callbacks are 
called exactly once."  Callbacks are called for different reasons, including:

- connection lost event
- connection reestablished event
- session lost event
- data changed event

Only the last two events make the guarantee about being called exactly once, 
but the first two connection events can be called numerous times until either 
one of the last two events happens.  I may be missing some events, but that's 
the general idea.  Bottom line is the callback can receive events of type 
ZOO_SESSION_EVENT multiple times.  I believe this was by design.

> C client invokes watcher callbacks multiple times
> -------------------------------------------------
>                 Key: ZOOKEEPER-890
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-890
>             Project: Zookeeper
>          Issue Type: Bug
>          Components: c client
>    Affects Versions: 3.3.1
>         Environment: Mac OS X 10.6.5
>            Reporter: Austin Shoemaker
>            Priority: Critical
>         Attachments: watcher_twice.c, ZOOKEEPER-890.patch
> Code using the C client assumes that watcher callbacks are called exactly 
> once. If the watcher is called more than once, the process will likely 
> overwrite freed memory and/or crash.
> collect_session_watchers (zk_hashtable.c) gathers watchers from 
> active_node_watchers, active_exist_watchers, and active_child_watchers 
> without removing them. This results in watchers being invoked more than once.
> Test code is attached that reproduces the bug, along with a proposed patch.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

Reply via email to