Peter Rozsa created KUDU-3735:
---------------------------------

             Summary:  Data race in stack trace collection in debug-util.cc
                 Key: KUDU-3735
                 URL: https://issues.apache.org/jira/browse/KUDU-3735
             Project: Kudu
          Issue Type: Bug
          Components: util
            Reporter: Peter Rozsa


ThreadSanitizer detects a data race in kudu::stack_trace_internal::SignalData 
during concurrent stack trace collection. The race occurs between atomic 
variable initialization in one thread and atomic operations on the same 
variable in another thread.

The actual call is made from Impala, but it can occur in different environments 
too.

 
{code:java}
WARNING: ThreadSanitizer: data race (pid=747181)  Atomic write of size 8 at 
0x7b080011e0e8 by thread T54 (mutexes: write M1007816000152797856, write 
M1013445224811605968):    #0 __tsan_atomic64_compare_exchange_val <null> 
(data-stream-test+0x24458a6)    #1 
std::__atomic_base<long>::compare_exchange_strong(long&, long, 
std::memory_order, std::memory_order) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/atomic_base.h:509:9
 (data-stream-test+0x2bf1bb1)    #2 
std::__atomic_base<long>::compare_exchange_strong(long&, long, 
std::memory_order) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/atomic_base.h:533
 (data-stream-test+0x2bf1bb1)    #3 kudu::(anonymous 
namespace)::HandleStackTraceSignal(int, siginfo_t*, void*) 
repos/Impala/be/src/kudu/util/debug-util.cc:277 (data-stream-test+0x2bf1bb1)    
#4 __tsan::ProcessPendingSignals(__tsan::ThreadState*) <null> 
(data-stream-test+0x23f2810)    #5 __gthread_mutex_lock(pthread_mutex_t*) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/x86_64-pc-linux-gnu/bits/gthr-default.h:749:12
 (data-stream-test+0x2483276)    #6 std::mutex::lock() 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_mutex.h:100:17
 (data-stream-test+0x248bda9)    #7 
