GitServer deadlock
In the first backtrace below (thread 1), JamiAccount::doUnregister
successfully acquired configurationMutex_
and GitServer::Impl::stop
is waiting for destroyMtx_
to be available.
In the second backtrace (thread 344), ChannelSocket::onRecv
acquired destroyMtx_
and JamiAccount::convModule
is waiting for configurationMutex_
to be available.
Thread 1 "ut_presence" received signal SIGINT, Interrupt.
futex_wait (private=0, expected=2, futex_word=0x7ffd2c010ed8) at ../sysdeps/nptl/futex-internal.h:146
146 ../sysdeps/nptl/futex-internal.h: No such file or directory.
(gdb) bt
#0 futex_wait (private=0, expected=2, futex_word=0x7ffd2c010ed8) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x7ffd2c010ed8, private=0) at ./nptl/lowlevellock.c:49
#2 0x00007ffff6a98002 in lll_mutex_lock_optimized (mutex=0x7ffd2c010ed8) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x7ffd2c010ed8) at ./nptl/pthread_mutex_lock.c:93
#4 0x00005555556d577b in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x7ffd2c010ed8) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x00005555556e05fc in std::mutex::lock() (this=0x7ffd2c010ed8) at /usr/include/c++/11/bits/std_mutex.h:100
#6 0x000055555570af32 in std::lock_guard<std::mutex>::lock_guard(std::mutex&) (this=0x7fffffffd3d8, __m=...) at /usr/include/c++/11/bits/std_mutex.h:229
#7 0x0000555555d02132 in jami::GitServer::Impl::stop() (this=0x7ffd2c010e10) at /home/fsimon/jami-client-qt/daemon/src/jamidht/gitserver.cpp:74
#8 0x0000555555cffff8 in jami::GitServer::stop() (this=0x7ffd2c016550) at /home/fsimon/jami-client-qt/daemon/src/jamidht/gitserver.cpp:503
#9 0x00005555557cbb8b in jami::JamiAccount::shutdownConnections() (this=0x55555872d560) at /home/fsimon/jami-client-qt/daemon/src/jamidht/jamiaccount.cpp:289
#10 0x00005555557ddca9 in jami::JamiAccount::doUnregister(bool) (this=0x55555872d560, forceShutdownConnections=true) at /home/fsimon/jami-client-qt/daemon/src/jamidht/jamiaccount.cpp:2385
#11 0x000055555572c4a3 in jami::Manager::removeAccount(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) (this=0x55555737c440 <jami::Manager::instance()::instance>, accountID="6b9c504b249854e3", flush=true)
at /home/fsimon/jami-client-qt/daemon/src/manager.cpp:2822
#12 0x00005555556f22f8 in wait_for_removal_of(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::chrono::duration<long, std::ratio<1l, 1l> >) (accounts=std::vector of length 3, capacity 3 = {...}, timeout=...) at /home/fsimon/jami-client-qt/daemon/test/unitTest/common.cpp:136
#13 0x00005555556d6253 in jami::test::PresenceTest::tearDown() (this=0x5555586d08c0) at /home/fsimon/jami-client-qt/daemon/test/unitTest/presence/presence.cpp:112
#14 0x00005555556f103f in CppUnit::TestCaller<jami::test::PresenceTest>::tearDown() (this=0x5555586d0570) at /usr/include/cppunit/TestCaller.h:185
#15 0x00007ffff7de34e6 in () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#16 0x00007ffff7de3434 in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#17 0x00007ffff7ddda50 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#18 0x00007ffff7de4be3 in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#19 0x00007ffff7dedbd2 in CppUnit::TestCase::run(CppUnit::TestResult*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#20 0x00007ffff7de384d in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#21 0x00007ffff7de365d in CppUnit::TestComposite::run(CppUnit::TestResult*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#22 0x00007ffff7de384d in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#23 0x00007ffff7de365d in CppUnit::TestComposite::run(CppUnit::TestResult*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#24 0x00007ffff7de4077 in CppUnit::TestResult::runTest(CppUnit::Test*) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#25 0x00007ffff7dea6a5 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#26 0x00007ffff7ded3a4 in CppUnit::TextTestRunner::run(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool, bool) () at /lib/x86_64-linux-gnu/libcppunit-1.15.so.1
#27 0x00005555556dc5e1 in main() () at /home/fsimon/jami-client-qt/daemon/test/unitTest/presence/presence.cpp:413
(gdb) p *(pthread_mutex_t*)0x7ffd2c010ed8
$1 = {__data = {__lock = 2, __count = 0, __owner = 2898628, __nusers = 1, __kind = 0, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\000\000\000\000\304:,\000\001", '\000' <repeats 26 times>, __align = 2}
(gdb) thread find 2898628
Thread 344 has target id 'Thread 0x7ffd93400640 (LWP 2898628)'
(gdb) thread 344
[Switching to thread 344 (Thread 0x7ffd93400640 (LWP 2898628))]
#0 futex_wait (private=0, expected=2, futex_word=0x55555872dff0) at ../sysdeps/nptl/futex-internal.h:146
146 in ../sysdeps/nptl/futex-internal.h
(gdb) bt
#0 futex_wait (private=0, expected=2, futex_word=0x55555872dff0) at ../sysdeps/nptl/futex-internal.h:146
#1 __GI___lll_lock_wait (futex=futex@entry=0x55555872dff0, private=0) at ./nptl/lowlevellock.c:49
#2 0x00007ffff6a9805d in lll_mutex_lock_optimized (mutex=0x55555872dff0) at ./nptl/pthread_mutex_lock.c:48
#3 ___pthread_mutex_lock (mutex=0x55555872dff0) at ./nptl/pthread_mutex_lock.c:128
#4 0x00005555556d577b in __gthread_mutex_lock(__gthread_mutex_t*) (__mutex=0x55555872dff0) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:749
#5 0x00005555556e0176 in __gthread_recursive_mutex_lock(__gthread_recursive_mutex_t*) (__mutex=0x55555872dff0) at /usr/include/x86_64-linux-gnu/c++/11/bits/gthr-default.h:811
#6 0x00005555556e0730 in std::recursive_mutex::lock() (this=0x55555872dff0) at /usr/include/c++/11/mutex:108
#7 0x000055555584c261 in std::unique_lock<std::recursive_mutex>::lock() (this=0x7ffd933ff120) at /usr/include/c++/11/bits/unique_lock.h:139
#8 0x000055555583b7f1 in std::unique_lock<std::recursive_mutex>::unique_lock(std::recursive_mutex&) (this=0x7ffd933ff120, __m=...) at /usr/include/c++/11/bits/unique_lock.h:69
#9 0x00005555557dd411 in jami::JamiAccount::convModule(bool) (this=0x55555872d560, noCreation=false) at /home/fsimon/jami-client-qt/daemon/src/jamidht/jamiaccount.cpp:2173
#10 0x00005555557db0aa in operator()(std::string const&) const (__closure=0x7ffd2c003f90, commit="c00bf3e112286497920cd5f374959e33e47288bd") at /home/fsimon/jami-client-qt/daemon/src/jamidht/jamiaccount.cpp:2098
#11 0x000055555581972b in std::__invoke_impl<void, jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)>::<lambda(const string&)>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(std::__invoke_other, struct {...} &) (__f=...) at /usr/include/c++/11/bits/invoke.h:61
#12 0x00005555558107d3 in std::__invoke_r<void, jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)>::<lambda(const string&)>&, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(struct {...} &) (__fn=...) at /usr/include/c++/11/bits/invoke.h:111
#13 0x00005555558076f5 in std::_Function_handler<void(const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&), jami::JamiAccount::doRegister_()::<lambda(const DeviceId&, const string&, std::shared_ptr<dhtnet::ChannelSocket>)>::<lambda(const string&)> >::_M_invoke(const std::_Any_data &, const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > &) (__functor=..., __args#0="c00bf3e112286497920cd5f374959e33e47288bd")
at /usr/include/c++/11/bits/std_function.h:290
#14 0x000055555570c461 in std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const
(this=0x7ffd2c010f08, __args#0="c00bf3e112286497920cd5f374959e33e47288bd") at /usr/include/c++/11/bits/std_function.h:590
#15 0x0000555555cff87a in jami::GitServer::Impl::sendPackData() (this=0x7ffd2c010e10) at /home/fsimon/jami-client-qt/daemon/src/jamidht/gitserver.cpp:444
#16 0x0000555555cfd24d in jami::GitServer::Impl::parseOrder(std::basic_string_view<char, std::char_traits<char> >) (this=0x7ffd2c010e10, buf="") at /home/fsimon/jami-client-qt/daemon/src/jamidht/gitserver.cpp:139
#17 0x0000555555d01d32 in jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}::operator()(unsigned char const*, unsigned long) const
(__closure=0x7ffd2c014d10, buf=0x7ffa90054630 "004dwant c00bf3e112286497920cd5f374959e33e47288bd side-band-64k include-tag \n00000009done\n6f81c0f88360/", len=90) at /home/fsimon/jami-client-qt/daemon/src/jamidht/gitserver.cpp:67
#18 0x0000555555d03864 in std::__invoke_impl<unsigned long, jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}&, unsigned char const*, unsigned long>(std::__invoke_other, jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}&, unsigned char const*&&, unsigned long&&) (__f=...)
at /usr/include/c++/11/bits/invoke.h:61
#19 0x0000555555d038d2 in std::__invoke_r<long, jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}&, unsigned char const*, unsigned long>(jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}&, unsigned char const*&&, unsigned long&&) (__fn=...) at /usr/include/c++/11/bits/invoke.h:114
#20 0x0000555555d02a17 in std::_Function_handler<long (unsigned char const*, unsigned long), jami::GitServer::Impl::Impl(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<dhtnet::ChannelSocket> const&)::{lambda(unsigned char const*, unsigned long)#1}>::_M_invoke(std::_Any_data const&, unsigned char const*&&, unsigned long&&)
(__functor=..., __args#0=@0x7ffd933ff718: 0x7ffa90054630 "004dwant c00bf3e112286497920cd5f374959e33e47288bd side-band-64k include-tag \n00000009done\n6f81c0f88360/", __args#1=@0x7ffd933ff720: 90) at /usr/include/c++/11/bits/std_function.h:290
#21 0x0000555555da7036 in dhtnet::ChannelSocket::onRecv(std::vector<unsigned char, std::allocator<unsigned char> >&&) ()
#22 0x0000555555da9cf9 in dhtnet::MultiplexedSocket::Impl::handleChannelPacket(unsigned short, std::vector<unsigned char, std::allocator<unsigned char> >&&) ()
#23 0x0000555555db10c5 in dhtnet::MultiplexedSocket::Impl::eventLoop() ()
#24 0x0000555555db3838 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<dhtnet::MultiplexedSocket::Impl::Impl(dhtnet::MultiplexedSocket&, std::shared_ptr<asio::io_context>, dht::Hash<32ul> const&, std::unique_ptr<dhtnet::TlsSocketEndpoint, std::default_delete<dhtnet::TlsSocketEndpoint> >, std::shared_ptr<dht::log::Logger>)::{lambda()#1}> > >::_M_run() ()
#25 0x00007ffff7adc253 in std::execute_native_thread_routine(void*) (__p=0x7ffa7c04c470) at ../../../../../src/libstdc++-v3/src/c++11/thread.cc:82
#26 0x00007ffff6a94ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#27 0x00007ffff6b26850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb) p *(pthread_mutex_t*)0x55555872dff0
$2 = {__data = {__lock = 2, __count = 1, __owner = 2898010, __nusers = 1, __kind = 1, __spins = 0, __elision = 0, __list = {__prev = 0x0, __next = 0x0}}, __size = "\002\000\000\000\001\000\000\000Z8,\000\001\000\000\000\001", '\000' <repeats 22 times>,
__align = 4294967298}
(gdb) thread find 2898010
Thread 1 has target id 'Thread 0x7ffff6212c00 (LWP 2898010)'