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

TSAN report: Data race in AccessLogFileImpl::write_lock_ #13953

Closed
qiwzhang opened this issue Nov 10, 2020 · 2 comments
Closed

TSAN report: Data race in AccessLogFileImpl::write_lock_ #13953

qiwzhang opened this issue Nov 10, 2020 · 2 comments
Labels
bug triage Issue requires triage

Comments

@qiwzhang
Copy link
Contributor

Title: TSAN report: Data race in AccessLogFileImpl::write_lock_

Description:
Our Tsan test has data race warning

WARNING: ThreadSanitizer: data race (pid=708734)
  Atomic write of size 4 at 0x7fed3cd9d150 by main thread:
    #0 __tsan_atomic32_fetch_add <null> (envoy+0x38b889)
    #1 absl::synchronization_internal::Waiter::Post() <null> (envoy+0x42bb0c2)
    #2 AbslInternalPerThreadSemPost <null> (envoy+0x42b9bf0)
    #3 absl::synchronization_internal::PerThreadSem::Post(absl::base_internal::ThreadIdentity*) <null> (envoy+0x42b53e8)
    #4 absl::Mutex::IncrementSynchSem(absl::Mutex*, absl::base_internal::PerThreadSynch*) <null> (envoy+0x42b462c)
    #5 absl::Mutex::Wakeup(absl::base_internal::PerThreadSynch*) <null> (envoy+0x429780d)
    #6 absl::Mutex::UnlockSlow(absl::SynchWaitParams*) <null> (envoy+0x429fde2)
    #7 absl::Mutex::Unlock() <null> (envoy+0x42a79e3)
    #8 Envoy::Thread::MutexBasicLockable::unlock() <null> (envoy+0x834aff)
    #9 Envoy::Thread::LockGuard::~LockGuard() <null> (envoy+0x11e8e82)
    #10 Envoy::AccessLog::AccessLogFileImpl::~AccessLogFileImpl() <null> (envoy+0x1262d7e)
    #11 void __gnu_cxx::new_allocator<Envoy::AccessLog::AccessLogFileImpl>::destroy<Envoy::AccessLog::AccessLogFileImpl>(Envoy::AccessLog::AccessLogFileImp
l*) <null> (envoy+0x126f52a)
    #12 void std::allocator_traits<std::allocator<Envoy::AccessLog::AccessLogFileImpl> >::destroy<Envoy::AccessLog::AccessLogFileImpl>(std::allocator<Envoy
::AccessLog::AccessLogFileImpl>&, Envoy::AccessLog::AccessLogFileImpl*) <null> (envoy+0x126f47b)
    #13 std::_Sp_counted_ptr_inplace<Envoy::AccessLog::AccessLogFileImpl, std::allocator<Envoy::AccessLog::AccessLogFileImpl>, (__gnu_cxx::_Lock_policy)2>:
:_M_dispose() <null> (envoy+0x126f122)
    #14 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() <null> (envoy+0x3d14f0)
    #15 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() <null> (envoy+0x3d13b8)
    #16 std::__shared_ptr<Envoy::AccessLog::AccessLogFile, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() <null> (envoy+0x1269542)
    #17 std::shared_ptr<Envoy::AccessLog::AccessLogFile>::~shared_ptr() <null> (envoy+0x126835b)
    #18 Envoy::Extensions::AccessLoggers::File::FileAccessLog::~FileAccessLog() <null> (envoy+0x1d9cb37)
    #19 Envoy::Extensions::AccessLoggers::File::FileAccessLog::~FileAccessLog() <null> (envoy+0x1d9cb7f)
    #20 std::_Sp_counted_ptr<Envoy::Extensions::AccessLoggers::File::FileAccessLog*, (__gnu_cxx::_Lock_policy)2>::_M_dispose() <null> (envoy+0x1c851e8)
    #21 std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release() <null> (envoy+0x3d14f0)
    #22 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count() <null> (envoy+0x3d13b8)
    #23 std::__shared_ptr<Envoy::AccessLog::Instance, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr() <null> (envoy+0x52a7b2)
    #24 std::shared_ptr<Envoy::AccessLog::Instance>::~shared_ptr() <null> (envoy+0x528d1b)
    #25 void __gnu_cxx::new_allocator<std::_List_node<std::shared_ptr<Envoy::AccessLog::Instance> > >::destroy<std::shared_ptr<Envoy::AccessLog::Instance> 
>(std::shared_ptr<Envoy::AccessLog::Instance>*) <null> (envoy+0xc058f4)
    #26 void std::allocator_traits<std::allocator<std::_List_node<std::shared_ptr<Envoy::AccessLog::Instance> > > >::destroy<std::shared_ptr<Envoy::AccessL
og::Instance> >(std::allocator<std::_List_node<std::shared_ptr<Envoy::AccessLog::Instance> > >&, std::shared_ptr<Envoy::AccessLog::Instance>*) <null> (envo
y+0xc057eb)
    #27 std::__cxx11::_List_base<std::shared_ptr<Envoy::AccessLog::Instance>, std::allocator<std::shared_ptr<Envoy::AccessLog::Instance> > >::_M_clear() <n
