Skip to content

Commit 0790d29

Browse files
Account for notification sample in DataReaderHistory::get_first_untaken_info (#6276) (#6278)
* Refs #24120. Extend `return_sample_when_writer_disappears` blackbox test. * Refs #24120. Refactor `ReadTakeCommand::generate_info`. Moving code to a public static method so it can be used outside. * Refs #24120. Account for notification sample in `DataReaderHistory::get_first_untaken_info`. * Refs #24121. Please uncrustify. * Refs #24121. Fix build error. --------- (cherry picked from commit 0096d75) Signed-off-by: Miguel Company <miguelcompany@eprosima.com> Co-authored-by: Miguel Company <miguelcompany@eprosima.com>
1 parent 74adc61 commit 0790d29

File tree

3 files changed

+63
-26
lines changed

3 files changed

+63
-26
lines changed

src/cpp/fastdds/subscriber/DataReaderImpl/ReadTakeCommand.hpp

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,40 @@ struct ReadTakeCommand
280280
}
281281
}
282282

283+
/**
284+
* @brief Generate SampleInfo for an instance without data.
285+
*
286+
* @param[out] info SampleInfo to fill.
287+
* @param[in] instance_handle Handle of the instance.
288+
* @param[in] instance DataReaderInstance information.
289+
*/
290+
static void generate_instance_info(
291+
SampleInfo& info,
292+
const InstanceHandle_t& instance_handle,
293+
const DataReaderInstance& instance)
294+
{
295+
fastdds::rtps::Time_t current_time;
296+
fastdds::rtps::Time_t::now(current_time);
297+
298+
info.sample_state = NOT_READ_SAMPLE_STATE;
299+
info.instance_state = instance.instance_state;
300+
info.view_state = instance.view_state;
301+
info.disposed_generation_count = instance.disposed_generation_count;
302+
info.no_writers_generation_count = instance.no_writers_generation_count;
303+
info.sample_rank = 0;
304+
info.generation_rank = 0;
305+
info.absolute_generation_rank = 0;
306+
info.source_timestamp = current_time;
307+
info.reception_timestamp = current_time;
308+
info.instance_handle = instance_handle;
309+
info.publication_handle = InstanceHandle_t{};
310+
311+
info.sample_identity = rtps::SampleIdentity{};
312+
info.related_sample_identity = rtps::SampleIdentity{};
313+
314+
info.valid_data = false;
315+
}
316+
283317
private:
284318

285319
const TypeSupport& type_;
@@ -418,26 +452,7 @@ struct ReadTakeCommand
418452
}
419453
else
420454
{
421-
fastdds::rtps::Time_t current_time;
422-
fastdds::rtps::Time_t::now(current_time);
423-
424-
info.sample_state = NOT_READ_SAMPLE_STATE;
425-
info.instance_state = instance.instance_state;
426-
info.view_state = instance.view_state;
427-
info.disposed_generation_count = instance.disposed_generation_count;
428-
info.no_writers_generation_count = instance.no_writers_generation_count;
429-
info.sample_rank = 0;
430-
info.generation_rank = 0;
431-
info.absolute_generation_rank = 0;
432-
info.source_timestamp = current_time;
433-
info.reception_timestamp = current_time;
434-
info.instance_handle = instance_->first;
435-
info.publication_handle = HANDLE_NIL;
436-
437-
info.sample_identity = rtps::SampleIdentity{};
438-
info.related_sample_identity = rtps::SampleIdentity{};
439-
440-
info.valid_data = false;
455+
generate_instance_info(info, instance_->first, instance);
441456
}
442457
}
443458

src/cpp/fastdds/subscriber/history/DataReaderHistory.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,13 @@ bool DataReaderHistory::get_first_untaken_info(
387387
ReadTakeCommand::generate_info(info, *(it.second), instance_change);
388388
return true;
389389
}
390+
391+
if (it.second->has_state_notification_sample)
392+
{
393+
// Generate SampleInfo for state notification sample
394+
ReadTakeCommand::generate_instance_info(info, it.first, *(it.second));
395+
return true;
396+
}
390397
}
391398

