Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Thread object leak #113

Open
laurynas-biveinis opened this issue Aug 31, 2016 · 0 comments
Open

Thread object leak #113

laurynas-biveinis opened this issue Aug 31, 2016 · 0 comments

Comments

@laurynas-biveinis
Copy link

Valgrind (or LeakSanitizer) on a 5.6 server shutdown with HS installed gives the following errors (to see the actual stacktraces, comment out dlclose() call in sql_plugin.cc, or HS will be unloaded by the time Valgrind tries to resolve the stacktraces):

2,560 bytes in 16 blocks are indirectly lost in loss record 275 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x148734C2: dena::database::create_context(bool) volatile (database.cpp:200)
   by 0x148819D0: dena::hstcpsvr_worker::hstcpsvr_worker(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:287)
   by 0x14884D47: dena::hstcpsvr_worker_i::create(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:943)
   by 0x1488C741: dena::worker_throbj::worker_throbj(dena::hstcpsvr_worker_arg const&) (hstcpsvr.cpp:30)
   by 0x1488CD1A: dena::thread<dena::worker_throbj>::thread<dena::hstcpsvr_worker_arg>(dena::hstcpsvr_worker_arg const&, unsigned long) (thread.hpp:22)
   by 0x1488C142: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)
   by 0x82A9A3: mysql_install_plugin(THD*, st_mysql_lex_string const*, st_mysql_lex_string const*) (sql_plugin.cc:1912)
   by 0x81B4E6: mysql_execute_command(THD*) (sql_parse.cc:5422)
   by 0x81F444: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:6972)
   by 0x81092E: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1441)
   by 0x80F7A4: do_command(THD*) (sql_parse.cc:1053)
   by 0x7D27F1: do_handle_one_connection(THD*) (sql_connect.cc:1541)
   by 0x7D2289: handle_one_connection (sql_connect.cc:1444)

2,944 bytes in 16 blocks are indirectly lost in loss record 276 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x14884D35: dena::hstcpsvr_worker_i::create(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:943)
   by 0x1488C741: dena::worker_throbj::worker_throbj(dena::hstcpsvr_worker_arg const&) (hstcpsvr.cpp:30)
   by 0x1488CD1A: dena::thread<dena::worker_throbj>::thread<dena::hstcpsvr_worker_arg>(dena::hstcpsvr_worker_arg const&, unsigned long) (thread.hpp:22)
   by 0x1488C142: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)
   by 0x82A9A3: mysql_install_plugin(THD*, st_mysql_lex_string const*, st_mysql_lex_string const*) (sql_plugin.cc:1912)
   by 0x81B4E6: mysql_execute_command(THD*) (sql_parse.cc:5422)
   by 0x81F444: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:6972)
   by 0x81092E: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1441)
   by 0x80F7A4: do_command(THD*) (sql_parse.cc:1053)
   by 0x7D27F1: do_handle_one_connection(THD*) (sql_connect.cc:1541)
   by 0x7D2289: handle_one_connection (sql_connect.cc:1444)
   by 0xB958CF: pfs_spawn_thread (pfs.cc:1860)
   by 0x58A16F9: start_thread (pthread_create.c:333)

12,800 bytes in 16 blocks are indirectly lost in loss record 289 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x14873CFD: dena::dbcontext::init_thread(void const*, int volatile&) (database.cpp:333)
   by 0x14881CBE: dena::(anonymous namespace)::thr_init::thr_init(std::auto_ptr<dena::dbcontext_i> const&, int volatile&) (hstcpsvr_worker.cpp:311)
   by 0x14881D2D: dena::hstcpsvr_worker::run() (hstcpsvr_worker.cpp:324)
   by 0x1488C7AA: dena::worker_throbj::operator()() (hstcpsvr.cpp:32)
   by 0x1488E050: dena::thread<dena::worker_throbj>::thread_main(void*) (thread.hpp:71)
   by 0x58A16F9: start_thread (pthread_create.c:333)
   by 0x645EB5C: clone (clone.S:109)

