Tudor Bosman created ZOOKEEPER-3868:
---------------------------------------

             Summary: Completion leak in zookeeper_close
                 Key: ZOOKEEPER-3868
                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-3868
             Project: ZooKeeper
          Issue Type: Bug
          Components: c client
    Affects Versions: 3.5.8, 3.6.1, 3.7.0
            Reporter: Tudor Bosman


Using the multithreaded C library.

Due to a race condition between `zookeeper_close` and `do_completion`, it is 
possible for `zookeeper_close` to close the handle without running the pending 
completions, causing a completion leak (not calling the client's completion 
callbacks) and a memory leak.

`zookeeper_close` sets `close_requested` here: 
[https://github.com/apache/zookeeper/blob/master/zookeeper-client/zookeeper-client-c/src/zookeeper.c#L3752];
 after that point, the completion thread can exit at any time: 
[https://github.com/apache/zookeeper/blob/8da9c723ac1a889c989ecefada722ed858049537/zookeeper-client/zookeeper-client-c/src/mt_adaptor.c#L473]

But, even after `zookeeper_close`, completions can still be added to 
`completions_to_process` from two different places: the IO thread (which is 
still running) and `zookeeper_close` itself, via `free_completions`: 
[https://github.com/apache/zookeeper/blob/master/zookeeper-client/zookeeper-client-c/src/zookeeper.c#L3760]

I have a fix (I'll update this issue with the pull request) that uses a 
separate `terminate_completion` flag in `adaptor_threads` instead of 
`zh->close_requested` to make the IO thread exit.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to