diff --git a/interfaces/inner_api/dataobs_manager/include/dataobs_mgr_client.h b/interfaces/inner_api/dataobs_manager/include/dataobs_mgr_client.h index 4c5a95a6338bfa145e2f760dc3556d89bebd67c0..e901b98cd72dcba6f74a1b842841df69a708064e 100644 --- a/interfaces/inner_api/dataobs_manager/include/dataobs_mgr_client.h +++ b/interfaces/inner_api/dataobs_manager/include/dataobs_mgr_client.h @@ -158,6 +158,8 @@ private: void ResetService(); void OnRemoteDied(); void ReRegister(); + int32_t TryRegisterObserver(const Uri &uri, sptr key, int userId, + bool isExtension, DataObsOption opt = {}); class ServiceDeathRecipient : public IRemoteObject::DeathRecipient { public: @@ -165,16 +167,17 @@ private: void OnRemoteDied(const wptr &object) override { auto serviceClient = owner_.lock(); - if (serviceClient != nullptr) { + if (serviceClient != nullptr && isFirst) { + isFirst = false; serviceClient->OnRemoteDied(); } } private: + bool isFirst = true; std::weak_ptr owner_; }; - static constexpr int RESUB_INTERVAL = 2; static std::mutex mutex_; sptr dataObsManger_; diff --git a/services/dataobsmgr/src/dataobs_mgr_client.cpp b/services/dataobsmgr/src/dataobs_mgr_client.cpp index b58a4deb39d612842ab98b0878ca985d6bda08c8..2ec12e7c8800636a0a093401ac84ed1721579f3f 100644 --- a/services/dataobsmgr/src/dataobs_mgr_client.cpp +++ b/services/dataobsmgr/src/dataobs_mgr_client.cpp @@ -50,8 +50,10 @@ void DataObsMgrClient::SystemAbilityStatusChangeListener::OnAddSystemAbility( { TAG_LOGI(AAFwkTag::DBOBSMGR, "called"); if (systemAbilityId != DATAOBS_MGR_SERVICE_SA_ID) { + TAG_LOGE(AAFwkTag::DBOBSMGR, "OnAddSystemAbility! systemAbilityId:%{public}d", systemAbilityId); return; } + GetInstance()->ResetService(); GetInstance()->ReRegister(); } @@ -332,19 +334,35 @@ void DataObsMgrClient::ResetService() void DataObsMgrClient::OnRemoteDied() { - std::this_thread::sleep_for(std::chrono::seconds(RESUB_INTERVAL)); - ResetService(); - auto [errCode, dataObsManger] = GetObsMgr(); - if (errCode != SUCCESS) { - sptr systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); - if (systemManager == nullptr) { - TAG_LOGE(AAFwkTag::DBOBSMGR, "null systemmgr"); - return; - } - systemManager->SubscribeSystemAbility(DATAOBS_MGR_SERVICE_SA_ID, callback_); + sptr systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + if (systemManager == nullptr) { + TAG_LOGE(AAFwkTag::DBOBSMGR, "null systemmgr"); return; } - ReRegister(); + systemManager->SubscribeSystemAbility(DATAOBS_MGR_SERVICE_SA_ID, callback_); +} + +int32_t DataObsMgrClient::TryRegisterObserver(const Uri &uri, sptr key, int userId, + bool isExtension, DataObsOption opt) +{ + int32_t ret; + int retryCount = 0; + const int maxRetries = 3; + do { + if (isExtension) { + ret = RegisterObserverFromExtension(uri, key, userId, opt); + } else { + ret = RegisterObserver(uri, key, userId); + } + if (ret != SUCCESS) { + TAG_LOGE(AAFwkTag::DBOBSMGR, + "RegisterObserver failed, uri:%{public}s, ret:%{public}d, isExtension %{public}d, attempt:%{public}d", + CommonUtils::Anonymous(uri.ToString()).c_str(), ret, isExtension, retryCount + 1 + ); + } + ++retryCount; + } while (ret != SUCCESS && retryCount < maxRetries); + return ret; } void DataObsMgrClient::ReRegister() @@ -353,29 +371,24 @@ void DataObsMgrClient::ReRegister() observers_.Clear(); observers.ForEach([this](const auto &key, const auto &value) { for (const auto &val : value) { - int32_t ret; - if (val.isExtension) { - DataObsOption opt; - opt.SetFirstCallerTokenID(val.firstCallerTokenID); - ret = RegisterObserverFromExtension(val.uri, key, val.userId, opt); - } else { - ret = RegisterObserver(val.uri, key, val.userId); - } + int32_t ret = (val.isExtension) + ? TryRegisterObserver(val.uri, key, val.userId, true, DataObsOption{val.firstCallerTokenID}) + : TryRegisterObserver(val.uri, key, val.userId, false); + if (ret != SUCCESS) { - LOG_ERROR("RegisterObserver failed, uri:%{public}s, ret:%{public}d, isExtension %{public}d", - CommonUtils::Anonymous(val.uri.ToString()).c_str(), ret, val.isExtension); + TAG_LOGE(AAFwkTag::DBOBSMGR, "RegisterObserver failed after 3 attempts, uri:%{public}s, ret:%{public}d", + CommonUtils::Anonymous(val.uri.ToString()).c_str(), ret); } } return false; }); - decltype(observerExts_) observerExts(std::move(observerExts_)); observerExts_.Clear(); observerExts.ForEach([this](const auto &key, const auto &value) { for (const auto ¶m : value) { - auto ret = RegisterObserverExt(param.uri, key, param.isDescendants); + int32_t ret = RegisterObserverExt(param.uri, key, param.isDescendants); if (ret != SUCCESS) { - LOG_ERROR( + TAG_LOGE(AAFwkTag::DBOBSMGR, "RegisterObserverExt failed, param.uri:%{public}s, ret:%{public}d, param.isDescendants:%{public}d", CommonUtils::Anonymous(param.uri.ToString()).c_str(), ret, param.isDescendants ); @@ -384,5 +397,6 @@ void DataObsMgrClient::ReRegister() return false; }); } + } // namespace AAFwk } // namespace OHOS