Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data race on transaction commit after sync client shutdown #6844

Closed
kiburtse opened this issue Jul 31, 2023 · 5 comments · Fixed by #7338
Closed

Data race on transaction commit after sync client shutdown #6844

kiburtse opened this issue Jul 31, 2023 · 5 comments · Fixed by #7338
Assignees

Comments

@kiburtse
Copy link
Contributor

Expected results

No tsan warning

Actual Results

Thread Sanitizer reports data race like this:

WARNING: ThreadSanitizer: data race (pid=70287)
  Read of size 1 at 0x00010782e442 by thread T7494 (mutexes: write M0):
    #0 realm::sync::SessionWrapper::nonsync_transact_notify(unsigned long long) client.cpp:1412 (realm-object-store-tests:arm64+0x1014a9f5c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #1 realm::sync::Session::nonsync_transact_notify(unsigned long long) client.cpp:2176 (realm-object-store-tests:arm64+0x1014adfac) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #2 realm::SyncSession::nonsync_transact_notify(unsigned long long) sync_session.cpp:1054 (realm-object-store-tests:arm64+0x1012cf1c0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #3 realm::_impl::RealmCoordinator::commit_write(realm::Realm&, bool) realm_coordinator.cpp:785 (realm-object-store-tests:arm64+0x10127ab88) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #4 realm::Realm::commit_transaction() shared_realm.cpp:1030 (realm-object-store-tests:arm64+0x10124d5b0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #5 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1278 (realm-object-store-tests:arm64+0x1013230f4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #6 __tsan::invoke_and_release_block(void*) <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x8bd7c) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #7 _dispatch_client_callout <null>:90243248 (libdispatch.dylib:arm64e+0x43fc) (BuildId: c2fd3094b46539a4b77416583ff53c4b32000000200000000100000000040d00)

  Previous write of size 1 at 0x00010782e442 by thread T8209:
    #0 realm::sync::SessionWrapper::force_close() client.cpp:1685 (realm-object-store-tests:arm64+0x1014a359c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #1 realm::sync::ClientImpl::Session::force_close() client.cpp:750 (realm-object-store-tests:arm64+0x1014a350c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #2 realm::sync::ClientImpl::Connection::force_close() client_impl_base.cpp:435 (realm-object-store-tests:arm64+0x101455b28) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #3 realm::sync::ClientImpl::drain_connections() client_impl_base.cpp:260 (realm-object-store-tests:arm64+0x101455688) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #4 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::drain_connections_on_loop()::$_3>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x1014b0174) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #5 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::post(realm::util::UniqueFunction<void (realm::Status)>&&)::$_1>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x101466fcc) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #6 realm::sync::network::Service::PostOper<realm::util::UniqueFunction<void (realm::Status)>>::recycle_and_execute() network.hpp:2015 (realm-object-store-tests:arm64+0x10150f7e4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #7 realm::sync::network::Service::Impl::run_impl(bool) network.cpp:1574 (realm-object-store-tests:arm64+0x101522494) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #8 realm::sync::network::Service::run_until_stopped() network.cpp:1776 (realm-object-store-tests:arm64+0x10151e0f4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #9 realm::sync::websocket::DefaultSocketProvider::event_loop() default_socket.cpp:580 (realm-object-store-tests:arm64+0x10150e224) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #10 void* std::__1::__thread_proxy[abi:v15006]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*>>(void*) thread:301 (realm-object-store-tests:arm64+0x101510a40) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)

  Location is heap block of size 712 at 0x00010782e200 allocated by thread T7494:
    #0 operator new(unsigned long) <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x8fec0) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #1 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2140 (realm-object-store-tests:arm64+0x1014ad820) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #2 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2138 (realm-object-store-tests:arm64+0x1014adad0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #3 std::__1::__unique_if<realm::sync::Session>::__unique_single std::__1::make_unique[abi:v15006]<realm::sync::Session, realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config>(realm::sync::Client&, std::__1::shared_ptr<realm::DB>&&, std::__1::shared_ptr<realm::sync::SubscriptionStore>&&, std::__1::shared_ptr<realm::sync::MigrationStore>&&, realm::sync::Session::Config&&) unique_ptr.h:714 (realm-object-store-tests:arm64+0x1012d5810) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #4 realm::SyncSession::create_sync_session() sync_session.cpp:975 (realm-object-store-tests:arm64+0x1012c611c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #5 realm::SyncSession::become_active() sync_session.cpp:111 (realm-object-store-tests:arm64+0x1012c4fcc) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #6 realm::SyncSession::do_revive(realm::util::CheckedUniqueLock&&) sync_session.cpp:1143 (realm-object-store-tests:arm64+0x1012cf360) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #7 realm::SyncSession::revive_if_needed() sync_session.cpp:1074 (realm-object-store-tests:arm64+0x1012ccc6c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #8 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&) realm_coordinator.cpp:347 (realm-object-store-tests:arm64+0x101276b0c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #9 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1012764c0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #10 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:161 (realm-object-store-tests:arm64+0x101247c54) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #11 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1278 (realm-object-store-tests:arm64+0x1013224fc) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #12 __tsan::invoke_and_release_block(void*) <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x8bd7c) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #13 _dispatch_client_callout <null>:90209168 (libdispatch.dylib:arm64e+0x43fc) (BuildId: c2fd3094b46539a4b77416583ff53c4b32000000200000000100000000040d00)

  Mutex M0 (0x00010830be48) created at:
    #0 pthread_mutex_lock <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x42dc4) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #1 std::__1::mutex::lock() <null>:91226656 (libc++.1.dylib:arm64e+0x14f6c) (BuildId: 54e8fbe1df0d33a2b8fa356565c1292932000000200000000100000000040d00)
    #2 realm::_impl::RealmCoordinator::init_external_helpers() realm_coordinator.cpp:545 (realm-object-store-tests:arm64+0x10127840c) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #3 realm::_impl::RealmCoordinator::open_db() realm_coordinator.cpp:515 (realm-object-store-tests:arm64+0x101275960) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #4 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&) realm_coordinator.cpp:324 (realm-object-store-tests:arm64+0x101276694) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #5 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1012764c0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #6 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:161 (realm-object-store-tests:arm64+0x101247c54) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #7 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1278 (realm-object-store-tests:arm64+0x1013224fc) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #8 __tsan::invoke_and_release_block(void*) <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x8bd7c) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #9 _dispatch_client_callout <null>:90243248 (libdispatch.dylib:arm64e+0x43fc) (BuildId: c2fd3094b46539a4b77416583ff53c4b32000000200000000100000000040d00)

  Thread T7494 (tid=4326503, running) is a GCD worker thread

  Thread T8209 (tid=4327301, running) created by main thread at:
    #0 pthread_create <null>:101712992 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2fd88) (BuildId: 981013a59ee23029b2ed90b76951327532000000200000000100000000000b00)
    #1 std::__1::thread::thread<void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*, void>(void (realm::sync::websocket::DefaultSocketProvider::*&&)(), realm::sync::websocket::DefaultSocketProvider*&&) thread:317 (realm-object-store-tests:arm64+0x101510908) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #2 realm::sync::websocket::DefaultSocketProvider::start() default_socket.cpp:524 (realm-object-store-tests:arm64+0x10150dcb4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #3 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:495 (realm-object-store-tests:arm64+0x10150dae4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #4 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:491 (realm-object-store-tests:arm64+0x10150dde4) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #5 std::__1::shared_ptr<realm::sync::websocket::DefaultSocketProvider> std::__1::allocate_shared[abi:v15006]<realm::sync::websocket::DefaultSocketProvider, std::__1::allocator<realm::sync::websocket::DefaultSocketProvider>, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, void>(std::__1::allocator<realm::sync::websocket::DefaultSocketProvider> const&, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&&, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&) shared_ptr.h:953 (realm-object-store-tests:arm64+0x1012c47f8) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #6 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>)::'lambda'()::operator()() const sync_client.hpp:55 (realm-object-store-tests:arm64+0x1012c3ed0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #7 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>) sync_client.hpp:46 (realm-object-store-tests:arm64+0x1012c37ec) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #8 realm::SyncManager::create_sync_client() const sync_manager.cpp:782 (realm-object-store-tests:arm64+0x1012bf834) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #9 realm::SyncManager::get_sync_client() const sync_manager.cpp:776 (realm-object-store-tests:arm64+0x1012bf254) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #10 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:400 (realm-object-store-tests:arm64+0x100dc0060) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #11 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:382 (realm-object-store-tests:arm64+0x100dc0254) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #12 CATCH2_INTERNAL_TEST_46() audit.cpp:1084 (realm-object-store-tests:arm64+0x10110a4cc) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #13 CATCH2_INTERNAL_TEST_46() audit.cpp:1081 (realm-object-store-tests:arm64+0x10110a3b0) (BuildId: 65a360433224325186a5cb8fc4b1f6dc32000000200000000100000000000d00)
    #14 <null> <null> (0x000199adbf28)

