diff --git a/src/app/InteractionModelEngine.cpp b/src/app/InteractionModelEngine.cpp index 6a96afcf29429d..6003b208d3f66d 100644 --- a/src/app/InteractionModelEngine.cpp +++ b/src/app/InteractionModelEngine.cpp @@ -723,7 +723,7 @@ Protocols::InteractionModel::Status InteractionModelEngine::OnReadInitialRequest if (handler->IsFromSubscriber(*apExchangeContext)) { ChipLogProgress(InteractionModel, - "Deleting previous subscription from NodeId: " ChipLogFormatX64 ", FabricIndex: %u", + "Deleting previous active subscription from NodeId: " ChipLogFormatX64 ", FabricIndex: %u", ChipLogValueX64(apExchangeContext->GetSessionHandle()->AsSecureSession()->GetPeerNodeId()), apExchangeContext->GetSessionHandle()->GetFabricIndex()); handler->Close(); @@ -731,6 +731,39 @@ Protocols::InteractionModel::Status InteractionModelEngine::OnReadInitialRequest return Loop::Continue; }); + +#if CHIP_CONFIG_PERSIST_SUBSCRIPTIONS && CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION + if (mpSubscriptionResumptionStorage != nullptr) + { + SubscriptionResumptionStorage::SubscriptionInfo subscriptionInfo; + auto * iterator = mpSubscriptionResumptionStorage->IterateSubscriptions(); + + while (iterator->Next(subscriptionInfo)) + { + if (subscriptionInfo.mNodeId == apExchangeContext->GetSessionHandle()->AsSecureSession()->GetPeerNodeId() && + subscriptionInfo.mFabricIndex == apExchangeContext->GetSessionHandle()->GetFabricIndex()) + { + ChipLogProgress(InteractionModel, + "Deleting previous non-active subscription from NodeId: " ChipLogFormatX64 + ", FabricIndex: %u, SubscriptionId: 0x%" PRIx32, + ChipLogValueX64(subscriptionInfo.mNodeId), subscriptionInfo.mFabricIndex, + subscriptionInfo.mSubscriptionId); + mpSubscriptionResumptionStorage->Delete(subscriptionInfo.mNodeId, subscriptionInfo.mFabricIndex, + subscriptionInfo.mSubscriptionId); + } + } + iterator->Release(); + + // If we have no subscriptions to resume, we can cancel the timer, which might be armed + // if one of the subscriptions we deleted was about to be resumed. + if (!HasSubscriptionsToResume()) + { + mpExchangeMgr->GetSessionManager()->SystemLayer()->CancelTimer(ResumeSubscriptionsTimerCallback, this); + mSubscriptionResumptionScheduled = false; + mNumSubscriptionResumptionRetries = 0; + } + } +#endif // CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION && CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION } {