Caught in an attempt to enable browser_tests on TSAN bots.
I think the issue is lazy allocating without synchronization in PersistentHistogramAllocator::AllocateHistogram():
PersistentMemoryAllocator::Reference ranges_ref =
bucket_ranges->persistent_reference();
if (!ranges_ref) {
size_t ranges_count = bucket_count + 1;
size_t ranges_bytes = ranges_count * sizeof(HistogramBase::Sample);
ranges_ref =
memory_allocator_->Allocate(ranges_bytes, kTypeIdRangesArray);
this code can be called by multiple unsynchronized callers.
Full log below:
WARNING: ThreadSanitizer: data race (pid=25116)
Read of size 4 at 0x7fd05740d63c by thread T24:
#0 GetBlock base/metrics/persistent_memory_allocator.cc:865:16 (browser_tests+0x420fd0a)
#1 base::PersistentMemoryAllocator::GetType(unsigned int) const base/metrics/persistent_memory_allocator.cc:540 (browser_tests+0x420fd0a)
#2 base::PersistentHistogramAllocator::AllocateHistogram(base::HistogramType, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, base::BucketRanges const*, int, unsigned int*) base/metrics/persistent_histogram_allocator.cc:383:7 (browser_tests+0x420b448)
#3 base::Histogram::Factory::Build() base/metrics/histogram.cc:186:40 (browser_tests+0x4200db4)
#4 base::Histogram::FactoryGet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, unsigned int, int) base/metrics/histogram.cc:253:63 (browser_tests+0x4201242)
#5 base::Histogram::FactoryGet(char const*, int, int, unsigned int, int) base/metrics/histogram.cc:271:10 (browser_tests+0x420195c)
#6 net::NetworkQualityEstimator::OnPrefsRead(std::__1::map<net::nqe::internal::NetworkID, net::nqe::internal::CachedNetworkQuality, std::__1::less<net::nqe::internal::NetworkID>, std::__1::allocator<std::__1::pair<net::nqe::internal::NetworkID const, net::nqe::internal::CachedNetworkQuality> > >) net/nqe/network_quality_estimator.cc:1753:3 (browser_tests+0x4fb7387)
#7 net::NetworkQualitiesPrefsManager::InitializeOnNetworkThread(net::NetworkQualityEstimator*) net/nqe/network_qualities_prefs_manager.cc:96:31 (browser_tests+0x4fa8526)
#8 (anonymous namespace)::SetNQEOnIOThread(net::NetworkQualitiesPrefsManager*, IOThread*) chrome/browser/net/nqe/ui_network_quality_estimator_service.cc:75:18 (browser_tests+0x443ea22)
#9 Invoke<net::NetworkQualitiesPrefsManager *, IOThread *> base/bind_internal.h:151:12 (browser_tests+0x44426f9)
#10 MakeItSo<void (*)(net::NetworkQualitiesPrefsManager *, IOThread *), net::NetworkQualitiesPrefsManager *, IOThread *> base/bind_internal.h:262 (browser_tests+0x44426f9)
#11 RunImpl<void (*)(net::NetworkQualitiesPrefsManager *, IOThread *), std::__1::tuple<net::NetworkQualitiesPrefsManager *, IOThread *>, 0, 1> base/bind_internal.h:338 (browser_tests+0x44426f9)
#12 base::internal::Invoker<base::internal::BindState<void (*)(net::NetworkQualitiesPrefsManager*, IOThread*), net::NetworkQualitiesPrefsManager*, IOThread*>, void ()>::RunOnce(base::internal::BindStateBase*) base/bind_internal.h:303 (browser_tests+0x44426f9)
#13 Run base/callback.h:91:12 (browser_tests+0x41b5b3a)
#14 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/debug/task_annotator.cc:59 (browser_tests+0x41b5b3a)
#15 base::MessageLoop::RunTask(base::PendingTask*) base/message_loop/message_loop.cc:422:19 (browser_tests+0x41ed9bf)
#16 base::MessageLoop::DeferOrRunPendingTask(base::PendingTask) base/message_loop/message_loop.cc:433:5 (browser_tests+0x41edeab)
#17 base::MessageLoop::DoWork() base/message_loop/message_loop.cc:540:13 (browser_tests+0x41ee35b)
#18 base::MessagePumpLibevent::Run(base::MessagePump::Delegate*) base/message_loop/message_pump_libevent.cc:220:31 (browser_tests+0x41f41d0)
#19 base::MessageLoop::Run() base/message_loop/message_loop.cc:369:10 (browser_tests+0x41ed333)
#20 non-virtual thunk to base::MessageLoop::Run() base/message_loop/message_loop.cc (browser_tests+0x41ed37d)
#21 base::RunLoop::Run() base/run_loop.cc:112:14 (browser_tests+0x4235ed4)
#22 base::Thread::Run(base::RunLoop*) base/threading/thread.cc:255:13 (browser_tests+0x427e2cb)
#23 content::BrowserThreadImpl::IOThreadRun(base::RunLoop*) content/browser/browser_thread_impl.cc:278:11 (browser_tests+0x235979f)
#24 content::BrowserThreadImpl::Run(base::RunLoop*) content/browser/browser_thread_impl.cc:313:14 (browser_tests+0x2359a14)
#25 base::Thread::ThreadMain() base/threading/thread.cc:338:3 (browser_tests+0x427ea61)
#26 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (browser_tests+0x42725a8)
Previous write of size 4 at 0x7fd05740d63c by thread T19 (mutexes: write M125110181129911200):
#0 base::PersistentMemoryAllocator::AllocateImpl(unsigned long, unsigned int) base/metrics/persistent_memory_allocator.cc:732:19 (browser_tests+0x42104ef)
#1 base::PersistentMemoryAllocator::Allocate(unsigned long, unsigned int) base/metrics/persistent_memory_allocator.cc:609:19 (browser_tests+0x420f169)
#2 base::PersistentHistogramAllocator::AllocateHistogram(base::HistogramType, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, base::BucketRanges const*, int, unsigned int*) base/metrics/persistent_histogram_allocator.cc:367:30 (browser_tests+0x420b476)
#3 base::Histogram::Factory::Build() base/metrics/histogram.cc:186:40 (browser_tests+0x4200db4)
#4 base::Histogram::FactoryGet(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, int, unsigned int, int) base/metrics/histogram.cc:253:63 (browser_tests+0x4201242)
#5 base::Histogram::FactoryGet(char const*, int, int, unsigned int, int) base/metrics/histogram.cc:271:10 (browser_tests+0x420195c)
#6 sql::(anonymous namespace)::Read(sqlite3_file*, void*, int, long long) sql/vfs_wrapper.cc:121:3 (browser_tests+0x6bd8a73)
#7 sqlite3OsRead third_party/sqlite/amalgamation/sqlite3.c:20727:10 (browser_tests+0x6c147ea)
#8 sqlite3PagerReadFileheader third_party/sqlite/amalgamation/sqlite3.c:51395 (browser_tests+0x6c147ea)
#9 sqlite3BtreeOpen third_party/sqlite/amalgamation/sqlite3.c:61996 (browser_tests+0x6c147ea)
#10 openDatabase third_party/sqlite/amalgamation/sqlite3.c:144719:8 (browser_tests+0x6c06478)
#11 sqlite3_open_v2 third_party/sqlite/amalgamation/sqlite3.c:144910:10 (browser_tests+0x6c074e0)
#12 sql::Connection::OpenInternal(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, sql::Connection::Retry) sql/connection.cc:1708:13 (browser_tests+0x6bcb08f)
#13 sql::Connection::Open(base::FilePath const&) sql/connection.cc:411:10 (browser_tests+0x6bcacd5)
#14 WebDatabase::Init(base::FilePath const&) components/webdata/common/web_database.cc:92:12 (browser_tests+0x729a13a)
#15 WebDatabaseBackend::LoadDatabaseIfNecessary() components/webdata/common/web_database_backend.cc:110:23 (browser_tests+0x729e60c)
#16 WebDatabaseBackend::InitDatabase() components/webdata/common/web_database_backend.cc:38:3 (browser_tests+0x729e36d)
#17 Invoke<const scoped_refptr<WebDatabaseBackend> &> base/bind_internal.h:196:12 (browser_tests+0x729c586)
#18 MakeItSo<void (WebDatabaseBackend::*const &)(), const scoped_refptr<WebDatabaseBackend> &> base/bind_internal.h:262 (browser_tests+0x729c586)
#19 RunImpl<void (WebDatabaseBackend::*const &)(), const std::__1::tuple<scoped_refptr<WebDatabaseBackend> > &, 0> base/bind_internal.h:338 (browser_tests+0x729c586)
#20 base::internal::Invoker<base::internal::BindState<void (WebDatabaseBackend::*)(), scoped_refptr<WebDatabaseBackend> >, void ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:316 (browser_tests+0x729c586)
#21 Run base/callback.h:91:12 (browser_tests+0x41b5b3a)
#22 base::debug::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/debug/task_annotator.cc:59 (browser_tests+0x41b5b3a)
#23 base::internal::TaskTracker::PerformRunTask(std::__1::unique_ptr<base::internal::Task, std::__1::default_delete<base::internal::Task> >, base::internal::Sequence*) base/task_scheduler/task_tracker.cc:335:28 (browser_tests+0x4265c89)
#24 base::internal::TaskTrackerPosix::PerformRunTask(std::__1::unique_ptr<base::internal::Task, std::__1::default_delete<base::internal::Task> >, base::internal::Sequence*) base/task_scheduler/task_tracker_posix.cc:22:16 (browser_tests+0x426662a)
#25 base::internal::TaskTracker::RunNextTask(base::internal::Sequence*) base/task_scheduler/task_tracker.cc:251:5 (browser_tests+0x4265113)
#26 base::internal::SchedulerWorker::Thread::ThreadMain() base/task_scheduler/scheduler_worker.cc:84:34 (browser_tests+0x42e85a4)
#27 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:71:13 (browser_tests+0x42725a8)
Mutex M125110181129911200 is already destroyed.
Thread T24 'Chrome_IOThread' (tid=25147, running) created by main thread at:
#0 pthread_create <null> (browser_tests+0x58da23)
#1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:110:13 (browser_tests+0x4271ee6)
#2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:193:10 (browser_tests+0x4271da5)
#3 base::Thread::StartWithOptions(base::Thread::Options const&) base/threading/thread.cc:112:15 (browser_tests+0x427d8d3)
#4 content::BrowserThreadImpl::StartWithOptions(base::Thread::Options const&) content/browser/browser_thread_impl.cc:404:25 (browser_tests+0x235a30a)
#5 content::BrowserMainLoop::CreateThreads() content/browser/browser_main_loop.cc:1111:49 (browser_tests+0x2343d87)
#6 Invoke<content::BrowserMainLoop *> base/bind_internal.h:196:12 (browser_tests+0x2349795)
#7 MakeItSo<int (content::BrowserMainLoop::*const &)(), content::BrowserMainLoop *> base/bind_internal.h:262 (browser_tests+0x2349795)
#8 RunImpl<int (content::BrowserMainLoop::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::BrowserMainLoop> > &, 0> base/bind_internal.h:338 (browser_tests+0x2349795)
#9 base::internal::Invoker<base::internal::BindState<int (content::BrowserMainLoop::*)(), base::internal::UnretainedWrapper<content::BrowserMainLoop> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:316 (browser_tests+0x2349795)
#10 Run base/callback.h:80:12 (browser_tests+0x29f8f4e)
#11 content::StartupTaskRunner::RunAllTasksNow() content/browser/startup_task_runner.cc:45 (browser_tests+0x29f8f4e)
#12 content::BrowserMainLoop::CreateStartupTasks() content/browser/browser_main_loop.cc:936:25 (browser_tests+0x234398b)
#13 content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) content/browser/browser_main_runner.cc:127:17 (browser_tests+0x234a145)
#14 content::BrowserMain(content::MainFunctionParams const&) content/browser/browser_main.cc:42:32 (browser_tests+0x23401a0)
#15 content::RunNamedProcessTypeMain(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:408:14 (browser_tests+0x4177da4)
#16 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:687:12 (browser_tests+0x4178af7)
#17 content::ContentServiceManagerMainDelegate::RunEmbedderProcess() content/app/content_service_manager_main_delegate.cc:51:32 (browser_tests+0x41765af)
#18 service_manager::Main(service_manager::MainParams const&) services/service_manager/embedder/main.cc:469:29 (browser_tests+0x6fc686a)
#19 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:19:10 (browser_tests+0x4176d4b)
#20 content::BrowserTestBase::SetUp() content/public/test/browser_test_base.cc:271:3 (browser_tests+0x4cd5996)
#21 InProcessBrowserTest::SetUp() chrome/test/base/in_process_browser_test.cc:271:20 (browser_tests+0x4318920)
#22 SetUp chrome/browser/extensions/extension_browsertest.cc:164:25 (browser_tests+0x1475aa4)
#23 virtual thunk to ExtensionBrowserTest::SetUp() chrome/browser/extensions/extension_browsertest.cc (browser_tests+0x1475aa4)
#24 HandleExceptionsInMethodIfSupported<testing::Test, void> third_party/googletest/src/googletest/src/gtest.cc:2455:12 (browser_tests+0x18d88b6)
#25 testing::Test::Run() third_party/googletest/src/googletest/src/gtest.cc:2467 (browser_tests+0x18d88b6)
#26 testing::TestInfo::Run() third_party/googletest/src/googletest/src/gtest.cc:2653:11 (browser_tests+0x18d98ad)
#27 testing::TestCase::Run() third_party/googletest/src/googletest/src/gtest.cc:2771:28 (browser_tests+0x18da0e6)
#28 testing::internal::UnitTestImpl::RunAllTests() third_party/googletest/src/googletest/src/gtest.cc:4648:43 (browser_tests+0x18e3426)
#29 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> third_party/googletest/src/googletest/src/gtest.cc:2455:12 (browser_tests+0x18e2e24)
#30 testing::UnitTest::Run() third_party/googletest/src/googletest/src/gtest.cc:4256 (browser_tests+0x18e2e24)
#31 RUN_ALL_TESTS third_party/googletest/src/googletest/include/gtest/gtest.h:2237:46 (browser_tests+0x4333b75)
#32 base::TestSuite::Run() base/test/test_suite.cc:270 (browser_tests+0x4333b75)
#33 ChromeTestSuiteRunner::RunTestSuite(int, char**) chrome/test/base/chrome_test_launcher.cc:68:38 (browser_tests+0x419f538)
#34 ChromeTestLauncherDelegate::RunTestSuite(int, char**) chrome/test/base/chrome_test_launcher.cc:77:19 (browser_tests+0x419f65f)
#35 content::LaunchTests(content::TestLauncherDelegate*, unsigned long, int, char**) content/public/test/test_launcher.cc:520:31 (browser_tests+0x4d32224)
#36 LaunchChromeTests(unsigned long, content::TestLauncherDelegate*, int, char**) chrome/test/base/chrome_test_launcher.cc:149:10 (browser_tests+0x419fac0)
#37 main chrome/test/base/browser_tests_main.cc:21:10 (browser_tests+0x419f3fa)
Thread T19 'TaskSchedulerSi' (tid=25142, running) created by main thread at:
#0 pthread_create <null> (browser_tests+0x58da23)
#1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:110:13 (browser_tests+0x4271ee6)
#2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:193:10 (browser_tests+0x4271da5)
#3 Initialize base/task_scheduler/scheduler_worker.cc:144:5 (browser_tests+0x42e81f1)
#4 base::internal::SchedulerWorker::Thread::Create(scoped_refptr<base::internal::SchedulerWorker>) base/task_scheduler/scheduler_worker.cc:31 (browser_tests+0x42e81f1)
#5 base::internal::SchedulerWorker::CreateThread() base/task_scheduler/scheduler_worker.cc:328:15 (browser_tests+0x42e7a1f)
#6 base::internal::SchedulerWorker::Start() base/task_scheduler/scheduler_worker.cc:236:5 (browser_tests+0x42e7976)
#7 CreateTaskRunnerWithTraitsImpl<base::internal::(anonymous namespace)::SchedulerWorkerDelegate> base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:453:13 (browser_tests+0x42e5b87)
#8 base::internal::SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, base::TaskTraits const&, base::SingleThreadTaskRunnerThreadMode) base/task_scheduler/scheduler_single_thread_task_runner_manager.cc:396 (browser_tests+0x42e5b87)
#9 base::internal::TaskSchedulerImpl::CreateSingleThreadTaskRunnerWithTraits(base::TaskTraits const&, base::SingleThreadTaskRunnerThreadMode) base/task_scheduler/task_scheduler_impl.cc:115:8 (browser_tests+0x4263f28)
#10 base::CreateSingleThreadTaskRunnerWithTraits(base::TaskTraits const&, base::SingleThreadTaskRunnerThreadMode) base/task_scheduler/post_task.cc:107:40 (browser_tests+0x4260ab8)
#11 content::BrowserMainLoop::CreateThreads() content/browser/browser_main_loop.cc:1128:33 (browser_tests+0x23444ec)
#12 Invoke<content::BrowserMainLoop *> base/bind_internal.h:196:12 (browser_tests+0x2349795)
#13 MakeItSo<int (content::BrowserMainLoop::*const &)(), content::BrowserMainLoop *> base/bind_internal.h:262 (browser_tests+0x2349795)
#14 RunImpl<int (content::BrowserMainLoop::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::BrowserMainLoop> > &, 0> base/bind_internal.h:338 (browser_tests+0x2349795)
#15 base::internal::Invoker<base::internal::BindState<int (content::BrowserMainLoop::*)(), base::internal::UnretainedWrapper<content::BrowserMainLoop> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:316 (browser_tests+0x2349795)
#16 Run base/callback.h:80:12 (browser_tests+0x29f8f4e)
#17 content::StartupTaskRunner::RunAllTasksNow() content/browser/startup_task_runner.cc:45 (browser_tests+0x29f8f4e)
#18 content::BrowserMainLoop::CreateStartupTasks() content/browser/browser_main_loop.cc:936:25 (browser_tests+0x234398b)
#19 content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) content/browser/browser_main_runner.cc:127:17 (browser_tests+0x234a145)
#20 content::BrowserMain(content::MainFunctionParams const&) content/browser/browser_main.cc:42:32 (browser_tests+0x23401a0)
#21 content::RunNamedProcessTypeMain(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, content::MainFunctionParams const&, content::ContentMainDelegate*) content/app/content_main_runner.cc:408:14 (browser_tests+0x4177da4)
#22 content::ContentMainRunnerImpl::Run() content/app/content_main_runner.cc:687:12 (browser_tests+0x4178af7)
#23 content::ContentServiceManagerMainDelegate::RunEmbedderProcess() content/app/content_service_manager_main_delegate.cc:51:32 (browser_tests+0x41765af)
#24 service_manager::Main(service_manager::MainParams const&) services/service_manager/embedder/main.cc:469:29 (browser_tests+0x6fc686a)
#25 content::ContentMain(content::ContentMainParams const&) content/app/content_main.cc:19:10 (browser_tests+0x4176d4b)
#26 content::BrowserTestBase::SetUp() content/public/test/browser_test_base.cc:271:3 (browser_tests+0x4cd5996)
#27 InProcessBrowserTest::SetUp() chrome/test/base/in_process_browser_test.cc:271:20 (browser_tests+0x4318920)
#28 SetUp chrome/browser/extensions/extension_browsertest.cc:164:25 (browser_tests+0x1475aa4)
#29 virtual thunk to ExtensionBrowserTest::SetUp() chrome/browser/extensions/extension_browsertest.cc (browser_tests+0x1475aa4)
#30 HandleExceptionsInMethodIfSupported<testing::Test, void> third_party/googletest/src/googletest/src/gtest.cc:2455:12 (browser_tests+0x18d88b6)
#31 testing::Test::Run() third_party/googletest/src/googletest/src/gtest.cc:2467 (browser_tests+0x18d88b6)
#32 testing::TestInfo::Run() third_party/googletest/src/googletest/src/gtest.cc:2653:11 (browser_tests+0x18d98ad)
#33 testing::TestCase::Run() third_party/googletest/src/googletest/src/gtest.cc:2771:28 (browser_tests+0x18da0e6)
#34 testing::internal::UnitTestImpl::RunAllTests() third_party/googletest/src/googletest/src/gtest.cc:4648:43 (browser_tests+0x18e3426)
#35 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> third_party/googletest/src/googletest/src/gtest.cc:2455:12 (browser_tests+0x18e2e24)
#36 testing::UnitTest::Run() third_party/googletest/src/googletest/src/gtest.cc:4256 (browser_tests+0x18e2e24)
#37 RUN_ALL_TESTS third_party/googletest/src/googletest/include/gtest/gtest.h:2237:46 (browser_tests+0x4333b75)
#38 base::TestSuite::Run() base/test/test_suite.cc:270 (browser_tests+0x4333b75)
#39 ChromeTestSuiteRunner::RunTestSuite(int, char**) chrome/test/base/chrome_test_launcher.cc:68:38 (browser_tests+0x419f538)
#40 ChromeTestLauncherDelegate::RunTestSuite(int, char**) chrome/test/base/chrome_test_launcher.cc:77:19 (browser_tests+0x419f65f)
#41 content::LaunchTests(content::TestLauncherDelegate*, unsigned long, int, char**) content/public/test/test_launcher.cc:520:31 (browser_tests+0x4d32224)
#42 LaunchChromeTests(unsigned long, content::TestLauncherDelegate*, int, char**) chrome/test/base/chrome_test_launcher.cc:149:10 (browser_tests+0x419fac0)
#43 main chrome/test/base/browser_tests_main.cc:21:10 (browser_tests+0x419f3fa)
SUMMARY: ThreadSanitizer: data race base/metrics/persistent_memory_allocator.cc:865:16 in GetBlock
Comment 1 by bugdroid1@chromium.org
, Aug 2 2017