SUMMARY: ThreadSanitizer: data race client.cpp:1412 in realm::sync::SessionWrapper::nonsync_transact_notify(unsigned long long)

Steps & Code to Reproduce

Happened a few times during object store tests run. Didn't manage to reproduce this, but probably related to network connection loss during testing. All test cases still pass.

Core version

Core version: 13.17.0

@kiburtse
Copy link
Contributor Author

@michael-wb @jbreams does this look wrong? In #6293 shouldn't access to SessionWrapper be guarded?

@jbreams
Copy link
Contributor

jbreams commented Jul 31, 2023

Yeah, I think the only thing that's really safe to do from outside the event loop is put a bind_ptr to the SessionWrapper in the list of sessions to finalize or actualize.

@kiburtse
Copy link
Contributor Author

It actually also happens just during local run of object store tests when "no_sessions" assertion is hit from #6271 (which was presumably fixed but is still happening). Discovered here #6911 with new added tsan builders for macos. That is what i see also on local macos setup.

Is this really a serious issue? Could this lead to some serious problems with data consistency in the process?

@kiburtse
Copy link
Contributor Author

kiburtse commented Nov 3, 2023

one more situation when this happens on force_close although also through commit_write:

WARNING: ThreadSanitizer: data race (pid=43371)
  Read of size 1 at 0x000109907a3a by thread T5 (mutexes: write M0, write M1):
    #0 realm::sync::SessionWrapper::on_commit(unsigned long long) client.cpp:1277 (realm-object-store-tests:arm64+0x1018a318c)
    #1 non-virtual thunk to realm::sync::SessionWrapper::on_commit(unsigned long long) client.cpp (realm-object-store-tests:arm64+0x1018a32d0)
    #2 realm::DB::do_commit(realm::Transaction&, bool) db.cpp:2436 (realm-object-store-tests:arm64+0x101a4c0a0)
    #3 realm::Transaction::commit_and_continue_as_read(bool) transaction.cpp:220 (realm-object-store-tests:arm64+0x101b5afe8)
    #4 realm::_impl::RealmCoordinator::commit_write(realm::Realm&, bool) realm_coordinator.cpp:759 (realm-object-store-tests:arm64+0x10164a488)
    #5 realm::Realm::commit_transaction() shared_realm.cpp:1055 (realm-object-store-tests:arm64+0x10160e294)
    #6 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x1016efb30)
    #7 __tsan::invoke_and_release_block(void*) <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #8 _dispatch_client_callout <null>:64391236 (libdispatch.dylib:arm64e+0x43fc)

  Previous write of size 1 at 0x000109907a3a by thread T242:
    #0 realm::sync::SessionWrapper::force_close() client.cpp:1558 (realm-object-store-tests:arm64+0x10189dd3c)
    #1 realm::sync::ClientImpl::Session::force_close() client.cpp:656 (realm-object-store-tests:arm64+0x10189dcd4)
    #2 realm::sync::ClientImpl::Connection::force_close() client_impl_base.cpp:436 (realm-object-store-tests:arm64+0x101849be8)
    #3 realm::sync::ClientImpl::drain_connections() client_impl_base.cpp:261 (realm-object-store-tests:arm64+0x10184984c)
    #4 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::drain_connections_on_loop()::$_3>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x1018a76bc)
    #5 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::post(realm::util::UniqueFunction<void (realm::Status)>&&)::$_1>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x10185bd48)
    #6 realm::sync::network::Service::PostOper<realm::util::UniqueFunction<void (realm::Status)>>::recycle_and_execute() network.hpp:2015 (realm-object-store-tests:arm64+0x10103b8fc)
    #7 realm::sync::network::Service::Impl::run_impl(bool) network.cpp:1574 (realm-object-store-tests:arm64+0x10190a118)
    #8 realm::sync::network::Service::run_until_stopped() network.cpp:1776 (realm-object-store-tests:arm64+0x1019066b8)
    #9 realm::sync::websocket::DefaultSocketProvider::event_loop() default_socket.cpp:619 (realm-object-store-tests:arm64+0x1018f8c18)
    #10 void* std::__1::__thread_proxy[abi:v160006]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*>>(void*) thread:299 (realm-object-store-tests:arm64+0x1018fa340)

  Location is heap block of size 704 at 0x000109907800 allocated by thread T5:
    #0 operator new(unsigned long) <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x83de0)
    #1 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2024 (realm-object-store-tests:arm64+0x1018a6234)
    #2 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2022 (realm-object-store-tests:arm64+0x1018a64c0)
    #3 std::__1::__unique_if<realm::sync::Session>::__unique_single std::__1::make_unique[abi:v160006]<realm::sync::Session, realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config>(realm::sync::Client&, std::__1::shared_ptr<realm::DB>&&, std::__1::shared_ptr<realm::sync::SubscriptionStore>&&, std::__1::shared_ptr<realm::sync::MigrationStore>&&, realm::sync::Session::Config&&) unique_ptr.h:686 (realm-object-store-tests:arm64+0x1016a1e48)
    #4 realm::SyncSession::create_sync_session() sync_session.cpp:919 (realm-object-store-tests:arm64+0x101694324)
    #5 realm::SyncSession::become_active() sync_session.cpp:111 (realm-object-store-tests:arm64+0x1016932fc)
    #6 realm::SyncSession::do_revive(realm::util::CheckedUniqueLock&&) sync_session.cpp:1068 (realm-object-store-tests:arm64+0x10169cbc0)
    #7 realm::SyncSession::revive_if_needed() sync_session.cpp:999 (realm-object-store-tests:arm64+0x10169a7e4)
    #8 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:349 (realm-object-store-tests:arm64+0x101646934)
    #9 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x10164626c)
    #10 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:161 (realm-object-store-tests:arm64+0x101608284)
    #11 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x1016eed68)
    #12 __tsan::invoke_and_release_block(void*) <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #13 _dispatch_client_callout <null>:64391236 (libdispatch.dylib:arm64e+0x43fc)

  Mutex M0 (0x0001081116c8) created at:
    #0 pthread_mutex_lock <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x3c94c)
    #1 std::__1::mutex::lock() <null>:64391236 (libc++.1.dylib:arm64e+0x14f6c)
    #2 realm::Realm::do_refresh() shared_realm.cpp:1316 (realm-object-store-tests:arm64+0x1016096e4)
    #3 realm::Realm::get_full_schema() shared_realm.cpp:338 (realm-object-store-tests:arm64+0x1016093dc)
    #4 realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool) shared_realm.cpp:431 (realm-object-store-tests:arm64+0x10160a380)
    #5 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:373 (realm-object-store-tests:arm64+0x101646db8)
    #6 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x10164626c)
    #7 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:161 (realm-object-store-tests:arm64+0x101608284)
    #8 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x1016eed68)
    #9 __tsan::invoke_and_release_block(void*) <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #10 _dispatch_client_callout <null>:64391236 (libdispatch.dylib:arm64e+0x43fc)

  Mutex M1 (0x000109207758) created at:
    #0 pthread_mutex_lock <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x3c94c)
    #1 std::__1::mutex::lock() <null>:64391236 (libc++.1.dylib:arm64e+0x14f6c)
    #2 realm::_impl::RealmCoordinator::init_external_helpers() realm_coordinator.cpp:552 (realm-object-store-tests:arm64+0x101648058)
    #3 realm::_impl::RealmCoordinator::open_db() realm_coordinator.cpp:525 (realm-object-store-tests:arm64+0x101645864)
    #4 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:325 (realm-object-store-tests:arm64+0x101646478)
    #5 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x10164626c)
    #6 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:161 (realm-object-store-tests:arm64+0x101608284)
    #7 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x1016eed68)
    #8 __tsan::invoke_and_release_block(void*) <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #9 _dispatch_client_callout <null>:64391236 (libdispatch.dylib:arm64e+0x43fc)

  Thread T5 (tid=1526892, running) is a GCD worker thread

  Thread T242 (tid=1527133, running) created by main thread at:
    #0 pthread_create <null>:64391236 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2ffec)
    #1 std::__1::thread::thread<void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*, void>(void (realm::sync::websocket::DefaultSocketProvider::*&&)(), realm::sync::websocket::DefaultSocketProvider*&&) thread:315 (realm-object-store-tests:arm64+0x1018fa22c)
    #2 realm::sync::websocket::DefaultSocketProvider::start() default_socket.cpp:544 (realm-object-store-tests:arm64+0x1018f8710)
    #3 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:515 (realm-object-store-tests:arm64+0x1018f8570)
    #4 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:511 (realm-object-store-tests:arm64+0x1018f882c)
    #5 std::__1::shared_ptr<realm::sync::websocket::DefaultSocketProvider> std::__1::allocate_shared[abi:v160006]<realm::sync::websocket::DefaultSocketProvider, std::__1::allocator<realm::sync::websocket::DefaultSocketProvider>, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, void>(std::__1::allocator<realm::sync::websocket::DefaultSocketProvider> const&, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&&, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&) shared_ptr.h:995 (realm-object-store-tests:arm64+0x101692bb8)
    #6 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>)::'lambda'()::operator()() const sync_client.hpp:55 (realm-object-store-tests:arm64+0x101692290)
    #7 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>) sync_client.hpp:46 (realm-object-store-tests:arm64+0x101691c00)
    #8 realm::SyncManager::create_sync_client() const sync_manager.cpp:741 (realm-object-store-tests:arm64+0x10168dc18)
    #9 realm::SyncManager::get_sync_client() const sync_manager.cpp:735 (realm-object-store-tests:arm64+0x10168d6b4)
    #10 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:447 (realm-object-store-tests:arm64+0x100f2d4c0)
    #11 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:429 (realm-object-store-tests:arm64+0x100f2d74c)
    #12 CATCH2_INTERNAL_TEST_46() audit.cpp:1065 (realm-object-store-tests:arm64+0x1014d65e8)
    #13 CATCH2_INTERNAL_TEST_46() audit.cpp:1062 (realm-object-store-tests:arm64+0x1014d64d8)
    #14 Catch::RunContext::runCurrentTest(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>>&) catch_run_context.cpp:501 (realm-object-store-tests:arm64+0x10156bf2c)
    #15 Catch::RunContext::runTest(Catch::TestCaseHandle const&) catch_run_context.cpp:232 (realm-object-store-tests:arm64+0x10156b84c)
    #16 Catch::(anonymous namespace)::TestGroup::execute() catch_session.cpp:110 (realm-object-store-tests:arm64+0x1015357cc)
    #17 Catch::Session::runInternal() catch_session.cpp:332 (realm-object-store-tests:arm64+0x101534a68)
    #18 Catch::Session::run() catch_session.cpp:263 (realm-object-store-tests:arm64+0x101534200)
    #19 main main.cpp:87 (realm-object-store-tests:arm64+0x100421218)