131,072 bytes in 16 blocks are indirectly lost in loss record 311 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x1487E4DF: __gnu_cxx::new_allocator<char>::allocate(unsigned long, void const*) (new_allocator.h:104)
   by 0x1487DC1B: __gnu_cxx::__alloc_traits<std::allocator<char> >::allocate(std::allocator<char>&, unsigned long) (alloc_traits.h:182)
   by 0x1487D301: std::_Vector_base<char, std::allocator<char> >::_M_allocate(unsigned long) (stl_vector.h:170)
   by 0x1487C0A1: std::vector<char, std::allocator<char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, unsigned long, char const&) (vector.tcc:491)
   by 0x1487AB61: std::vector<char, std::allocator<char> >::insert(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, unsigned long, char const&) (stl_vector.h:1073)
   by 0x14879C44: std::vector<char, std::allocator<char> >::resize(unsigned long, char) (stl_vector.h:716)
   by 0x148736EC: dena::dbcontext::dbcontext(dena::database volatile*, bool) (database.cpp:226)
   by 0x148734D8: dena::database::create_context(bool) volatile (database.cpp:200)
   by 0x148819D0: dena::hstcpsvr_worker::hstcpsvr_worker(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:287)
   by 0x14884D47: dena::hstcpsvr_worker_i::create(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:943)
   by 0x1488C741: dena::worker_throbj::worker_throbj(dena::hstcpsvr_worker_arg const&) (hstcpsvr.cpp:30)
   by 0x1488CD1A: dena::thread<dena::worker_throbj>::thread<dena::hstcpsvr_worker_arg>(dena::hstcpsvr_worker_arg const&, unsigned long) (thread.hpp:22)
   by 0x1488C142: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)

737,280 bytes in 6 blocks are indirectly lost in loss record 325 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x1488A980: __gnu_cxx::new_allocator<epoll_event>::allocate(unsigned long, void const*) (new_allocator.h:104)
   by 0x1488A267: __gnu_cxx::__alloc_traits<std::allocator<epoll_event> >::allocate(std::allocator<epoll_event>&, unsigned long) (alloc_traits.h:182)
   by 0x1488949F: std::_Vector_base<epoll_event, std::allocator<epoll_event> >::_M_allocate(unsigned long) (stl_vector.h:170)
   by 0x14887BE4: std::vector<epoll_event, std::allocator<epoll_event> >::_M_fill_insert(__gnu_cxx::__normal_iterator<epoll_event*, std::vector<epoll_event, std::allocator<epoll_event> > >, unsigned long, epoll_event const&) (vector.tcc:491)
   by 0x14886AA5: std::vector<epoll_event, std::allocator<epoll_event> >::insert(__gnu_cxx::__normal_iterator<epoll_event*, std::vector<epoll_event, std::allocator<epoll_event> > >, unsigned long, epoll_event const&) (stl_vector.h:1073)
   by 0x14885E42: std::vector<epoll_event, std::allocator<epoll_event> >::resize(unsigned long, epoll_event) (stl_vector.h:716)
   by 0x14881BF4: dena::hstcpsvr_worker::hstcpsvr_worker(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:301)
   by 0x14884D47: dena::hstcpsvr_worker_i::create(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:943)
   by 0x1488C741: dena::worker_throbj::worker_throbj(dena::hstcpsvr_worker_arg const&) (hstcpsvr.cpp:30)
   by 0x1488CD1A: dena::thread<dena::worker_throbj>::thread<dena::hstcpsvr_worker_arg>(dena::hstcpsvr_worker_arg const&, unsigned long) (thread.hpp:22)
   by 0x1488C142: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)
   by 0x82A9A3: mysql_install_plugin(THD*, st_mysql_lex_string const*, st_mysql_lex_string const*) (sql_plugin.cc:1912)
   by 0x81B4E6: mysql_execute_command(THD*) (sql_parse.cc:5422)

