[
https://issues.apache.org/jira/browse/KUDU-3735?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Marton Greber reassigned KUDU-3735:
-----------------------------------
Assignee: Marton Greber
> 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
> Assignee: Marton Greber
> Priority: Minor
>
> 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)