eProsima / Fast-DDS

The most complete DDS - Proven: Plenty of success cases. Looking for commercial support? Contact info@eprosima.com
https://eprosima.com
Apache License 2.0
2.16k stars 765 forks source link

[21232] Fix flaky latency tests on mac #5009

Closed Mario-DL closed 3 months ago

Mario-DL commented 3 months ago

Description

Some of the Latency tests failed in mac from time to time, in particular, the intraprocess ones. Analysis revealed the following backtrace:

libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::BaseReader::downcast(eprosima::fastdds::rtps::RTPSReader*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/reader/BaseReader.cpp:236)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::StatefulWriter::intraprocess_delivery(eprosima::fastdds::rtps::CacheChange_t*, eprosima::fastdds::rtps::ReaderProxy*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/writer/StatefulWriter.cpp:483)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::StatefulWriter::deliver_sample_to_intraprocesses(eprosima::fastdds::rtps::CacheChange_t*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/writer/StatefulWriter.cpp:642)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::StatefulWriter::deliver_sample_nts(eprosima::fastdds::rtps::CacheChange_t*, eprosima::fastdds::rtps::RTPSMessageGroup&, eprosima::fastdds::rtps::LocatorSelectorSender&, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > > const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/writer/StatefulWriter.cpp:2194)
libfastdds.3.0.0.dylib!std::__1::enable_if<std::is_base_of<eprosima::fastdds::rtps::FlowControllerPureSyncPublishMode, eprosima::fastdds::rtps::FlowControllerSyncPublishMode>::value, bool>::type eprosima::fastdds::rtps::FlowControllerImpl<eprosima::fastdds::rtps::FlowControllerSyncPublishMode, eprosima::fastdds::rtps::FlowControllerFifoSchedule>::add_new_sample_impl<eprosima::fastdds::rtps::FlowControllerSyncPublishMode>(eprosima::fastdds::rtps::RTPSWriter*, eprosima::fastdds::rtps::CacheChange_t*, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > > const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/flowcontrol/FlowControllerImpl.hpp:1191)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::FlowControllerImpl<eprosima::fastdds::rtps::FlowControllerSyncPublishMode, eprosima::fastdds::rtps::FlowControllerFifoSchedule>::add_new_sample(eprosima::fastdds::rtps::RTPSWriter*, eprosima::fastdds::rtps::CacheChange_t*, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > > const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/flowcontrol/FlowControllerImpl.hpp:1012)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::StatefulWriter::unsent_change_added_to_history(eprosima::fastdds::rtps::CacheChange_t*, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > > const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/writer/StatefulWriter.cpp:455)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::WriterHistory::notify_writer(eprosima::fastdds::rtps::CacheChange_t*, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > > const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/history/WriterHistory.cpp:124)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::WriterHistory::add_change_(eprosima::fastdds::rtps::CacheChange_t*, eprosima::fastdds::rtps::WriteParams&, std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l> > >) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/history/WriterHistory.cpp:145)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::WriterHistory::add_change(eprosima::fastdds::rtps::CacheChange_t*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/history/WriterHistory.cpp:52)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::EDPSimple::removeLocalReader(eprosima::fastdds::rtps::RTPSReader*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/builtin/discovery/endpoint/EDPSimple.cpp:738)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::BuiltinProtocols::removeLocalReader(eprosima::fastdds::rtps::RTPSReader*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/builtin/BuiltinProtocols.cpp:304)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::RTPSParticipantImpl::deleteUserEndpoint(eprosima::fastdds::rtps::GUID_t const&) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/participant/RTPSParticipantImpl.cpp:2140)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::RTPSDomainImpl::removeRTPSReader(eprosima::fastdds::rtps::RTPSReader*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/RTPSDomain.cpp:532)
libfastdds.3.0.0.dylib!eprosima::fastdds::rtps::RTPSDomain::removeRTPSReader(eprosima::fastdds::rtps::RTPSReader*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/rtps/RTPSDomain.cpp:516)
libfastdds.3.0.0.dylib!eprosima::fastdds::dds::DataReaderImpl::stop() (/Users/mardom/dds_ws/src/fastdds/src/cpp/fastdds/subscriber/DataReaderImpl.cpp:335)
libfastdds.3.0.0.dylib!eprosima::fastdds::dds::DataReaderImpl::~DataReaderImpl() (/Users/mardom/dds_ws/src/fastdds/src/cpp/fastdds/subscriber/DataReaderImpl.cpp:349)
libfastdds.3.0.0.dylib!eprosima::fastdds::statistics::dds::DataReaderImpl::~DataReaderImpl() (/Users/mardom/dds_ws/src/fastdds/src/cpp/statistics/fastdds/subscriber/DataReaderImpl.hpp:43)
libfastdds.3.0.0.dylib!eprosima::fastdds::statistics::dds::DataReaderImpl::~DataReaderImpl() (/Users/mardom/dds_ws/src/fastdds/src/cpp/statistics/fastdds/subscriber/DataReaderImpl.hpp:43)
libfastdds.3.0.0.dylib!eprosima::fastdds::statistics::dds::DataReaderImpl::~DataReaderImpl() (/Users/mardom/dds_ws/src/fastdds/src/cpp/statistics/fastdds/subscriber/DataReaderImpl.hpp:43)
libfastdds.3.0.0.dylib!eprosima::fastdds::dds::SubscriberImpl::delete_datareader(eprosima::fastdds::dds::DataReader const*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/fastdds/subscriber/SubscriberImpl.cpp:298)
libfastdds.3.0.0.dylib!eprosima::fastdds::dds::Subscriber::delete_datareader(eprosima::fastdds::dds::DataReader const*) (/Users/mardom/dds_ws/src/fastdds/src/cpp/fastdds/subscriber/Subscriber.cpp:129)
LatencyTest!LatencyTestPublisher::~LatencyTestPublisher() (/Users/mardom/dds_ws/src/fastdds/test/performance/latency/LatencyTestPublisher.cpp:74)
LatencyTest!LatencyTestPublisher::~LatencyTestPublisher() (/Users/mardom/dds_ws/src/fastdds/test/performance/latency/LatencyTestPublisher.cpp:59)

In intraprocess there is a race in destruction since the LatencySubsriber deletes its participant and then, when the LatencyPublisher deletes their entites it tries to access the EDP builtins on the LatencySubscriber which are deleted.

This PR lets the user endpoints be destroyed while guaranteeing that both are alive before deleting the participants.

In addition, proposes a refactor for using a BaseReader instead of a RTPSReader for the local_reader_ member of the readerproxy to save up a dynamic_cast when downcasting.

Contributor Checklist

Reviewer Checklist

elianalf commented 3 months ago

LGTM: CI passed here ce9fc78 and the failed tests are unrelated.