887,168 (512 direct, 886,656 indirect) bytes in 16 blocks are definitely lost in loss record 326 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x1488C129: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)
   by 0x82A9A3: mysql_install_plugin(THD*, st_mysql_lex_string const*, st_mysql_lex_string const*) (sql_plugin.cc:1912)
   by 0x81B4E6: mysql_execute_command(THD*) (sql_parse.cc:5422)
   by 0x81F444: mysql_parse(THD*, char*, unsigned int, Parser_state*) (sql_parse.cc:6972)
   by 0x81092E: dispatch_command(enum_server_command, THD*, char*, unsigned int) (sql_parse.cc:1441)
   by 0x80F7A4: do_command(THD*) (sql_parse.cc:1053)
   by 0x7D27F1: do_handle_one_connection(THD*) (sql_connect.cc:1541)
   by 0x7D2289: handle_one_connection (sql_connect.cc:1444)
   by 0xB958CF: pfs_spawn_thread (pfs.cc:1860)
   by 0x58A16F9: start_thread (pthread_create.c:333)
   by 0x645EB5C: clone (clone.S:109)

1,228,800 bytes in 10 blocks are possibly lost in loss record 333 of 345
   at 0x4C2E0EF: operator new(unsigned long) (vg_replace_malloc.c:333)
   by 0x1488A980: __gnu_cxx::new_allocator<epoll_event>::allocate(unsigned long, void const*) (new_allocator.h:104)
   by 0x1488A267: __gnu_cxx::__alloc_traits<std::allocator<epoll_event> >::allocate(std::allocator<epoll_event>&, unsigned long) (alloc_traits.h:182)
   by 0x1488949F: std::_Vector_base<epoll_event, std::allocator<epoll_event> >::_M_allocate(unsigned long) (stl_vector.h:170)
   by 0x14887BE4: std::vector<epoll_event, std::allocator<epoll_event> >::_M_fill_insert(__gnu_cxx::__normal_iterator<epoll_event*, std::vector<epoll_event, std::allocator<epoll_event> > >, unsigned long, epoll_event const&) (vector.tcc:491)
   by 0x14886AA5: std::vector<epoll_event, std::allocator<epoll_event> >::insert(__gnu_cxx::__normal_iterator<epoll_event*, std::vector<epoll_event, std::allocator<epoll_event> > >, unsigned long, epoll_event const&) (stl_vector.h:1073)
   by 0x14885E42: std::vector<epoll_event, std::allocator<epoll_event> >::resize(unsigned long, epoll_event) (stl_vector.h:716)
   by 0x14881BF4: dena::hstcpsvr_worker::hstcpsvr_worker(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:301)
   by 0x14884D47: dena::hstcpsvr_worker_i::create(dena::hstcpsvr_worker_arg const&) (hstcpsvr_worker.cpp:943)
   by 0x1488C741: dena::worker_throbj::worker_throbj(dena::hstcpsvr_worker_arg const&) (hstcpsvr.cpp:30)
   by 0x1488CD1A: dena::thread<dena::worker_throbj>::thread<dena::hstcpsvr_worker_arg>(dena::hstcpsvr_worker_arg const&, unsigned long) (thread.hpp:22)
   by 0x1488C142: dena::hstcpsvr::start_listen[abi:cxx11]() (hstcpsvr.cpp:122)
   by 0x1487FB9A: daemon_handlersocket_init(void*) (handlersocket.cpp:84)
   by 0x828808: plugin_initialize(st_plugin_int*) (sql_plugin.cc:1159)
   by 0x82A9A3: mysql_install_plugin(THD*, st_mysql_lex_string const*, st_mysql_lex_string const*) (sql_plugin.cc:1912)
   by 0x81B4E6: mysql_execute_command(THD*) (sql_parse.cc:5422)

This is caused by hstcpsvr::threads, which is auto_ptrcontainer<std::vector<worker_thread_type *> > (effectively std::vector<foo *>), having clear() method, which clears the container without deleting the member pointers, which are owned by the container.

HandlerSocket bundled with Percona Server 5.6 has merged the fix at percona/percona-server#937.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant