diff --git a/include/fastdds/dds/subscriber/SampleInfo.hpp b/include/fastdds/dds/subscriber/SampleInfo.hpp index 66a41d31880..65e81d84858 100644 --- a/include/fastdds/dds/subscriber/SampleInfo.hpp +++ b/include/fastdds/dds/subscriber/SampleInfo.hpp @@ -87,6 +87,9 @@ struct SampleInfo //!Related Sample Identity (Extension for RPC) rtps::SampleIdentity related_sample_identity; + //!Persistence Sample Identity (Extension for RPC) + rtps::SampleIdentity persistence_sample_identity; + }; } // namespace dds diff --git a/include/fastdds/rtps/common/CacheChange.hpp b/include/fastdds/rtps/common/CacheChange.hpp index b2170aa84cd..986e9cc924f 100644 --- a/include/fastdds/rtps/common/CacheChange.hpp +++ b/include/fastdds/rtps/common/CacheChange.hpp @@ -68,6 +68,8 @@ struct CacheChangeReaderInfo_t int32_t no_writers_generation_count; //! Ownership stregth of its writer when the sample was received. uint32_t writer_ownership_strength; + //! Persistence writer guid associated with received sample. + GUID_t persistence_writer_guid; }; /** diff --git a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp index 71a6e327564..2a778bd01b8 100644 --- a/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp +++ b/src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp @@ -247,6 +247,8 @@ struct ReadTakeCommand info.sample_identity.writer_guid(item->writerGUID); info.sample_identity.sequence_number(item->sequenceNumber); info.related_sample_identity = item->write_params.sample_identity(); + info.persistence_sample_identity.writer_guid(item->reader_info.persistence_writer_guid); + info.persistence_sample_identity.sequence_number(item->sequenceNumber); info.valid_data = true; diff --git a/src/cpp/rtps/reader/BaseReader.cpp b/src/cpp/rtps/reader/BaseReader.cpp index d8fad36cb97..5780d00efe5 100644 --- a/src/cpp/rtps/reader/BaseReader.cpp +++ b/src/cpp/rtps/reader/BaseReader.cpp @@ -434,6 +434,20 @@ fastdds::rtps::SequenceNumber_t BaseReader::get_last_notified( return ret_val; } +fastdds::rtps::GUID_t BaseReader::get_persistence_guid( + const fastdds::rtps::GUID_t& guid) +{ + std::lock_guard guard(mp_mutex); + GUID_t ret_val = guid; + auto p_guid = history_state_->persistence_guid_map.find(guid); + if (p_guid != history_state_->persistence_guid_map.end()) + { + ret_val = p_guid->second; + } + + return ret_val; +} + fastdds::rtps::SequenceNumber_t BaseReader::update_last_notified( const fastdds::rtps::GUID_t& guid, const fastdds::rtps::SequenceNumber_t& seq) diff --git a/src/cpp/rtps/reader/BaseReader.hpp b/src/cpp/rtps/reader/BaseReader.hpp index 596e335ce53..01ae99ae844 100644 --- a/src/cpp/rtps/reader/BaseReader.hpp +++ b/src/cpp/rtps/reader/BaseReader.hpp @@ -395,6 +395,14 @@ class BaseReader fastdds::rtps::SequenceNumber_t get_last_notified( const fastdds::rtps::GUID_t& guid); + /** + * @brief Retrieve the persistence guid for the provided writer guid. + * + * @param guid The writer GUID to query. + */ + GUID_t get_persistence_guid( + const GUID_t& guid); + /** * @brief Update the last notified sequence for a writer's GUID. * diff --git a/src/cpp/rtps/reader/StatefulReader.cpp b/src/cpp/rtps/reader/StatefulReader.cpp index 1cd27d4ddd5..84eb19bcf55 100644 --- a/src/cpp/rtps/reader/StatefulReader.cpp +++ b/src/cpp/rtps/reader/StatefulReader.cpp @@ -1155,6 +1155,9 @@ bool StatefulReader::change_received( a_change->reader_info.writer_ownership_strength = (std::numeric_limits::max)(); } + // Update persistence GUID information on the CacheChange. + a_change->reader_info.persistence_writer_guid = get_persistence_guid(a_change->writerGUID); + // NOTE: Depending on QoS settings, one change can be removed from history // inside the call to history_->received_change fastdds::dds::SampleRejectedStatusKind rejection_reason; diff --git a/src/cpp/rtps/reader/StatelessReader.cpp b/src/cpp/rtps/reader/StatelessReader.cpp index 594f46de3b6..152a60c319d 100644 --- a/src/cpp/rtps/reader/StatelessReader.cpp +++ b/src/cpp/rtps/reader/StatelessReader.cpp @@ -368,6 +368,9 @@ bool StatelessReader::change_received( change->reader_info.writer_ownership_strength = (std::numeric_limits::max)(); } + // Update persistence GUID information on the CacheChange. + change->reader_info.persistence_writer_guid = get_persistence_guid(change->writerGUID); + if (history_->received_change(change, 0)) { auto payload_length = change->serializedPayload.length;