392399
return false;

test/blackbox/common/DDSBlackboxTestsDataReader.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ using namespace eprosima::fastdds;
4242
using namespace eprosima::fastdds::rtps;
4343

4444
#define INCOMPATIBLE_TEST_TOPIC_NAME std::string( \
45-
std::string("incompatible_") + TEST_TOPIC_NAME)
45+
std::string("incompatible_") + TEST_TOPIC_NAME)
4646

4747

4848
enum communication_type
@@ -59,11 +59,12 @@ class DDSDataReader : public testing::TestWithParam<communication_type>
5959
void SetUp() override
6060
{
6161
eprosima::fastdds::LibrarySettings library_settings;
62+
auto factory = eprosima::fastdds::dds::DomainParticipantFactory::get_shared_instance();
6263
switch (GetParam())
6364
{
6465
case INTRAPROCESS:
6566
library_settings.intraprocess_delivery = eprosima::fastdds::IntraprocessDeliveryType::INTRAPROCESS_FULL;
66-
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->set_library_settings(library_settings);
67+
factory->set_library_settings(library_settings);
6768
break;
6869
case DATASHARING:
6970
enable_datasharing = true;
@@ -77,11 +78,12 @@ class DDSDataReader : public testing::TestWithParam<communication_type>
7778
void TearDown() override
7879
{
7980
eprosima::fastdds::LibrarySettings library_settings;
81+
auto factory = eprosima::fastdds::dds::DomainParticipantFactory::get_shared_instance();
8082
switch (GetParam())
8183
{
8284
case INTRAPROCESS:
8385
library_settings.intraprocess_delivery = eprosima::fastdds::IntraprocessDeliveryType::INTRAPROCESS_OFF;
84-
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->set_library_settings(library_settings);
86+
factory->set_library_settings(library_settings);
8587
break;
8688
case DATASHARING:
8789
enable_datasharing = false;
@@ -1548,6 +1550,12 @@ TEST_P(DDSDataReader, return_sample_when_writer_disappears)
15481550
EXPECT_TRUE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available()));
15491551
EXPECT_EQ(listener.get_data_available_count(), 1u);
15501552

1553+
fdds::SampleInfo untaken_info;
1554+
EXPECT_EQ(data_reader.get_first_untaken_info(&untaken_info), fdds::RETCODE_OK);
1555+
1556+
EXPECT_TRUE(untaken_info.valid_data);
1557+
EXPECT_EQ(untaken_info.instance_state, fdds::ALIVE_INSTANCE_STATE);
1558+
15511559
fdds::SampleInfo info;
15521560
KeyedHelloWorldPubSubType::type sample;
15531561
EXPECT_EQ(data_reader.take_next_sample(&sample, &info), fdds::RETCODE_OK);
@@ -1569,12 +1577,19 @@ TEST_P(DDSDataReader, return_sample_when_writer_disappears)
15691577

15701578
// Verify expectations
15711579
{
1572-
fdds::SampleInfo info;
1573-
KeyedHelloWorldPubSubType::type sample;
1574-
15751580
EXPECT_TRUE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available()));
15761581
EXPECT_EQ(listener.get_data_available_count(), 2u);
15771582

1583+
fdds::SampleInfo untaken_info;
1584+
EXPECT_EQ(data_reader.get_first_untaken_info(&untaken_info), fdds::RETCODE_OK);
1585+
1586+
EXPECT_FALSE(untaken_info.valid_data);
1587+
EXPECT_EQ(untaken_info.instance_handle, instance_handle);
1588+
EXPECT_EQ(untaken_info.instance_state, fdds::NOT_ALIVE_NO_WRITERS_INSTANCE_STATE);
1589+
1590+
fdds::SampleInfo info;
1591+
KeyedHelloWorldPubSubType::type sample;
1592+
15781593
EXPECT_EQ(data_reader.take_next_sample(&sample, &info), fdds::RETCODE_OK);
15791594
EXPECT_FALSE(data_reader.get_status_changes().is_active(fdds::StatusMask::data_available()));
15801595

0 commit comments

Comments
 (0)