@@ -520,11 +520,12 @@ bool StatefulWriter::change_removed_by_history(
520520 return ret_value;
521521}
522522
523- void StatefulWriter::send_heartbeat_to_all_readers ()
523+ void StatefulWriter::send_heartbeat_to_all_readers (
524+ bool force_separating)
524525{
525526 // This method is only called from send_periodic_heartbeat
526527
527- if (separate_sending_enabled_)
528+ if (separate_sending_enabled_ || force_separating )
528529 {
529530 for (ReaderProxy* reader : matched_remote_readers_)
530531 {
@@ -648,6 +649,15 @@ DeliveryRetCode StatefulWriter::deliver_sample_to_network(
648649 {
649650 SequenceNumber_t gap_seq;
650651 FragmentNumber_t next_unsent_frag = 0 ;
652+
653+ if (SequenceNumber_t::unknown () != (*remote_reader)->first_irrelevant_removed ())
654+ {
655+ // Send GAP with irrelevant changes that are not in history.
656+ group.sender (this , (*remote_reader)->message_sender ());
657+ add_gaps_for_removed_irrelevants (**remote_reader, group);
658+ group.sender (this , &locator_selector); // This makes the flush_and_reset().
659+ }
660+
651661 if ((*remote_reader)->change_is_unsent (change->sequenceNumber , next_unsent_frag, gap_seq, get_seq_num_min (),
652662 need_reactivate_periodic_heartbeat) &&
653663 (0 == n_fragments || min_unsent_fragment >= next_unsent_frag))
@@ -1684,7 +1694,8 @@ bool StatefulWriter::send_periodic_heartbeat(
16841694 std::lock_guard<RecursiveTimedMutex> guardW (mp_mutex);
16851695 std::lock_guard<LocatorSelectorSender> guard_locator_selector_general (locator_selector_general_);
16861696
1687- bool unacked_changes = false ;
1697+ bool unacked_changes {false };
1698+ bool irrelevants_removed {false };
16881699 if (!liveliness)
16891700 {
16901701 SequenceNumber_t first_seq_to_check_acknowledge = get_seq_num_min ();
@@ -1693,20 +1704,30 @@ bool StatefulWriter::send_periodic_heartbeat(
16931704 first_seq_to_check_acknowledge = history_->next_sequence_number () - 1 ;
16941705 }
16951706
1696- unacked_changes = for_matched_readers (matched_local_readers_, matched_datasharing_readers_,
1697- matched_remote_readers_,
1698- [first_seq_to_check_acknowledge](ReaderProxy* reader)
1699- {
1700- return reader->has_unacknowledged (first_seq_to_check_acknowledge);
1701- }
1702- );
1707+ for_matched_readers (matched_local_readers_, matched_datasharing_readers_,
1708+ matched_remote_readers_,
1709+ [first_seq_to_check_acknowledge, &unacked_changes, &irrelevants_removed](ReaderProxy* reader)
1710+ {
1711+ if (!unacked_changes)
1712+ {
1713+ unacked_changes = reader->has_unacknowledged (first_seq_to_check_acknowledge);
1714+ }
1715+
1716+ if (!irrelevants_removed)
1717+ {
1718+ irrelevants_removed = SequenceNumber_t::unknown () != reader->first_irrelevant_removed ();
1719+ }
1720+
1721+ return unacked_changes && irrelevants_removed;
1722+ }
1723+ );
17031724
17041725 if (unacked_changes)
17051726 {
17061727 try
17071728 {
17081729 // TODO if separating, here sends periodic for all readers, instead of ones needed it.
1709- send_heartbeat_to_all_readers ();
1730+ send_heartbeat_to_all_readers (irrelevants_removed );
17101731 }
17111732 catch (const RTPSMessageGroup::timeout&)
17121733 {
@@ -1796,6 +1817,7 @@ void StatefulWriter::send_heartbeat_to_nts(
17961817 assert (firstSeq <= lastSeq);
17971818 if (!liveliness)
17981819 {
1820+ add_gaps_for_removed_irrelevants (remoteReaderProxy, group);
17991821 add_gaps_for_holes_in_history (group);
18001822 }
18011823 }
@@ -2247,6 +2269,19 @@ bool StatefulWriter::get_connections(
22472269
22482270#endif // ifdef FASTDDS_STATISTICS
22492271
2272+ void StatefulWriter::add_gaps_for_removed_irrelevants (
2273+ ReaderProxy& remoteReaderProxy,
2274+ RTPSMessageGroup& group)
2275+ {
2276+ if (SequenceNumber_t::unknown () != remoteReaderProxy.first_irrelevant_removed ())
2277+ {
2278+ group.add_gap (remoteReaderProxy.first_irrelevant_removed (),
2279+ SequenceNumberSet_t (remoteReaderProxy.last_irrelevant_removed () + 1 ),
2280+ remoteReaderProxy.guid ());
2281+ remoteReaderProxy.reset_irrelevant_removed ();
2282+ }
2283+ }
2284+
22502285void StatefulWriter::add_gaps_for_holes_in_history (
22512286 RTPSMessageGroup& group)
22522287{
0 commit comments