Reland "[PM] Add the non recording site data cache."
There was a race around |g_use_in_memory_db_for_testing| : [ RUN ] NonRecordingSiteDataCacheTest.EndToEnd ================== WARNING: ThreadSanitizer: data race (pid=1484) Write of size 1 at 0x55e6654d29d0 by main thread: #0 ~AutoReset base/auto_reset.h:40:25 (unit_tests+0x42d690c) #1 operator() buildtools/third_party/libc++/trunk/include/memory:2338 (unit_tests+0x42d690c) #2 reset buildtools/third_party/libc++/trunk/include/memory:2651 (unit_tests+0x42d690c) #3 ~unique_ptr buildtools/third_party/libc++/trunk/include/memory:2605 (unit_tests+0x42d690c) #4 performance_manager::(anonymous namespace)::NonRecordingSiteDataCacheTest::~NonRecordingSiteDataCacheTest() chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc:30 (unit_tests+0x42d690c) #5 performance_manager::NonRecordingSiteDataCacheTest_EndToEnd_Test::~NonRecordingSiteDataCacheTest_EndToEnd_Test() chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc:66:1 (unit_tests+0x42d65d9) #6 HandleExceptionsInMethodIfSupported<testing::Test, void> third_party/googletest/src/googletest/src/gtest.cc (unit_tests+0x65f041e) #7 testing::TestInfo::Run() third_party/googletest/src/googletest/src/gtest.cc:2704 (unit_tests+0x65f041e) #8 testing::TestSuite::Run() third_party/googletest/src/googletest/src/gtest.cc:2828:28 (unit_tests+0x65f0ef6) #9 testing::internal::UnitTestImpl::RunAllTests() third_party/googletest/src/googletest/src/gtest.cc:5285:44 (unit_tests+0x6603366) #10 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> third_party/googletest/src/googletest/src/gtest.cc (unit_tests+0x6602859) #11 testing::UnitTest::Run() third_party/googletest/src/googletest/src/gtest.cc:4873 (unit_tests+0x6602859) #12 RUN_ALL_TESTS third_party/googletest/src/googletest/include/gtest/gtest.h:2453:46 (unit_tests+0x9dd5692) #13 base::TestSuite::Run() base/test/test_suite.cc:316 (unit_tests+0x9dd5692) #14 content::UnitTestTestSuite::Run() content/public/test/unittest_test_suite.cc:103:23 (unit_tests+0x9ee213f) #15 Invoke<int (content::UnitTestTestSuite::*)(), content::UnitTestTestSuite *> base/bind_internal.h:499:12 (unit_tests+0x9dc3168) #16 MakeItSo<int (content::UnitTestTestSuite::*const &)(), content::UnitTestTestSuite *> base/bind_internal.h:599 (unit_tests+0x9dc3168) #17 RunImpl<int (content::UnitTestTestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::UnitTestTestSuite> > &, 0> base/bind_internal.h:672 (unit_tests+0x9dc3168) #18 base::internal::Invoker<base::internal::BindState<int (content::UnitTestTestSuite::*)(), base::internal::UnretainedWrapper<content::UnitTestTestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:654 (unit_tests+0x9dc3168) #19 Run base/callback.h:97:12 (unit_tests+0x9ddf24b) #20 base::(anonymous namespace)::LaunchUnitTestsInternal(base::OnceCallback<int ()>, unsigned long, int, bool, base::OnceCallback<void ()>) base/test/launcher/unit_test_launcher.cc:158 (unit_tests+0x9ddf24b) #21 base::LaunchUnitTests(int, char**, base::OnceCallback<int ()>) base/test/launcher/unit_test_launcher.cc:494:10 (unit_tests+0x9ddf0b0) #22 main chrome/test/base/run_all_unittests.cc:35:10 (unit_tests+0x9dc3099) Previous read of size 1 at 0x55e6654d29d0 by thread T18: #0 performance_manager::LevelDBSiteDataStore::AsyncHelper::OpenOrCreateDatabaseImpl() chrome/browser/performance_manager/persistence/site_data/leveldb_site_data_store.cc:374:7 (unit_tests+0xb3e7762) #1 performance_manager::LevelDBSiteDataStore::AsyncHelper::OpenOrCreateDatabase() chrome/browser/performance_manager/persistence/site_data/leveldb_site_data_store.cc:195:30 (unit_tests+0xb3e7394) #2 Invoke<void (performance_manager::LevelDBSiteDataStore::AsyncHelper::*)(), performance_manager::LevelDBSiteDataStore::AsyncHelper *> base/bind_internal.h:499:12 (unit_tests+0xb3e9608) #3 MakeItSo<void (performance_manager::LevelDBSiteDataStore::AsyncHelper::*)(), performance_manager::LevelDBSiteDataStore::AsyncHelper *> base/bind_internal.h:599 (unit_tests+0xb3e9608) #4 RunImpl<void (performance_manager::LevelDBSiteDataStore::AsyncHelper::*)(), std::__1::tuple<base::internal::UnretainedWrapper<performance_manager::LevelDBSiteDataStore::AsyncHelper> >, 0> base/bind_internal.h:672 (unit_tests+0xb3e9608) #5 base::internal::Invoker<base::internal::BindState<void (performance_manager::LevelDBSiteDataStore::AsyncHelper::*)(), base::internal::UnretainedWrapper<performance_manager::LevelDBSiteDataStore::AsyncHelper> >, void ()>::RunOnce(base::internal::BindStateBase*) base/bind_internal.h:641 (unit_tests+0xb3e9608) #6 Run base/callback.h:97:12 (unit_tests+0xacb91d5) #7 base::TaskAnnotator::RunTask(char const*, base::PendingTask*) base/task/common/task_annotator.cc:142 (unit_tests+0xacb91d5) #8 base::internal::TaskTracker::RunBlockShutdown(base::internal::Task*) base/task/thread_pool/task_tracker.cc:773:19 (unit_tests+0xacdde01) #9 RunTaskWithShutdownBehavior base/task/thread_pool/task_tracker.cc:788:7 (unit_tests+0xacdd825) #10 base::internal::TaskTracker::RunOrSkipTask(base::internal::Task, base::internal::TaskSource*, base::TaskTraits const&, bool) base/task/thread_pool/task_tracker.cc:617 (unit_tests+0xacdd825) #11 base::internal::TaskTrackerPosix::RunOrSkipTask(base::internal::Task, base::internal::TaskSource*, base::TaskTraits const&, bool) base/task/thread_pool/task_tracker_posix.cc:24:16 (unit_tests+0xad5bfc4) #12 base::test::ScopedTaskEnvironment::TestTaskTracker::RunOrSkipTask(base::internal::Task, base::internal::TaskSource*, base::TaskTraits const&, bool) base/test/scoped_task_environment.cc:663:46 (unit_tests+0x9dd0a08) #13 base::internal::TaskTracker::RunAndPopNextTask(base::internal::RegisteredTaskSource) base/task/thread_pool/task_tracker.cc:479:5 (unit_tests+0xacdd119) #14 base::internal::WorkerThread::RunWorker() base/task/thread_pool/worker_thread.cc:320:34 (unit_tests+0xacf08cd) #15 base::internal::WorkerThread::RunPooledWorker() base/task/thread_pool/worker_thread.cc:222:3 (unit_tests+0xacf0561) #16 base::internal::WorkerThread::ThreadMain() base/task/thread_pool/worker_thread.cc:201:7 (unit_tests+0xacf03cf) #17 base::(anonymous namespace)::ThreadFunc(void*) base/threading/platform_thread_posix.cc:81:13 (unit_tests+0xad5cbb4) Location is global 'performance_manager::(anonymous namespace)::g_use_in_memory_db_for_testing' of size 1 at 0x55e6654d29d0 (unit_tests+0x0000132b39d0) Thread T18 'ThreadPoolForeg' (tid=1837, running) created by main thread at: #0 pthread_create /b/swarming/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:989:3 (unit_tests+0x3bd013b) #1 base::(anonymous namespace)::CreateThread(unsigned long, bool, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:120:13 (unit_tests+0xad5c5c7) #2 base::PlatformThread::CreateWithPriority(unsigned long, base::PlatformThread::Delegate*, base::PlatformThreadHandle*, base::ThreadPriority) base/threading/platform_thread_posix.cc:246:10 (unit_tests+0xad5c4c5) #3 base::internal::WorkerThread::Start(base::WorkerThreadObserver*) base/task/thread_pool/worker_thread.cc:68:3 (unit_tests+0xaceff6d) #4 operator() base/task/thread_pool/thread_group_impl.cc:185:15 (unit_tests+0xace7e06) #5 ForEachWorker<(lambda at ../../base/task/thread_pool/thread_group_impl.cc:184:37)> base/task/thread_pool/thread_group_impl.cc:150 (unit_tests+0xace7e06) #6 base::internal::ThreadGroupImpl::ScopedWorkersExecutor::FlushImpl() base/task/thread_pool/thread_group_impl.cc:184 (unit_tests+0xace7e06) #7 base::internal::ThreadGroupImpl::ScopedWorkersExecutor::~ScopedWorkersExecutor() base/task/thread_pool/thread_group_impl.cc:103:30 (unit_tests+0xace47f4) #8 base::internal::ThreadGroupImpl::Start(int, int, base::TimeDelta, scoped_refptr<base::TaskRunner>, base::WorkerThreadObserver*, base::internal::ThreadGroup::WorkerEnvironment, base::Optional<base::TimeDelta>) base/task/thread_pool/thread_group_impl.cc:425:1 (unit_tests+0xace4799) #9 base::internal::ThreadPoolImpl::Start(base::ThreadPoolInstance::InitParams const&, base::WorkerThreadObserver*) base/task/thread_pool/thread_pool_impl.cc:197:11 (unit_tests+0xace0133) #10 base::test::ScopedTaskEnvironment::InitializeThreadPool() base/test/scoped_task_environment.cc:391:30 (unit_tests+0x9dcf8fc) #11 base::test::ScopedTaskEnvironment::ScopedTaskEnvironment(base::test::ScopedTaskEnvironment::MainThreadType, base::test::ScopedTaskEnvironment::ThreadPoolExecutionMode, base::test::ScopedTaskEnvironment::NowSource, base::test::ScopedTaskEnvironment::ThreadingMode, bool, base::trait_helpers::NotATraitTag) base/test/scoped_task_environment.cc:348:5 (unit_tests+0x9dcf2bc) #12 base::test::ScopedTaskEnvironment::ScopedTaskEnvironment<base::test::ScopedTaskEnvironment::SubclassCreatesDefaultTaskRunner, base::test::ScopedTaskEnvironment::MainThreadType, void>(base::test::ScopedTaskEnvironment::SubclassCreatesDefaultTaskRunner, base::test::ScopedTaskEnvironment::MainThreadType) base/test/scoped_task_environment.h:161:9 (unit_tests+0x3c4e2f0) #13 content::TestBrowserThreadBundle::TestBrowserThreadBundle<void>() content/public/test/test_browser_thread_bundle.h:131:13 (unit_tests+0x3c4e287) #14 performance_manager::(anonymous namespace)::NonRecordingSiteDataCacheTest::NonRecordingSiteDataCacheTest() chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc:23:3 (unit_tests+0x42d6a76) #15 NonRecordingSiteDataCacheTest_EndToEnd_Test chrome/browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc:66:1 (unit_tests+0x42d69d4) #16 testing::internal::TestFactoryImpl<performance_manager::NonRecordingSiteDataCacheTest_EndToEnd_Test>::CreateTest() third_party/googletest/src/googletest/include/gtest/internal/gtest-internal.h:460 (unit_tests+0x42d69d4) #17 HandleExceptionsInMethodIfSupported<testing::internal::TestFactoryBase, testing::Test *> third_party/googletest/src/googletest/src/gtest.cc (unit_tests+0x65f01df) #18 testing::TestInfo::Run() third_party/googletest/src/googletest/src/gtest.cc:2688 (unit_tests+0x65f01df) #19 testing::TestSuite::Run() third_party/googletest/src/googletest/src/gtest.cc:2828:28 (unit_tests+0x65f0ef6) #20 testing::internal::UnitTestImpl::RunAllTests() third_party/googletest/src/googletest/src/gtest.cc:5285:44 (unit_tests+0x6603366) #21 HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> third_party/googletest/src/googletest/src/gtest.cc (unit_tests+0x6602859) #22 testing::UnitTest::Run() third_party/googletest/src/googletest/src/gtest.cc:4873 (unit_tests+0x6602859) #23 RUN_ALL_TESTS third_party/googletest/src/googletest/include/gtest/gtest.h:2453:46 (unit_tests+0x9dd5692) #24 base::TestSuite::Run() base/test/test_suite.cc:316 (unit_tests+0x9dd5692) #25 content::UnitTestTestSuite::Run() content/public/test/unittest_test_suite.cc:103:23 (unit_tests+0x9ee213f) #26 Invoke<int (content::UnitTestTestSuite::*)(), content::UnitTestTestSuite *> base/bind_internal.h:499:12 (unit_tests+0x9dc3168) #27 MakeItSo<int (content::UnitTestTestSuite::*const &)(), content::UnitTestTestSuite *> base/bind_internal.h:599 (unit_tests+0x9dc3168) #28 RunImpl<int (content::UnitTestTestSuite::*const &)(), const std::__1::tuple<base::internal::UnretainedWrapper<content::UnitTestTestSuite> > &, 0> base/bind_internal.h:672 (unit_tests+0x9dc3168) #29 base::internal::Invoker<base::internal::BindState<int (content::UnitTestTestSuite::*)(), base::internal::UnretainedWrapper<content::UnitTestTestSuite> >, int ()>::Run(base::internal::BindStateBase*) base/bind_internal.h:654 (unit_tests+0x9dc3168) #30 Run base/callback.h:97:12 (unit_tests+0x9ddf24b) #31 base::(anonymous namespace)::LaunchUnitTestsInternal(base::OnceCallback<int ()>, unsigned long, int, bool, base::OnceCallback<void ()>) base/test/launcher/unit_test_launcher.cc:158 (unit_tests+0x9ddf24b) #32 base::LaunchUnitTests(int, char**, base::OnceCallback<int ()>) base/test/launcher/unit_test_launcher.cc:494:10 (unit_tests+0x9ddf0b0) #33 main chrome/test/base/run_all_unittests.cc:35:10 (unit_tests+0x9dc3099) The problem is that opening the DB (in LevelDBSiteDataStore::AsyncHelper::OpenOrCreateDatabaseImpl) is done asynchronously, and by the time we get there the AutoReset might have been destroyed. Waiting for the DB to be initialized fixes this. This reverts commit b7310e3f. Bug: 961336 Change-Id: Ia7d9367b10857837340358d7a516c26b87d0cebf Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1682668Reviewed-by:Chris Hamilton <chrisha@chromium.org> Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org> Cr-Commit-Position: refs/heads/master@{#676639}
Showing
Please register or sign in to comment