std::lock_guard<std::mutex>::lock_guard(std::mutex&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_mutex.h:159:19
 (data-stream-test+0x248b488)    #8 
std::_V2::condition_variable_any::notify_one() 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/condition_variable:303:25
 (data-stream-test+0x2ee7766)    #9 
impala::KrpcDataStreamSender::Channel::MarkDone(impala::Status const&) 
repos/Impala/be/src/runtime/krpc-data-stream-sender.cc:406:16 
(data-stream-test+0x2eeed88)    #10 
impala::KrpcDataStreamSender::Channel::TransmitDataCompleteCb() 
repos/Impala/be/src/runtime/krpc-data-stream-sender.cc:543:5 
(data-stream-test+0x2eeff17)    #11 boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>::operator()(impala::KrpcDataStreamSender::Channel*)
 const /boost-1.74.0-p1/include/boost/bind/mem_fn_template.hpp:49:29 
(data-stream-test+0x2f056a6)    #12 void 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> 
>::operator()<boost::_mfi::mf0<void, impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list0>(boost::_bi::type<void>, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>&, boost::_bi::list0&, int) 
/boost-1.74.0-p1/include/boost/bind/bind.hpp:259:9 (data-stream-test+0x2f055fa) 
   #13 boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>::operator()() /boost-1.74.0-p1/include/boost/bind/bind.hpp:1294:16 
(data-stream-test+0x2f05583)    #14 void std::__invoke_impl<void, 
boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>&>(std::__invoke_other, boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:60:14
 (data-stream-test+0x2f05501)    #15 std::enable_if<is_invocable_r_v<void, 
boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>&>, void>::type std::__invoke_r<void, boost::_bi::bind_t<void, 
boost::_mfi::mf0<void, impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>&>(boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > 
>&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:110:2
 (data-stream-test+0x2f05481)    #16 std::_Function_handler<void (), 
boost::_bi::bind_t<void, boost::_mfi::mf0<void, 
impala::KrpcDataStreamSender::Channel>, 
boost::_bi::list1<boost::_bi::value<impala::KrpcDataStreamSender::Channel*> > > 
>::_M_invoke(std::_Any_data const&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:291:9
 (data-stream-test+0x2f052f1)    #17 std::function<void ()>::operator()() const 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:622:14
 (data-stream-test+0x2c3eedc)    #18 kudu::rpc::OutboundCall::CallCallback() 
repos/Impala/be/src/kudu/rpc/outbound_call.cc:309:5 
(data-stream-test+0x2d1b644)    #19 
kudu::rpc::OutboundCall::SetResponse(std::unique_ptr<kudu::rpc::CallResponse, 
std::default_delete<kudu::rpc::CallResponse> >) 
repos/Impala/be/src/kudu/rpc/outbound_call.cc:341:5 
(data-stream-test+0x2d1b85e)    #20 
kudu::rpc::Connection::HandleCallResponse(std::unique_ptr<kudu::rpc::InboundTransfer,
 std::default_delete<kudu::rpc::InboundTransfer> >) 
repos/Impala/be/src/kudu/rpc/connection.cc:744:14 (data-stream-test+0x2cfa1de)  
  #21 kudu::rpc::Connection::ReadHandler(ev::io&, int) 
repos/Impala/be/src/kudu/rpc/connection.cc:682:7 (data-stream-test+0x2cf9a2f)   
 #22 void ev::base<ev_io, ev::io>::method_thunk<kudu::rpc::Connection, 
&kudu::rpc::Connection::ReadHandler>(ev_loop*, ev_io*, int) 
/libev-4.20-p1/include/ev++.h:479:7 (data-stream-test+0x2d04e1a)    #23 
ev_invoke_pending /mnt/source/libev/libev-4.20-p1/ev.c:3155:11 
(data-stream-test+0x571c222)    #24 ev_run 
/mnt/source/libev/libev-4.20-p1/ev.c:3555:7 (data-stream-test+0x571f574)    #25 
ev_run /mnt/source/libev/libev-4.20-p1/ev.c:3402:1 (data-stream-test+0x571f574) 
   #26 kudu::rpc::ReactorThread::RunThread() 
repos/Impala/be/src/kudu/rpc/reactor.cc:503:9 (data-stream-test+0x2d232b4)    
#27 kudu::rpc::ReactorThread::Init()::$_0::operator()() const 
repos/Impala/be/src/kudu/rpc/reactor.cc:194:48 (data-stream-test+0x2d253c1)    
#28 void std::__invoke_impl<void, 
kudu::rpc::ReactorThread::Init()::$_0&>(std::__invoke_other, 
kudu::rpc::ReactorThread::Init()::$_0&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:60:14
 (data-stream-test+0x2d25351)    #29 std::enable_if<is_invocable_r_v<void, 
kudu::rpc::ReactorThread::Init()::$_0&>, void>::type std::__invoke_r<void, 
kudu::rpc::ReactorThread::Init()::$_0&>(kudu::rpc::ReactorThread::Init()::$_0&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:110:2
 (data-stream-test+0x2d252d1)    #30 std::_Function_handler<void (), 
kudu::rpc::ReactorThread::Init()::$_0>::_M_invoke(std::_Any_data const&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:291:9
 (data-stream-test+0x2d251a1)    #31 std::function<void ()>::operator()() const 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:622:14
 (data-stream-test+0x2c3eedc)    #32 kudu::Thread::SuperviseThread(void*) 
repos/Impala/be/src/kudu/util/thread.cc:691:3 (data-stream-test+0x2cb0e56)
  Previous write of size 8 at 0x7b080011e0e8 by thread T44 (mutexes: write 
M936321304528812448):    #0 std::__atomic_base<long>::__atomic_base(long) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/atomic_base.h:286:58
 (data-stream-test+0x2bf415d)    #1 std::atomic<long>::atomic(long) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/atomic:816:56
 (data-stream-test+0x2bf4100)    #2 
kudu::stack_trace_internal::SignalData::SignalData() 
repos/Impala/be/src/kudu/util/debug-util.cc:243:38 (data-stream-test+0x2bf331c) 
   #3 kudu::StackTraceCollector::TriggerAsync(long, kudu::StackTrace*) 
repos/Impala/be/src/kudu/util/debug-util.cc:436:40 (data-stream-test+0x2bf0151) 
   #4 kudu::GetThreadStack(long, kudu::StackTrace*) 
repos/Impala/be/src/kudu/util/debug-util.cc:507:3 (data-stream-test+0x2bf05fe)  
  #5 kudu::DumpThreadStack[abi:cxx11](long) 
repos/Impala/be/src/kudu/util/debug-util.cc:514:14 (data-stream-test+0x2bf071c) 
   #6 kudu::KernelStackWatchdog::RunThread() 
repos/Impala/be/src/kudu/util/kernel_stack_watchdog.cc:185:31 
(data-stream-test+0x2cc5e3e)    #7 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0::operator()() const 
repos/Impala/be/src/kudu/util/kernel_stack_watchdog.cc:71:3 
(data-stream-test+0x2cc6631)    #8 void std::__invoke_impl<void, 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0&>(std::__invoke_other, 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:60:14
 (data-stream-test+0x2cc65c1)    #9 std::enable_if<is_invocable_r_v<void, 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0&>, void>::type 
std::__invoke_r<void, 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0&>(kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0&)
 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/invoke.h:110:2
 (data-stream-test+0x2cc6541)    #10 std::_Function_handler<void (), 
kudu::KernelStackWatchdog::KernelStackWatchdog()::$_0>::_M_invoke(std::_Any_data
 const&) 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:291:9
 (data-stream-test+0x2cc6411)    #11 std::function<void ()>::operator()() const 
/gcc-10.4.0/lib/gcc/x86_64-pc-linux-gnu/10.4.0/../../../../include/c++/10.4.0/bits/std_function.h:622:14
 (data-stream-test+0x2c3eedc)    #12 kudu::Thread::SuperviseThread(void*) 
repos/Impala/be/src/kudu/util/thread.cc:691:3 (data-stream-test+0x2cb0e56){code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to