Skip to content

Commit

Permalink
Lock serverAddress_ in FsdbStreamClient
Browse files Browse the repository at this point in the history
Summary:
We have a race between FsdbStreamClient::setServerToConnect() setting serverAddress_ and FsdbStreamClient::timeoutExpired() from reconnect thread checking if it has an address for us to reconnect to.

With tests from D37376542:
```
❯ buck test mode/dev-tsan //fboss/facebook/mka_service/fsdb/tests:MKAFsdbSyncerTest -- --stress-runs 10
...
Summary
  Pass: 10
  Fatal: 10
```
```
==================
WARNING: ThreadSanitizer: data race (pid=708956)
  Read of size 2 at 0x7b4c00001c88 by thread T79:
    #0 folly::SocketAddress::getPort() const folly/SocketAddress.cpp:413 (libfolly_network_address.so+0x8bfda)
    #1 facebook::fboss::fsdb::FsdbStreamClient::timeoutExpired() fboss/fsdb/client/FsdbStreamClient.cpp:98 (libfboss_fsdb_client_fsdb_stream_client.so+0x2e858)
    #2 facebook::fboss::fsdb::FsdbStreamClient::FsdbStreamClient(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, folly::EventBase*, folly::EventBase*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>)::$_16::operator()() const fboss/fsdb/client/FsdbStreamClient.cpp:34 (libfboss_fsdb_client_fsdb_stream_client.so+0x328e5)
    #3 folly::detail::async_timeout_wrapper<facebook::fboss::fsdb::FsdbStreamClient::FsdbStreamClient(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, folly::EventBase*, folly::EventBase*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>)::$_16>::timeoutExpired() folly/io/async/AsyncTimeout.h:255 (libfboss_fsdb_client_fsdb_stream_client.so+0x3289c)
    #4 folly::AsyncTimeout::libeventCallback(int, short, void*) folly/io/async/AsyncTimeout.cpp:174 (libfolly_io_async_async_base.so+0x41e6b)
    #5 event_process_active /home/engshare/third-party2/libevent/1.4.14b_hphp/src/libevent-1.4.14b-stable/event.c:390:5 (libevent-1.4.so.2+0x8608)
    #6 event_base_loop /home/engshare/third-party2/libevent/1.4.14b_hphp/src/libevent-1.4.14b-stable/event.c:532:4 (libevent-1.4.so.2+0x8608)
    #7 folly::EventBase::loopMain(int, bool) folly/io/async/EventBase.cpp:400 (libfolly_io_async_async_base.so+0x49c47)
    #8 folly::EventBase::loopBody(int, bool) folly/io/async/EventBase.cpp:326 (libfolly_io_async_async_base.so+0x4940f)
    #9 folly::EventBase::loop() folly/io/async/EventBase.cpp:305 (libfolly_io_async_async_base.so+0x49298)
    #10 folly::EventBase::loopForever() folly/io/async/EventBase.cpp:545 (libfolly_io_async_async_base.so+0x5c7bf)
    #11 folly::run(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&) folly/io/async/ScopedEventBaseThread.cpp:40 (libfolly_io_async_scoped_event_base_thread.so+0x8b78)
    #12 void std::__invoke_impl<void, void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> >(std::__invoke_other, void (*&&)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*&&, folly::EventBase*&&, folly::Baton<true, std::atomic>*&&, folly::Range<char const*>&&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/invoke.h:61 (libfolly_io_async_scoped_event_base_thread.so+0x101e0)
    #13 std::__invoke_result<void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> >::type std::__invoke<void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> >(void (*&&)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*&&, folly::EventBase*&&, folly::Baton<true, std::atomic>*&&, folly::Range<char const*>&&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/invoke.h:96 (libfolly_io_async_scoped_event_base_thread.so+0xff14)
    #14 void std::thread::_Invoker<std::tuple<void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> > >::_M_invoke<0ul, 1ul, 2ul, 3ul, 4ul>(std::_Index_tuple<0ul, 1ul, 2ul, 3ul, 4ul>) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/std_thread.h:253 (libfolly_io_async_scoped_event_base_thread.so+0xfe4d)
    #15 std::thread::_Invoker<std::tuple<void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> > >::operator()() third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/std_thread.h:260 (libfolly_io_async_scoped_event_base_thread.so+0xfd85)
    #16 std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)(folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> const&), folly::EventBaseManager*, folly::EventBase*, folly::Baton<true, std::atomic>*, folly::Range<char const*> > > >::_M_run() third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/std_thread.h:211 (libfolly_io_async_scoped_event_base_thread.so+0xf759)
    #17 execute_native_thread_routine <null> (libstdc++.so.6+0xdf2e4)

  Previous write of size 2 at 0x7b4c00001c88 by main thread (mutexes: write M477235840850862816):
    #0 folly::SocketAddress::SocketAddress(folly::SocketAddress&&) folly/SocketAddress.h:598 (libfboss_fsdb_client_fsdb_stream_client.so+0x4ca07)
    #1 void std::_Optional_base_impl<folly::SocketAddress, std::_Optional_base<folly::SocketAddress, false, false> >::_M_construct<folly::SocketAddress>(folly::SocketAddress&&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/optional:420 (libfboss_fsdb_client_fsdb_stream_client.so+0x4c70e)
    #2 std::enable_if<__and_v<std::__not_<std::is_same<std::optional<folly::SocketAddress>, std::remove_cv<std::remove_reference<folly::SocketAddress>::type>::type> >, std::__not_<std::__and_<std::is_scalar<folly::SocketAddress>, std::is_same<folly::SocketAddress, std::decay<folly::SocketAddress>::type> > >, std::is_constructible<folly::SocketAddress, folly::SocketAddress>, std::is_assignable<folly::SocketAddress&, folly::SocketAddress> >, std::optional<folly::SocketAddress>&>::type std::optional<folly::SocketAddress>::operator=<folly::SocketAddress>(folly::SocketAddress&&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/optional:810 (libfboss_fsdb_client_fsdb_stream_client.so+0x4c4a6)
    #3 facebook::fboss::fsdb::FsdbStreamClient::setServerToConnect(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned short, bool) fboss/fsdb/client/FsdbStreamClient.cpp:92 (libfboss_fsdb_client_fsdb_stream_client.so+0x4c2a7)
    #4 auto void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)::'lambda'(facebook::fboss::fsdb::FsdbStateSubscriber&)::operator()<std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> > > > > >(facebook::fboss::fsdb::FsdbStateSubscriber&) const fboss/fsdb/client/FsdbPubSubManager.cpp:263 (libfboss_fsdb_client_fsdb_pub_sub.so+0x155e9b)
    #5 auto folly::SynchronizedBase<folly::Synchronized<std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> > > > >, folly::SharedMutexImpl<false, void, std::atomic, folly::SharedMutexPolicyDefault> >, (folly::detail::SynchronizedMutexLevel)2>::withWLock<void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)::'lambda'(facebook::fboss::fsdb::FsdbStateSubscriber&)>(facebook::fboss::fsdb::FsdbStateSubscriber&&) folly/Synchronized.h:305 (libfboss_fsdb_client_fsdb_pub_sub.so+0x155814)
    #6 void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) fboss/fsdb/client/FsdbPubSubManager.cpp:247 (libfboss_fsdb_client_fsdb_pub_sub.so+0x1555ae)
    #7 facebook::fboss::fsdb::FsdbPubSubManager::addStatePathSubscription(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, std::function<void (facebook::fboss::fsdb::OperState&&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) fboss/fsdb/client/FsdbPubSubManager.cpp:197 (libfboss_fsdb_client_fsdb_pub_sub.so+0x15539c)
    #8 facebook::fboss::mka::TestSubscription<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > >::TestSubscription(facebook::fboss::fsdb::FsdbPubSubManager*, thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > >) fboss/facebook/mka_service/fsdb/tests/MKAFsdbTestUtils.h:57 (MKAFsdbSyncerTest+0x132899)
    #9 facebook::fboss::mka::TestSubscription<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > > facebook::fboss::mka::MKAFsdbSyncerTest::subscribe<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > >(thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > >) fboss/facebook/mka_service/fsdb/tests/MKAFsdbSyncerTest.cpp:79 (MKAFsdbSyncerTest+0x131b37)
    #10 facebook::fboss::mka::MKAFsdbSyncerTest_testSessionUpdate_Test::TestBody() fboss/facebook/mka_service/fsdb/tests/MKAFsdbSyncerTest.cpp:102 (MKAFsdbSyncerTest+0x10a03c)
    #11 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2682:50 (libgtest.so.1.11.0+0x50f35)
    #12 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2672:6 (libgtest.so.1.11.0+0x50f35)
    #13 main common/gtest/LightMain.cpp:20 (libcommon_gtest_light_main.so+0x2161)

  Location is heap block of size 408 at 0x7b4c00001c00 allocated by main thread:
    #0 operator new(unsigned long) <null> (MKAFsdbSyncerTest+0x14143c)
    #1 std::_MakeUniq<facebook::fboss::fsdb::FsdbStateSubscriber>::__single_object std::make_unique<facebook::fboss::fsdb::FsdbStateSubscriber, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, folly::EventBase*, folly::EventBase*, std::function<void (facebook::fboss::fsdb::OperState&&)>&, bool&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, folly::EventBase*&&, folly::EventBase*&&, std::function<void (facebook::fboss::fsdb::OperState&&)>&, bool&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/unique_ptr.h:962 (libfboss_fsdb_client_fsdb_pub_sub.so+0x1560f8)
    #2 auto void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)::'lambda'(facebook::fboss::fsdb::FsdbStateSubscriber&)::operator()<std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> > > > > >(facebook::fboss::fsdb::FsdbStateSubscriber&) const fboss/fsdb/client/FsdbPubSubManager.cpp:250 (libfboss_fsdb_client_fsdb_pub_sub.so+0x155a21)
    #3 auto folly::SynchronizedBase<folly::Synchronized<std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::unique_ptr<facebook::fboss::fsdb::FsdbStreamClient, std::default_delete<facebook::fboss::fsdb::FsdbStreamClient> > > > >, folly::SharedMutexImpl<false, void, std::atomic, folly::SharedMutexPolicyDefault> >, (folly::detail::SynchronizedMutexLevel)2>::withWLock<void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)::'lambda'(facebook::fboss::fsdb::FsdbStateSubscriber&)>(facebook::fboss::fsdb::FsdbStateSubscriber&&) folly/Synchronized.h:305 (libfboss_fsdb_client_fsdb_pub_sub.so+0x155814)
    #4 void facebook::fboss::fsdb::FsdbPubSubManager::addSubscriptionImpl<facebook::fboss::fsdb::FsdbStateSubscriber>(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, facebook::fboss::fsdb::FsdbStateSubscriber::FsdbSubUnitUpdateCb, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) fboss/fsdb/client/FsdbPubSubManager.cpp:247 (libfboss_fsdb_client_fsdb_pub_sub.so+0x1555ae)
    #5 facebook::fboss::fsdb::FsdbPubSubManager::addStatePathSubscription(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::function<void (facebook::fboss::fsdb::FsdbStreamClient::State, facebook::fboss::fsdb::FsdbStreamClient::State)>, std::function<void (facebook::fboss::fsdb::OperState&&)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int) fboss/fsdb/client/FsdbPubSubManager.cpp:197 (libfboss_fsdb_client_fsdb_pub_sub.so+0x15539c)
    #6 facebook::fboss::mka::TestSubscription<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > >::TestSubscription(facebook::fboss::fsdb::FsdbPubSubManager*, thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > >) fboss/facebook/mka_service/fsdb/tests/MKAFsdbTestUtils.h:57 (MKAFsdbSyncerTest+0x132899)
    #7 facebook::fboss::mka::TestSubscription<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > > facebook::fboss::mka::MKAFsdbSyncerTest::subscribe<thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > > >(thriftpath::ChildThriftPath<facebook::fboss::mka::MkaState, facebook::fboss::fsdb::FsdbOperStateRoot, thriftpath::Path<facebook::fboss::fsdb::MkaData, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, thriftpath::Path<facebook::fboss::fsdb::FsdbOperStateRoot, facebook::fboss::fsdb::FsdbOperStateRoot, apache::thrift::type_class::structure, folly::Unit> > >) fboss/facebook/mka_service/fsdb/tests/MKAFsdbSyncerTest.cpp:79 (MKAFsdbSyncerTest+0x131b37)
    #8 facebook::fboss::mka::MKAFsdbSyncerTest_testSessionUpdate_Test::TestBody() fboss/facebook/mka_service/fsdb/tests/MKAFsdbSyncerTest.cpp:102 (MKAFsdbSyncerTest+0x10a03c)
    #9 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2682:50 (libgtest.so.1.11.0+0x50f35)
    #10 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2672:6 (libgtest.so.1.11.0+0x50f35)
    #11 main common/gtest/LightMain.cpp:20 (libcommon_gtest_light_main.so+0x2161)

  Mutex M477235840850862816 is already destroyed.

  Thread T79 'FsdbReconnectTh' (tid=710754, running) created by main thread at:
    #0 pthread_create <null> (MKAFsdbSyncerTest+0x1a803d)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xdf5ee)
    #2 folly::ScopedEventBaseThread::ScopedEventBaseThread(folly::EventBase::Options, folly::EventBaseManager*, folly::Range<char const*>) folly/io/async/ScopedEventBaseThread.cpp:68 (libfolly_io_async_scoped_event_base_thread.so+0x86f4)
    #3 folly::ScopedEventBaseThread::ScopedEventBaseThread(folly::EventBaseManager*, folly::Range<char const*>) folly/io/async/ScopedEventBaseThread.cpp:60 (libfolly_io_async_scoped_event_base_thread.so+0x83ed)
    #4 folly::ScopedEventBaseThread::ScopedEventBaseThread(folly::Range<char const*>) folly/io/async/ScopedEventBaseThread.cpp:53 (libfolly_io_async_scoped_event_base_thread.so+0xac91)
    #5 facebook::fboss::fsdb::FsdbPubSubManager::FsdbPubSubManager(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) fboss/fsdb/client/FsdbPubSubManager.h:139 (libfboss_fsdb_client_fsdb_pub_sub.so+0x124f18)
    #6 std::_MakeUniq<facebook::fboss::fsdb::FsdbPubSubManager>::__single_object std::make_unique<facebook::fboss::fsdb::FsdbPubSubManager, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/unique_ptr.h:962 (libfboss_fsdb_client_fsdb_syncer.so+0x9b52)
    #7 facebook::fboss::fsdb::FsdbSyncManager::FsdbSyncManager(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&) fboss/fsdb/client/FsdbSyncManager.cpp:12 (libfboss_fsdb_client_fsdb_syncer.so+0x99d4)
    #8 facebook::fboss::mka::MKAFsdbSyncManager::MKAFsdbSyncManager() fboss/facebook/mka_service/fsdb/MKAFsdbSyncManager.cpp:30 (libfboss_facebook_mka_service_fsdb_fsdb_syncer.so+0x954a5)
    #9 std::_MakeUniq<facebook::fboss::mka::MKAFsdbSyncManager>::__single_object std::make_unique<facebook::fboss::mka::MKAFsdbSyncManager>() third-party-buck/platform010-compat/build/libgcc/include/c++/trunk/bits/unique_ptr.h:962 (MKAFsdbSyncerTest+0x13d1a9)
    #10 facebook::fboss::mka::MKAFsdbSyncerTest::SetUp() fboss/facebook/mka_service/fsdb/tests/MKAFsdbSyncerTest.cpp:51 (MKAFsdbSyncerTest+0x108d91)
    #11 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2677:48 (libgtest.so.1.11.0+0x50eb8)
    #12 testing::Test::Run() /home/engshare/third-party2/googletest/1.11.0/src/googletest/googletest/src/gtest.cc:2672:6 (libgtest.so.1.11.0+0x50eb8)
    #13 main common/gtest/LightMain.cpp:20 (libcommon_gtest_light_main.so+0x2161)

ThreadSanitizer: data race folly/SocketAddress.cpp:413 in folly::SocketAddress::getPort() const
```

