New issue
Advanced search Search tips
Note: Color blocks (like or ) mean that a user may not be available. Tooltip shows the reason.

Issue 672859 link

Starred by 2 users

Issue metadata

Status: Fixed
Owner:
Last visit > 30 days ago
Closed: Dec 2016
Cc:
Components:
EstimatedDays: ----
NextAction: ----
OS: All
Pri: 1
Type: Bug

Blocked on:
issue 671282

Blocking:
issue 672860



Sign in to add a comment

lock-order-inversion in FieldTrialListTest

Project Member Reported by gab@chromium.org, Dec 9 2016

Issue description

As 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
 

Comment 1 by gab@chromium.org, Dec 9 2016

Blocking: 672860
Cc: asvitk...@chromium.org
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?
This seems pretty important - can you look at this before your other things?
OK, will do.

Comment 5 by gab@chromium.org, Dec 9 2016

Labels: -ReleaseBlock-Stable
Only a test issue after all, doesn't need to block M56 ( issue 671282  does though, added merge request there).
Thanks gab@!
Status: Fixed (was: Assigned)
Project Member

Comment 8 by bugdroid1@chromium.org, 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