• Sebastien Marchand's avatar
    Reland "[PM] Add the non recording site data cache." · 9b7327b0
    Sebastien Marchand authored
    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: default avatarChris Hamilton <chrisha@chromium.org>
    Commit-Queue: Sébastien Marchand <sebmarchand@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#676639}
    9b7327b0
BUILD.gn 319 KB