You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zookeeper.apache.org by "Hadriel Kaplan (JIRA)" <ji...@apache.org> on 2015/11/12 23:29:11 UTC
[jira] [Commented] (ZOOKEEPER-1556) Memory leak reported by
valgrind mt version
[ https://issues.apache.org/jira/browse/ZOOKEEPER-1556?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15003080#comment-15003080 ]
Hadriel Kaplan commented on ZOOKEEPER-1556:
-------------------------------------------
We've found the same thing at my company. In our case, the leak was caused because the completion thread can end before the IO thread, just before the IO thread created a completion entry for the completion thread to process. We added a mutex guard to prevent the completion thread (do_completion()) from exiting its while-loop until the IO thread (do_io()) had exited its while loop; and also added an extra call to process_completions(zh) just after the while-loop in case it had one more to do.
We cleared the new mutex guard inside of adaptor_finish(), after the IO thread is ended. The reason is that the IO thread (and the completion thread) can finish their while-loops as soon as zh->close_requested is set to 1 in zookeeper_close(), including before free_completions() does its stuff... and since free_completions() can create one or more fake responses for the completion thread to process (for unanswered requests), it's possible for free_completions() to also add things to the completion queue and cause the memory leak. So keeping the completion thread inside its while-loop until adaptor_finish() is called seems to make sense.
> Memory leak reported by valgrind mt version
> -------------------------------------------
>
> Key: ZOOKEEPER-1556
> URL: https://issues.apache.org/jira/browse/ZOOKEEPER-1556
> Project: ZooKeeper
> Issue Type: Bug
> Components: c client
> Affects Versions: 3.4.4
> Reporter: André Martin
> Priority: Minor
>
> Valgrind reports the following memory leak when using the c-client (mt):
> ==11674== 18 bytes in 9 blocks are indirectly lost in loss record 14 of 173
> ==11674== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==11674== by 0xC8064A: ia_deserialize_string (recordio.c:271)
> ==11674== by 0xC81F2E: deserialize_String_vector (zookeeper.jute.c:247)
> ==11674== by 0xC842F9: deserialize_GetChildrenResponse (zookeeper.jute.c:874)
> ==11674== by 0xC7E9F0: zookeeper_process (zookeeper.c:1904)
> ==11674== by 0xC7FE5B: do_io (mt_adaptor.c:439)
> ==11674== by 0x4E39E99: start_thread (pthread_create.c:308)
> ==11674== by 0x5FA6DBC: clone (clone.S:112)
> ==11674==
> ==11674== 90 (72 direct, 18 indirect) bytes in 49 blocks are definitely lost in loss record 139 of 173
> ==11674== at 0x4C29DB4: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==11674== by 0xC81EEE: deserialize_String_vector (zookeeper.jute.c:245)
> ==11674== by 0xC842F9: deserialize_GetChildrenResponse (zookeeper.jute.c:874)
> ==11674== by 0xC7E9F0: zookeeper_process (zookeeper.c:1904)
> ==11674== by 0xC7FE5B: do_io (mt_adaptor.c:439)
> ==11674== by 0x4E39E99: start_thread (pthread_create.c:308)
> ==11674== by 0x5FA6DBC: clone (clone.S:112)
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)