Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/messaging/ReliableMessageAnalyticsDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ class ReliableMessageAnalyticsDelegate
// retransmission attempt. A value of 1 indicates the first retransmission (i.e. the second
// transmission of the message). This value should never be 0.
std::optional<uint8_t> retransmissionCount;
// When eventType is kAcknowledged, this will be populated with the number of milliseconds
// that have elapsed between when the initial message was sent and when we received
// acknowledgment for the message.
std::optional<System::Clock::Milliseconds64> ackLatencyMs;
};

virtual void OnTransmitEvent(const TransmitEvent & event) = 0;
Expand Down
6 changes: 6 additions & 0 deletions src/messaging/ReliableMessageMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ void ReliableMessageMgr::NotifyMessageSendAnalytics(const RetransTableEntry & en
{
event.retransmissionCount = entry.sendCount;
}
if (eventType == ReliableMessageAnalyticsDelegate::EventType::kAcknowledged)
{
auto now = System::SystemClock().GetMonotonicTimestamp();
event.ackLatencyMs = now - entry.initialSentTime;
}

mAnalyticsDelegate->OnTransmitEvent(event);
}
Expand Down Expand Up @@ -325,6 +330,7 @@ void ReliableMessageMgr::StartRetransmision(RetransTableEntry * entry)
{
CalculateNextRetransTime(*entry);
#if CHIP_CONFIG_MRP_ANALYTICS_ENABLED
entry->initialSentTime = System::SystemClock().GetMonotonicTimestamp();
NotifyMessageSendAnalytics(*entry, entry->ec->GetSessionHandle(), ReliableMessageAnalyticsDelegate::EventType::kInitialSend);
#endif // CHIP_CONFIG_MRP_ANALYTICS_ENABLED
StartTimer();
Expand Down
3 changes: 3 additions & 0 deletions src/messaging/ReliableMessageMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ class ReliableMessageMgr
System::Clock::Timestamp nextRetransTime; /**< A counter representing the next retransmission time for the message. */
uint8_t sendCount; /**< The number of times we have tried to send this entry,
including both successfully and failure send. */
#if CHIP_CONFIG_MRP_ANALYTICS_ENABLED
System::Clock::Timestamp initialSentTime; /**< Timestamp when the initial message was sent */
#endif // CHIP_CONFIG_MRP_ANALYTICS_ENABLED
};

ReliableMessageMgr(ObjectPool<ExchangeContext, CHIP_CONFIG_MAX_EXCHANGE_CONTEXTS> & contextPool);
Expand Down
21 changes: 15 additions & 6 deletions src/messaging/tests/TestReliableMessageProtocol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2053,7 +2053,7 @@ TEST_F(TestReliableMessageProtocol, CheckApplicationResponseNeverComes)
}

