lock-order-inversion in FieldTrialListTest |
||||
Issue descriptionAs caught by TSAN bot: https://build.chromium.org/p/chromium.memory.full/builders/Linux%20TSan%20Tests. Looks like an attempt at addressing this was made in https://codereview.chromium.org/2560823002 but there still appears to be a scenario on which it can occur. The solution to both of this bugs should likely be merged to M56 (assuming issue made it on branch before being caught)? Tentatively marking Release-Block-Stable for M56. FieldTrialListTest.ClearParamsFromSharedMemory (run #1): [ RUN ] FieldTrialListTest.ClearParamsFromSharedMemory ================== WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock) (pid=19150) Cycle in lock order graph: M2639 (0x7fffb82daf28) => M2630 (0x7b1000011a00) => M2639 Mutex M2630 acquired here while holding mutex M2639 in main thread: #0 pthread_mutex_lock <null> (base_unittests+0x0000004dcc6e) #1 base::internal::LockImpl::Lock() base/synchronization/lock_impl_posix.cc:64:12 (base_unittests+0x000000d84655) #2 Acquire base/synchronization/lock.h:26:26 (base_unittests+0x000000d44ffd) #3 AutoLock base/synchronization/lock.h:115 (base_unittests+0x000000d44ffd) #4 base::FieldTrialParamAssociator::GetFieldTrialParamsWithoutFallback(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >*) base/metrics/field_trial_param_associator.cc:57 (base_unittests+0x000000d44ffd) #5 PickleFieldTrial base/metrics/field_trial.cc:157:45 (base_unittests+0x000000d42084) #6 base::FieldTrialList::AddToAllocatorWhileLocked(base::FieldTrial*) base/metrics/field_trial.cc:1252 (base_unittests+0x000000d42084) #7 base::FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded() base/metrics/field_trial.cc:1213:5 (base_unittests+0x000000d41411) #8 base::FieldTrialListTest_ClearParamsFromSharedMemory_Test::TestBody() base/metrics/field_trial_unittest.cc:1297:5 (base_unittests+0x0000007c62ed) #9 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e51a16) #10 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000e51a16) #11 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000e5291c) #12 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000e531f6) #13 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000e5e1a6) #14 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e5da39) #15 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000e5da39) #16 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000e108e9) #17 base::TestSuite::Run() base/test/test_suite.cc:271 (base_unittests+0x000000e108e9) #18 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000e02605) #19 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000e02605) #20 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000e02605) #21 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000e02605) #22 Run base/callback.h:85:12 (base_unittests+0x000000e1f3b3) #23 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:211 (base_unittests+0x000000e1f3b3) #24 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (base_unittests+0x000000e1f23a) #25 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000e02561) Mutex M2639 previously acquired by the same thread here: #0 pthread_mutex_lock <null> (base_unittests+0x0000004dcc6e) #1 base::internal::LockImpl::Lock() base/synchronization/lock_impl_posix.cc:64:12 (base_unittests+0x000000d84655) #2 Acquire base/synchronization/lock.h:26:26 (base_unittests+0x000000d4127a) #3 AutoLock base/synchronization/lock.h:115 (base_unittests+0x000000d4127a) #4 base::FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded() base/metrics/field_trial.cc:1191 (base_unittests+0x000000d4127a) #5 base::FieldTrialListTest_ClearParamsFromSharedMemory_Test::TestBody() base/metrics/field_trial_unittest.cc:1297:5 (base_unittests+0x0000007c62ed) #6 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e51a16) #7 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000e51a16) #8 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000e5291c) #9 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000e531f6) #10 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000e5e1a6) #11 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e5da39) #12 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000e5da39) #13 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000e108e9) #14 base::TestSuite::Run() base/test/test_suite.cc:271 (base_unittests+0x000000e108e9) #15 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000e02605) #16 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000e02605) #17 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000e02605) #18 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000e02605) #19 Run base/callback.h:85:12 (base_unittests+0x000000e1f3b3) #20 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:211 (base_unittests+0x000000e1f3b3) #21 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (base_unittests+0x000000e1f23a) #22 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000e02561) Mutex M2639 acquired here while holding mutex M2630 in main thread: #0 pthread_mutex_lock <null> (base_unittests+0x0000004dcc6e) #1 base::internal::LockImpl::Lock() base/synchronization/lock_impl_posix.cc:64:12 (base_unittests+0x000000d84655) #2 Acquire base/synchronization/lock.h:26:26 (base_unittests+0x000000d42a40) #3 AutoLock base/synchronization/lock.h:115 (base_unittests+0x000000d42a40) #4 base::FieldTrialList::ClearParamsFromSharedMemoryForTesting() base/metrics/field_trial.cc:1068 (base_unittests+0x000000d42a40) #5 base::FieldTrialParamAssociator::ClearAllParamsForTesting() base/metrics/field_trial_param_associator.cc:70:3 (base_unittests+0x000000d4510b) #6 base::FieldTrialListTest_ClearParamsFromSharedMemory_Test::TestBody() base/metrics/field_trial_unittest.cc:1302:47 (base_unittests+0x0000007c631d) #7 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e51a16) #8 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000e51a16) #9 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000e5291c) #10 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000e531f6) #11 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000e5e1a6) #12 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e5da39) #13 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000e5da39) #14 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000e108e9) #15 base::TestSuite::Run() base/test/test_suite.cc:271 (base_unittests+0x000000e108e9) #16 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000e02605) #17 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000e02605) #18 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000e02605) #19 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000e02605) #20 Run base/callback.h:85:12 (base_unittests+0x000000e1f3b3) #21 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:211 (base_unittests+0x000000e1f3b3) #22 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (base_unittests+0x000000e1f23a) #23 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000e02561) Mutex M2630 previously acquired by the same thread here: #0 pthread_mutex_lock <null> (base_unittests+0x0000004dcc6e) #1 base::internal::LockImpl::Lock() base/synchronization/lock_impl_posix.cc:64:12 (base_unittests+0x000000d84655) #2 Acquire base/synchronization/lock.h:26:26 (base_unittests+0x000000d450bd) #3 AutoLock base/synchronization/lock.h:115 (base_unittests+0x000000d450bd) #4 base::FieldTrialParamAssociator::ClearAllParamsForTesting() base/metrics/field_trial_param_associator.cc:68 (base_unittests+0x000000d450bd) #5 base::FieldTrialListTest_ClearParamsFromSharedMemory_Test::TestBody() base/metrics/field_trial_unittest.cc:1302:47 (base_unittests+0x0000007c631d) #6 HandleExceptionsInMethodIfSupported<testing::Test, void> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e51a16) #7 testing::Test::Run() testing/gtest/src/gtest.cc:2474 (base_unittests+0x000000e51a16) #8 testing::TestInfo::Run() testing/gtest/src/gtest.cc:2656:11 (base_unittests+0x000000e5291c) #9 testing::TestCase::Run() testing/gtest/src/gtest.cc:2774:28 (base_unittests+0x000000e531f6) #10 testing::internal::UnitTestImpl::RunAllTests() testing/gtest/src/gtest.cc:4647:43 (base_unittests+0x000000e5e1a6) #11 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> testing/gtest/src/gtest.cc:2458:12 (base_unittests+0x000000e5da39) #12 testing::UnitTest::Run() testing/gtest/src/gtest.cc:4255 (base_unittests+0x000000e5da39) #13 RUN_ALL_TESTS testing/gtest/include/gtest/gtest.h:2237:46 (base_unittests+0x000000e108e9) #14 base::TestSuite::Run() base/test/test_suite.cc:271 (base_unittests+0x000000e108e9) #15 Invoke<base::TestSuite *> base/bind_internal.h:214:12 (base_unittests+0x000000e02605) #16 MakeItSo<int (base::TestSuite::*const &)(), base::TestSuite *> base/bind_internal.h:285 (base_unittests+0x000000e02605) #17 RunImpl<int (base::TestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<base::TestSuite> > &, 0> base/bind_internal.h:361 (base_unittests+0x000000e02605) #18 base::internal::Invoker<base::internal::BindState<int (base::TestSuite::*)(), base::internal::UnretainedWrapper<base::TestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:339 (base_unittests+0x000000e02605) #19 Run base/callback.h:85:12 (base_unittests+0x000000e1f3b3) #20 base::(anonymous namespace)::LaunchUnitTestsInternal(base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&, int, int, bool, base::Callback<void (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:211 (base_unittests+0x000000e1f3b3) #21 base::LaunchUnitTests(int, char**, base::Callback<int (), (base::internal::CopyMode)1, (base::internal::RepeatMode)1> const&) base/test/launcher/unit_test_launcher.cc:453:10 (base_unittests+0x000000e1f23a) #22 main base/test/run_all_base_unittests.cc:22:10 (base_unittests+0x000000e02561) SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) (/b/swarm_slave/w/irad3oEM/out/Release/base_unittests+0x4dcc6e) in __interceptor_pthread_mutex_lock
,
Dec 9 2016
Hmm, so today is my last day and I have some other stuff on my plate. I'll see if I can tackle this after everything, but if not, I think asvitkine@ should take this over. Does that sound good?
,
Dec 9 2016
This seems pretty important - can you look at this before your other things?
,
Dec 9 2016
OK, will do.
,
Dec 9 2016
Only a test issue after all, doesn't need to block M56 ( issue 671282 does though, added merge request there).
,
Dec 9 2016
Thanks gab@!
,
Dec 9 2016
,
Dec 9 2016
The following revision refers to this bug: https://chromium.googlesource.com/chromium/src.git/+/5d5b6f22db0d049c4300e06b7a16b4bde514bcdd commit 5d5b6f22db0d049c4300e06b7a16b4bde514bcdd Author: lawrencewu <lawrencewu@chromium.org> Date: Fri Dec 09 20:28:22 2016 Fix tsan deadlock in base_unittest BUG= 672859 Review-Url: https://codereview.chromium.org/2568533002 Cr-Commit-Position: refs/heads/master@{#437623} [modify] https://crrev.com/5d5b6f22db0d049c4300e06b7a16b4bde514bcdd/base/metrics/field_trial_param_associator.cc |
||||
►
Sign in to add a comment |
||||
Comment 1 by gab@chromium.org
, Dec 9 2016