ull> (envoy+0xc056f0)
    #28 std::__cxx11::_List_base<std::shared_ptr<Envoy::AccessLog::Instance>, std::allocator<std::shared_ptr<Envoy::AccessLog::Instance> > >::~_List_base()
 <null> (envoy+0xc0562f)
    #29 std::__cxx11::list<std::shared_ptr<Envoy::AccessLog::Instance>, std::allocator<std::shared_ptr<Envoy::AccessLog::Instance> > >::~list() <null> (env
oy+0xc041ab)
    #30 Envoy::Server::AdminImpl::~AdminImpl() <null> (envoy+0x1c78753)
    #31 Envoy::Server::AdminImpl::~AdminImpl() <null> (envoy+0x1c787ff)
    #32 std::default_delete<Envoy::Server::AdminImpl>::operator()(Envoy::Server::AdminImpl*) const <null> (envoy+0x11a7c26)
    #33 std::unique_ptr<Envoy::Server::AdminImpl, std::default_delete<Envoy::Server::AdminImpl> >::~unique_ptr() <null> (envoy+0x1195c13)
    #34 Envoy::Server::InstanceImpl::~InstanceImpl() <null> (envoy+0x117f9b9)
    #35 std::default_delete<Envoy::Server::InstanceImpl>::operator()(Envoy::Server::InstanceImpl*) const <null> (envoy+0x838906)
    #36 std::unique_ptr<Envoy::Server::InstanceImpl, std::default_delete<Envoy::Server::InstanceImpl> >::~unique_ptr() <null> (envoy+0x831403)
    #37 Envoy::MainCommonBase::~MainCommonBase() <null> (envoy+0x83a479)
    #38 Envoy::MainCommon::~MainCommon() <null> (envoy+0x83a3b9)
    #39 std::default_delete<Envoy::MainCommon>::operator()(Envoy::MainCommon*) const <null> (envoy+0x83a296)
    #40 std::unique_ptr<Envoy::MainCommon, std::default_delete<Envoy::MainCommon> >::~unique_ptr() <null> (envoy+0x8334e3)
    #41 Envoy::MainCommon::main(int, char**, std::function<void (Envoy::Server::Instance&)>) <null> (envoy+0x82eaee)
    #42 main <null> (envoy+0x82acd5)

 Previous write of size 8 at 0x7fed3cd9d150 by thread T9:
    #0 mmap <null> (envoy+0x36fa3a)
    #1 absl::base_internal::DoAllocWithArena(unsigned long, absl::base_internal::LowLevelAlloc::Arena*) <null> (envoy+0x42dd4d6)
    #2 absl::base_internal::LowLevelAlloc::Alloc(unsigned long) <null> (envoy+0x434cbc4)
    #3 absl::synchronization_internal::NewThreadIdentity() <null> (envoy+0x42b9129)
    #4 absl::synchronization_internal::CreateThreadIdentity() <null> (envoy+0x42b9005)
    #5 absl::synchronization_internal::GetOrCreateCurrentThreadIdentity() <null> (envoy+0x42b5316)
    #6 absl::Synch_GetPerThread() <null> (envoy+0x42b14f5)
    #7 absl::Synch_GetPerThreadAnnotated(absl::Mutex*) <null> (envoy+0x429bb14)
    #8 absl::CondVar::WaitCommon(absl::Mutex*, absl::synchronization_internal::KernelTimeout) <null> (envoy+0x42ace85)
    #9 absl::CondVar::Wait(absl::Mutex*) <null> (envoy+0x42ad402)
    #10 Envoy::Thread::CondVar::wait(Envoy::Thread::MutexBasicLockable&) <null> (envoy+0x126764f)
    #11 Envoy::AccessLog::AccessLogFileImpl::flushThreadFunc() <null> (envoy+0x1263df9)
    #12 Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1::operator()() const <null> (envoy+0x126666b)
    #13 void std::__invoke_impl<void, Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1&>(std::__invoke_other, Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1&) <null> (envoy+0x12665f0)
    #14 std::enable_if<is_invocable_r_v<void, Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1&>, void>::type std::__invoke_r<void, Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1&>(Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1&) <null> (envoy+0x1266540)
    #15 std::_Function_handler<void (), Envoy::AccessLog::AccessLogFileImpl::createFlushStructures()::$_1>::_M_invoke(std::_Any_data const&) <null> (envoy+0x126636a)
    #16 std::function<void ()>::operator()() const <null> (envoy+0x532ec6)
    #17 Envoy::Thread::ThreadImplPosix::ThreadImplPosix(std::function<void ()>, std::optional<Envoy::Thread::Options> const&)::'lambda'(void*)::operator()(void*) const <null> (envoy+0x2da9a3b)
    #18 Envoy::Thread::ThreadImplPosix::ThreadImplPosix(std::function<void ()>, std::optional<Envoy::Thread::Options> const&)::'lambda'(void*)::__invoke(void*) <null> (envoy+0x2da99c8)

By looking at the code, it seems the race is inside mutex write_lock_.

Main thread is at write_lock_ destructor of here

AccessLogFlush thread is here

@qiwzhang qiwzhang added bug triage Issue requires triage labels Nov 10, 2020
@mattklein123
Copy link
Member

This is an issue in TSAN itself. See #12600

@qiwzhang
Copy link
Contributor Author

It turns out it is tsan issue: google/sanitizers#953

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

No branches or pull requests

2 participants