#if CHIP_CONFIG_MRP_ANALYTICS_ENABLED
TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEventualSuccessForEsablishedCase)
TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEventualSuccessForEstablishedCase)
{
CHIP_ERROR err = CHIP_NO_ERROR;
// Make sure we are using CASE sessions, because there is no defunct-marking for PASE.
Expand All @@ -2076,9 +2076,10 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
TestReliablityAnalyticDelegate testAnalyticsDelegate;
rm->RegisterAnalyticsDelegate(&testAnalyticsDelegate);

constexpr auto kTestRetryInterval = System::Clock::Milliseconds32(30_ms32);
exchange->GetSessionHandle()->AsSecureSession()->SetRemoteSessionParameters(ReliableMessageProtocolConfig({
30_ms32, // CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL
30_ms32, // CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL
kTestRetryInterval, // CHIP_CONFIG_MRP_LOCAL_IDLE_RETRY_INTERVAL
kTestRetryInterval, // CHIP_CONFIG_MRP_LOCAL_ACTIVE_RETRY_INTERVAL
}));

const auto expectedFabricIndex = exchange->GetSessionHandle()->GetFabricIndex();
Expand All @@ -2102,7 +2103,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(loopback.mDroppedMessageCount, 1u);
EXPECT_EQ(rm->TestGetCountRetransTable(), 1);

// Wait for the initial message to fail (should take 330-413ms)
// Wait for the initial message to fail (should take less than 50ms)
GetIOContext().DriveIOUntil(1000_ms32, [&] { return loopback.mSentMessageCount >= 2; });
DrainAndServiceIO();

Expand Down Expand Up @@ -2145,6 +2146,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(firstTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(firstTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kInitialSend);
EXPECT_EQ(firstTransmitEvent.retransmissionCount, std::nullopt);
EXPECT_EQ(firstTransmitEvent.ackLatencyMs, std::nullopt);
// We have no way of validating the first messageCounter since this is a randomly generated value, but it should
// remain constant for all subsequent transmit events in this test.
const uint32_t messageCounter = firstTransmitEvent.messageCounter;
Expand All @@ -2155,6 +2157,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(secondTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(secondTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission);
EXPECT_EQ(secondTransmitEvent.retransmissionCount, 1);
EXPECT_EQ(secondTransmitEvent.ackLatencyMs, std::nullopt);
EXPECT_EQ(messageCounter, secondTransmitEvent.messageCounter);

testAnalyticsDelegate.mTransmitEvents.pop();
Expand All @@ -2163,6 +2166,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(thirdTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(thirdTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission);
EXPECT_EQ(thirdTransmitEvent.retransmissionCount, 2);
EXPECT_EQ(thirdTransmitEvent.ackLatencyMs, std::nullopt);
EXPECT_EQ(messageCounter, thirdTransmitEvent.messageCounter);

testAnalyticsDelegate.mTransmitEvents.pop();
Expand All @@ -2171,6 +2175,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(fourthTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(fourthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission);
EXPECT_EQ(fourthTransmitEvent.retransmissionCount, 3);
EXPECT_EQ(fourthTransmitEvent.ackLatencyMs, std::nullopt);
EXPECT_EQ(messageCounter, fourthTransmitEvent.messageCounter);

testAnalyticsDelegate.mTransmitEvents.pop();
Expand All @@ -2179,6 +2184,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(fifthTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(fifthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission);
EXPECT_EQ(fifthTransmitEvent.retransmissionCount, 4);
EXPECT_EQ(fifthTransmitEvent.ackLatencyMs, std::nullopt);
EXPECT_EQ(messageCounter, fifthTransmitEvent.messageCounter);

testAnalyticsDelegate.mTransmitEvents.pop();
Expand All @@ -2187,10 +2193,13 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven
EXPECT_EQ(sixthTransmitEvent.fabricIndex, expectedFabricIndex);
EXPECT_EQ(sixthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kAcknowledged);
EXPECT_EQ(sixthTransmitEvent.retransmissionCount, std::nullopt);
EXPECT_TRUE(sixthTransmitEvent.ackLatencyMs.has_value());
auto expectedMinimumAckLatencyTime = System::Clock::Milliseconds64(kTestRetryInterval * 5);
EXPECT_GT(sixthTransmitEvent.ackLatencyMs, expectedMinimumAckLatencyTime);
EXPECT_EQ(messageCounter, sixthTransmitEvent.messageCounter);
}

TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFailureForEsablishedCase)
TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFailureForEstablishedCase)
{
CHIP_ERROR err = CHIP_NO_ERROR;
// Make sure we are using CASE sessions, because there is no defunct-marking for PASE.
Expand Down Expand Up @@ -2332,7 +2341,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFail
EXPECT_EQ(messageCounter, sixthTransmitEvent.messageCounter);
}

TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEsablishedPase)
TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEstablishedPase)
{
CHIP_ERROR err = CHIP_NO_ERROR;
chip::System::PacketBufferHandle buffer = chip::MessagePacketBuffer::NewWithData(PAYLOAD, sizeof(PAYLOAD));
Expand Down
Loading