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

Reply via email to