SUMMARY: ThreadSanitizer: data race client.cpp:1277 in realm::sync::SessionWrapper::on_commit(unsigned long long)

@sync-by-unito sync-by-unito bot assigned jbreams and unassigned michael-wb Nov 29, 2023
@kiburtse
Copy link
Contributor Author

One more possible scenario where this could be an issue:

SessionWrapper::on_commit and ClientImpl::actualize_and_finalize_session_wrappers
WARNING: ThreadSanitizer: data race (pid=93717)
  Read of size 1 at 0x00010b72093a by thread T649 (mutexes: write M0, write M1):
    #0 realm::sync::SessionWrapper::on_commit(unsigned long long) client.cpp:1279 (realm-object-store-tests:arm64+0x1018aa064)
    #1 non-virtual thunk to realm::sync::SessionWrapper::on_commit(unsigned long long) client.cpp (realm-object-store-tests:arm64+0x1018aa1a8)
    #2 realm::DB::do_commit(realm::Transaction&, bool) db.cpp:2439 (realm-object-store-tests:arm64+0x101a53d90)
    #3 realm::Transaction::commit_and_continue_as_read(bool) transaction.cpp:220 (realm-object-store-tests:arm64+0x101b70d88)
    #4 realm::_impl::RealmCoordinator::commit_write(realm::Realm&, bool) realm_coordinator.cpp:762 (realm-object-store-tests:arm64+0x1016a73b4)
    #5 realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool) shared_realm.cpp:543 (realm-object-store-tests:arm64+0x1016658c0)
    #6 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:373 (realm-object-store-tests:arm64+0x1016a3ca0)
    #7 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1016a3154)
    #8 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:164 (realm-object-store-tests:arm64+0x101663100)
    #9 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x10173c1fc)
    #10 __tsan::invoke_and_release_block(void*) <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #11 _dispatch_client_callout <null>:97126468 (libdispatch.dylib:arm64e+0x43fc)

  Previous write of size 1 at 0x00010b72093a by thread T8747:
    #0 realm::sync::ClientImpl::actualize_and_finalize_session_wrappers() client.cpp:565 (realm-object-store-tests:arm64+0x1018a2fe4)
    #1 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::ClientImpl(realm::sync::ClientConfig)::$_0>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x101865030)
    #2 realm::sync::Trigger<realm::sync::ClientImpl>::trigger()::'lambda'(realm::Status)::operator()(realm::Status) const trigger.hpp:138 (realm-object-store-tests:arm64+0x1018645cc)
    #3 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::Trigger<realm::sync::ClientImpl>::trigger()::'lambda'(realm::Status)>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x101864464)
    #4 realm::util::UniqueFunction<void (realm::Status)>::SpecificImpl<realm::sync::ClientImpl::post(realm::util::UniqueFunction<void (realm::Status)>&&)::$_1>::call(realm::Status&&) functional.hpp:154 (realm-object-store-tests:arm64+0x101865280)
    #5 realm::sync::network::Service::PostOper<realm::util::UniqueFunction<void (realm::Status)>>::recycle_and_execute() network.hpp:2015 (realm-object-store-tests:arm64+0x101041ec8)
    #6 realm::sync::network::Service::Impl::run_impl(bool) network.cpp:1574 (realm-object-store-tests:arm64+0x101911fc0)
    #7 realm::sync::network::Service::run_until_stopped() network.cpp:1776 (realm-object-store-tests:arm64+0x10190e560)
    #8 realm::sync::websocket::DefaultSocketProvider::event_loop() default_socket.cpp:619 (realm-object-store-tests:arm64+0x101900ac0)
    #9 void* std::__1::__thread_proxy[abi:v160006]<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*>>(void*) thread:299 (realm-object-store-tests:arm64+0x1019021e8)

  Location is heap block of size 704 at 0x00010b720700 allocated by thread T649:
    #0 operator new(unsigned long) <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x83de0)
    #1 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2020 (realm-object-store-tests:arm64+0x1018ad10c)
    #2 realm::sync::Session::Session(realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config&&) client.cpp:2018 (realm-object-store-tests:arm64+0x1018ad398)
    #3 std::__1::__unique_if<realm::sync::Session>::__unique_single std::__1::make_unique[abi:v160006]<realm::sync::Session, realm::sync::Client&, std::__1::shared_ptr<realm::DB>, std::__1::shared_ptr<realm::sync::SubscriptionStore>, std::__1::shared_ptr<realm::sync::MigrationStore>, realm::sync::Session::Config>(realm::sync::Client&, std::__1::shared_ptr<realm::DB>&&, std::__1::shared_ptr<realm::sync::SubscriptionStore>&&, std::__1::shared_ptr<realm::sync::MigrationStore>&&, realm::sync::Session::Config&&) unique_ptr.h:686 (realm-object-store-tests:arm64+0x101700d68)
    #4 realm::SyncSession::create_sync_session() sync_session.cpp:916 (realm-object-store-tests:arm64+0x1016f1410)
    #5 realm::SyncSession::become_active() sync_session.cpp:111 (realm-object-store-tests:arm64+0x1016f03e8)
    #6 realm::SyncSession::do_revive(realm::util::CheckedUniqueLock&&) sync_session.cpp:1065 (realm-object-store-tests:arm64+0x1016fa96c)
    #7 realm::SyncSession::revive_if_needed() sync_session.cpp:996 (realm-object-store-tests:arm64+0x1016f8428)
    #8 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:349 (realm-object-store-tests:arm64+0x1016a381c)
    #9 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1016a3154)
    #10 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:164 (realm-object-store-tests:arm64+0x101663100)
    #11 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x10173c1fc)
    #12 __tsan::invoke_and_release_block(void*) <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #13 _dispatch_client_callout <null>:97126468 (libdispatch.dylib:arm64e+0x43fc)

  Mutex M0 (0x00012a8522c8) created at:
    #0 pthread_mutex_lock <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x3c94c)
    #1 std::__1::mutex::lock() <null>:97126468 (libc++.1.dylib:arm64e+0x14f6c)
    #2 realm::Realm::do_refresh() shared_realm.cpp:1319 (realm-object-store-tests:arm64+0x101664560)
    #3 realm::Realm::get_full_schema() shared_realm.cpp:341 (realm-object-store-tests:arm64+0x101664258)
    #4 realm::Realm::update_schema(realm::Schema, unsigned long long, std::__1::function<void (std::__1::shared_ptr<realm::Realm>, std::__1::shared_ptr<realm::Realm>, realm::Schema&)>, std::__1::function<void (std::__1::shared_ptr<realm::Realm>)>, bool) shared_realm.cpp:434 (realm-object-store-tests:arm64+0x1016651fc)
    #5 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:373 (realm-object-store-tests:arm64+0x1016a3ca0)
    #6 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1016a3154)
    #7 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:164 (realm-object-store-tests:arm64+0x101663100)
    #8 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x10173c1fc)
    #9 __tsan::invoke_and_release_block(void*) <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #10 _dispatch_client_callout <null>:97126468 (libdispatch.dylib:arm64e+0x43fc)

  Mutex M1 (0x00010ac16288) created at:
    #0 pthread_mutex_lock <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x3c94c)
    #1 std::__1::mutex::lock() <null>:97126468 (libc++.1.dylib:arm64e+0x14f6c)
    #2 realm::_impl::RealmCoordinator::init_external_helpers() realm_coordinator.cpp:555 (realm-object-store-tests:arm64+0x1016a4f6c)
    #3 realm::_impl::RealmCoordinator::open_db() realm_coordinator.cpp:528 (realm-object-store-tests:arm64+0x1016a274c)
    #4 realm::_impl::RealmCoordinator::do_get_realm(realm::RealmConfig&&, std::__1::shared_ptr<realm::Realm>&, std::__1::optional<realm::VersionID>, realm::util::CheckedUniqueLock&, bool) realm_coordinator.cpp:325 (realm-object-store-tests:arm64+0x1016a3360)
    #5 realm::_impl::RealmCoordinator::get_realm(realm::RealmConfig, std::__1::optional<realm::VersionID>) realm_coordinator.cpp:274 (realm-object-store-tests:arm64+0x1016a3154)
    #6 realm::Realm::get_shared_realm(realm::RealmConfig) shared_realm.cpp:164 (realm-object-store-tests:arm64+0x101663100)
    #7 invocation function for block in (anonymous namespace)::AuditContext::trigger_write(std::__1::shared_ptr<(anonymous namespace)::AuditContext::Scope>) audit.mm:1277 (realm-object-store-tests:arm64+0x10173c1fc)
    #8 __tsan::invoke_and_release_block(void*) <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7fca4)
    #9 _dispatch_client_callout <null>:97126468 (libdispatch.dylib:arm64e+0x43fc)

  Thread T649 (tid=4727568, running) is a GCD worker thread

  Thread T8747 (tid=4736251, running) created by main thread at:
    #0 pthread_create <null>:97126468 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2ffec)
    #1 std::__1::thread::thread<void (realm::sync::websocket::DefaultSocketProvider::*)(), realm::sync::websocket::DefaultSocketProvider*, void>(void (realm::sync::websocket::DefaultSocketProvider::*&&)(), realm::sync::websocket::DefaultSocketProvider*&&) thread:315 (realm-object-store-tests:arm64+0x1019020d4)
    #2 realm::sync::websocket::DefaultSocketProvider::start() default_socket.cpp:544 (realm-object-store-tests:arm64+0x1019005b8)
    #3 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:515 (realm-object-store-tests:arm64+0x101900418)
    #4 realm::sync::websocket::DefaultSocketProvider::DefaultSocketProvider(std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, realm::util::TaggedBool<realm::sync::websocket::DefaultSocketProvider::AutoStartTag>) default_socket.cpp:511 (realm-object-store-tests:arm64+0x1019006d4)
    #5 std::__1::shared_ptr<realm::sync::websocket::DefaultSocketProvider> std::__1::allocate_shared[abi:v160006]<realm::sync::websocket::DefaultSocketProvider, std::__1::allocator<realm::sync::websocket::DefaultSocketProvider>, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&, void>(std::__1::allocator<realm::sync::websocket::DefaultSocketProvider> const&, std::__1::shared_ptr<realm::util::Logger> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>&&, std::__1::shared_ptr<realm::BindingCallbackThreadObserver> const&) shared_ptr.h:995 (realm-object-store-tests:arm64+0x1016efca4)
    #6 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>)::'lambda'()::operator()() const sync_client.hpp:55 (realm-object-store-tests:arm64+0x1016ef37c)
    #7 realm::_impl::SyncClient::SyncClient(std::__1::shared_ptr<realm::util::Logger> const&, realm::SyncClientConfig const&, std::__1::weak_ptr<realm::SyncManager const>) sync_client.hpp:46 (realm-object-store-tests:arm64+0x1016eecec)
    #8 realm::SyncManager::create_sync_client() const sync_manager.cpp:748 (realm-object-store-tests:arm64+0x1016ead04)
    #9 realm::SyncManager::get_sync_client() const sync_manager.cpp:742 (realm-object-store-tests:arm64+0x1016ea798)
    #10 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:470 (realm-object-store-tests:arm64+0x100f34290)
    #11 TestSyncManager::TestSyncManager(TestSyncManager::Config const&, SyncServer::Config const&) test_file.cpp:452 (realm-object-store-tests:arm64+0x100f3451c)
    #12 CATCH2_INTERNAL_TEST_46() audit.cpp:1065 (realm-object-store-tests:arm64+0x1014eea44)
    #13 CATCH2_INTERNAL_TEST_46() audit.cpp:1062 (realm-object-store-tests:arm64+0x1014ee934)
    #14 Catch::RunContext::runCurrentTest(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>>&) catch_run_context.cpp:501 (realm-object-store-tests:arm64+0x101588058)
    #15 Catch::RunContext::runTest(Catch::TestCaseHandle const&) catch_run_context.cpp:232 (realm-object-store-tests:arm64+0x101587978)
    #16 Catch::(anonymous namespace)::TestGroup::execute() catch_session.cpp:110 (realm-object-store-tests:arm64+0x1015518f8)
    #17 Catch::Session::runInternal() catch_session.cpp:332 (realm-object-store-tests:arm64+0x101550b94)
    #18 Catch::Session::run() catch_session.cpp:263 (realm-object-store-tests:arm64+0x10155032c)
    #19 run_object_store_tests(int, char const**) test_runner.cpp:96 (realm-object-store-tests:arm64+0x100d358b8)
    #20 main main.cpp:24 (realm-object-store-tests:arm64+0x101527c14)

SUMMARY: ThreadSanitizer: data race client.cpp:1279 in realm::sync::SessionWrapper::on_commit(unsigned long long)

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 21, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
3 participants