Reviewed By: peygar

Differential Revision: D38721759

fbshipit-source-id: 43570bd23ff2bf75cb812541ee7d022d1c012697
  • Loading branch information
clement-cheung-fb authored and facebook-github-bot committed Aug 18, 2022
1 parent 6d4f1fe commit 520b85b
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 6 deletions.
11 changes: 6 additions & 5 deletions fboss/fsdb/client/FsdbStreamClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,17 @@ void FsdbStreamClient::setServerToConnect(
const std::string& ip,
uint16_t port,
bool allowReset) {
if (!allowReset && serverAddress_) {
if (!allowReset && *serverAddress_.rlock()) {
throw std::runtime_error("Cannot reset server address");
}
serverAddress_ = folly::SocketAddress(ip, port);
*serverAddress_.wlock() = folly::SocketAddress(ip, port);
}

void FsdbStreamClient::timeoutExpired() noexcept {
if (getState() == State::DISCONNECTED && serverAddress_) {
auto serverAddress = *serverAddress_.rlock();
if (getState() == State::DISCONNECTED && serverAddress) {
connectToServer(
serverAddress_->getIPAddress().str(), serverAddress_->getPort());
serverAddress->getIPAddress().str(), serverAddress->getPort());
}
timer_->scheduleTimeout(FLAGS_fsdb_reconnect_ms);
}
Expand Down Expand Up @@ -152,7 +153,7 @@ void FsdbStreamClient::cancel() {
XLOG(WARNING) << clientId() << " already cancelled";
return;
}
serverAddress_.reset();
serverAddress_.wlock()->reset();
connRetryEvb_->runInEventBaseThreadAndWait(
[this] { timer_->cancelTimeout(); });
setState(State::CANCELLED);
Expand Down
2 changes: 1 addition & 1 deletion fboss/fsdb/client/FsdbStreamClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class FsdbStreamClient {
folly::Synchronized<State> state_{State::DISCONNECTED};
std::string counterPrefix_;
std::unique_ptr<folly::ScopedEventBaseThread> clientEvbThread_;
std::optional<folly::SocketAddress> serverAddress_;
folly::Synchronized<std::optional<folly::SocketAddress>> serverAddress_;
FsdbStreamStateChangeCb stateChangeCb_;
std::atomic<bool> serviceLoopRunning_{false};
std::unique_ptr<folly::AsyncTimeout> timer_;
Expand Down

0 comments on commit 520b85b

Please sign in to comment.