[
https://issues.apache.org/jira/browse/ZOOKEEPER-2321?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gowrima reassigned ZOOKEEPER-2321:
----------------------------------
Assignee: Gowrima
> C-client session watcher removal is not thread safe
> ---------------------------------------------------
>
> Key: ZOOKEEPER-2321
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2321
> Project: ZooKeeper
> Issue Type: Bug
> Components: c client
> Affects Versions: 3.5.1
> Reporter: Hadriel Kaplan
> Assignee: Gowrima
> Priority: Major
>
> Invoking the C-client API function {{zoo_set_watcher()}} to remove/change a
> session event watcher is not a thread-safe operation. The IO thread accesses
> the session watcher (the one stored in the zhandle_t.watcher member) and
> copies its value into completion events, which are then later processed by
> the completion thread. This happens when it's processing session events, such
> as session connected/connecting/expired events.
> Meanwhile after the value has been copied by the IO thread, but before the
> completion thread has used it, the main thread could change the watcher to
> NULL using {{zoo_set_watcher()}} because the calling application may be
> free'ing it. The call to {{zoo_set_watcher()}} will return even though the IO
> and completion threads still have the old watcher pointer value, and the main
> application cannot safely free it. But since the function call returns, the
> main application thinks it can free it, and boom goes the dynamite.
> So... either there needs to be a lockout while the IO/completion threads
> process session events, or the {{zoo_set_watcher()}} needs to become
> asynchronous itself by going through the same processing pipeline to the
> completion thread and having a completion callback to tell the calling
> application when it succeeded/failed.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)