From 5cf58549afc6e6aa4cdea8ce2e5a068e0accad18 Mon Sep 17 00:00:00 2001 From: hunili Date: Tue, 17 Dec 2024 19:48:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=9A=E6=AC=A1kill=EF=BC=8C=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E6=81=A2=E5=A4=8D=E5=8D=A1=E4=BD=8F=20issue:https://g?= =?UTF-8?q?itee.com/openharmony/filemanagement=5Fapp=5Ffile=5Fservice/issu?= =?UTF-8?q?es/IBBXV2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hunili --- .../backup_sa/include/module_ipc/service.h | 2 +- .../module_ipc/svc_backup_connection.h | 6 ++--- services/backup_sa/src/module_ipc/service.cpp | 12 ++++++--- .../backup_sa/src/module_ipc/sub_service.cpp | 4 ++- .../src/module_ipc/svc_backup_connection.cpp | 27 ++++++++++--------- .../src/module_ipc/svc_session_manager.cpp | 4 +-- tests/mock/module_ipc/service_mock.cpp | 2 +- .../module_ipc/svc_backup_connection_mock.cpp | 2 +- .../module_ipc/svc_session_manager_mock.cpp | 2 +- .../backup_sa/module_ipc/service_test.cpp | 6 ++--- .../module_ipc/svc_backup_connection_test.cpp | 6 ++--- 11 files changed, 41 insertions(+), 32 deletions(-) diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index 1b9d438e8..9e0416641 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -125,7 +125,7 @@ public: * * @param bundleName 应用名称 */ - void OnBackupExtensionDied(const std::string &&bundleName, bool isSecondCalled = false); + void OnBackupExtensionDied(const std::string &&bundleName, bool isCleanCalled = false); /** * @brief extension启动连接成功 diff --git a/services/backup_sa/include/module_ipc/svc_backup_connection.h b/services/backup_sa/include/module_ipc/svc_backup_connection.h index abff875c6..8b6c2477c 100644 --- a/services/backup_sa/include/module_ipc/svc_backup_connection.h +++ b/services/backup_sa/include/module_ipc/svc_backup_connection.h @@ -49,7 +49,7 @@ public: /** * @brief connect remote ability of ExtBackup. */ - ErrCode ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId); + ErrCode ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId, bool isCleanCalled); /** * @brief disconnect remote ability of ExtBackup. @@ -104,8 +104,8 @@ private: std::condition_variable condition_; std::condition_variable waitCondition_; std::atomic isConnected_ = {false}; - std::atomic isConnectedDone_ = {false}; - std::atomic isSecondOnDisCon_ = {false}; + std::atomic isCleanCalled_ = {false}; + std::atomic isConnectCalled_ = {false}; sptr backupProxy_; std::function callDied_; diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index d68d6a415..e5c756441 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -1027,9 +1027,15 @@ ErrCode Service::GetFileHandle(const string &bundleName, const string &fileName) } } -void Service::OnBackupExtensionDied(const string &&bundleName, bool isSecondCalled) +void Service::OnBackupExtensionDied(const string &&bundleName, bool isCleanCalled) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + if (isCleanCalled) { + HILOGE("Backup <%{public}s> Extension Process second Died", bundleName.c_str()); + ClearSessionAndSchedInfo(bundleName); + OnAllBundlesFinished(BError(BError::Codes::OK)); + return; + } try { string callName = move(bundleName); HILOGE("Backup <%{public}s> Extension Process Died", callName.c_str()); @@ -1553,7 +1559,7 @@ std::function Service::GetBackupInfoConnectDone(wptr std::function Service::GetBackupInfoConnectDied( wptr obj, std::string &bundleName) { - return [obj](const string &&bundleName, bool isSecondCalled) { + return [obj](const string &&bundleName, bool isCleanCalled) { HILOGI("GetBackupInfoConnectDied, bundleName: %{public}s", bundleName.c_str()); auto thisPtr = obj.promote(); if (!thisPtr) { @@ -1608,7 +1614,7 @@ ErrCode Service::GetBackupInfoCmdHandle(BundleName &bundleName, std::string &res backupConnection->SetCallback(callConnected); backupConnection->SetCallDied(callDied); AAFwk::Want want = CreateConnectWant(bundleName); - auto ret = backupConnection->ConnectBackupExtAbility(want, session_->GetSessionUserId()); + auto ret = backupConnection->ConnectBackupExtAbility(want, GetUserIdDefault(), false); if (ret) { HILOGE("ConnectBackupExtAbility faild, bundleName:%{public}s, ret:%{public}d", bundleName.c_str(), ret); return BError(BError::Codes::SA_BOOT_EXT_FAIL); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 96c10ca86..fd7a17082 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -250,7 +250,9 @@ ErrCode Service::LaunchBackupExtension(const BundleName &bundleName) HILOGE("LaunchBackupExtension error, WaitDisconnectDone failed"); return BError(BError::Codes::SA_INVAL_ARG); } - ErrCode ret = backUpConnection->ConnectBackupExtAbility(want, session_->GetSessionUserId()); + BConstants::ServiceSchedAction bundleAction = session_->GetServiceSchedAction(bundleName); + ErrCode ret = backUpConnection->ConnectBackupExtAbility(want, session_->GetSessionUserId(), + bundleAction == BConstants::ServiceSchedAction::CLEAN); if (ret) { HILOGE("ConnectBackupExtAbility faild, bundleName:%{public}s, ret:%{public}d", bundleName.c_str(), ret); ExtensionConnectFailRadarReport(bundleName, ret, scenario); diff --git a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp index 8fc298baa..7dc6d5eec 100644 --- a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp +++ b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp @@ -87,26 +87,27 @@ void SvcBackupConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName return; } bundleName = bundleNameIndexInfo_; - if (isSecondOnDisCon_ == false) { - isSecondOnDisCon_.store(true); - } else { - HILOGE("It's error that the backup extension second died before the backup sa. name : %{public}s", - bundleName.data()); - callDied_(move(bundleName), true); - } - if (isConnectedDone_ == false) { - isConnectedDone_.store(true); - HILOGE("It's error that the backup extension dies before the backup sa. name : %{public}s", bundleName.data()); - callDied_(move(bundleName), false); + if (isConnectCalled_ == true) { + if (isCleanCalled_ == true) { + HILOGE("It's error that the backup extension clean died before the backup sa. name : %{public}s", + bundleName.data()); + callDied_(move(bundleName), true); + } else { + HILOGE("It's error that the backup extension died before the backup sa. name : %{public}s", + bundleName.data()); + callDied_(move(bundleName), false); + } } condition_.notify_all(); waitCondition_.notify_all(); HILOGI("called end, name: %{public}s", bundleNameIndexInfo_.c_str()); } -ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId) +ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId, bool isCleanCalled) { HILOGI("Called begin"); + isCleanCalled_.store(isCleanCalled); + isConnectCalled_.store(true); std::unique_lock lock(mutex_); ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, userId); HILOGI("Called end, ret=%{public}d, userId=%{public}d.", ret, userId); @@ -116,7 +117,7 @@ ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t ErrCode SvcBackupConnection::DisconnectBackupExtAbility() { HILOGI("called begin"); - isConnectedDone_.store(true); + isConnectCalled_.store(false); std::unique_lock lock(mutex_); ErrCode ret = AppExecFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); auto callback = [extConn {wptr(this)}] { diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index aebfe1d91..367e70551 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -280,14 +280,14 @@ std::weak_ptr SvcSessionManager::GetSAExtConnection(const Bu sptr SvcSessionManager::GetBackupAbilityExt(const string &bundleName) { - auto callDied = [revPtr {reversePtr_}](const string &&bundleName, bool isSecondCalled = false) { + auto callDied = [revPtr {reversePtr_}](const string &&bundleName, bool isCleanCalled = false) { auto revPtrStrong = revPtr.promote(); if (!revPtrStrong) { // 服务先于客户端死亡是一种异常场景,但该场景对本流程来说也没什么影响,所以只是简单记录一下 HILOGW("It's curious that the backup sa dies before the backup client"); return; } - revPtrStrong->OnBackupExtensionDied(move(bundleName), isSecondCalled); + revPtrStrong->OnBackupExtensionDied(move(bundleName), isCleanCalled); }; auto callConnected = [revPtr {reversePtr_}](const string &&bundleName) { diff --git a/tests/mock/module_ipc/service_mock.cpp b/tests/mock/module_ipc/service_mock.cpp index a03e7285e..9566b8f5c 100644 --- a/tests/mock/module_ipc/service_mock.cpp +++ b/tests/mock/module_ipc/service_mock.cpp @@ -123,7 +123,7 @@ ErrCode Service::GetFileHandle(const string &bundleName, const string &fileName) return BError(BError::Codes::OK); } -void Service::OnBackupExtensionDied(const string &&bundleName, bool isSecondCalled) {} +void Service::OnBackupExtensionDied(const string &&bundleName, bool isCleanCalled) {} void Service::ExtConnectDied(const string &callName) {} diff --git a/tests/mock/module_ipc/svc_backup_connection_mock.cpp b/tests/mock/module_ipc/svc_backup_connection_mock.cpp index 8e06902e2..001f3dee2 100644 --- a/tests/mock/module_ipc/svc_backup_connection_mock.cpp +++ b/tests/mock/module_ipc/svc_backup_connection_mock.cpp @@ -45,7 +45,7 @@ void SvcBackupConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName callDied_(move(bundleName), false); } -ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId) +ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t userId, bool isCleanCalled) { return 0; } diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index ba5f6a5c6..257ad09c2 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -102,7 +102,7 @@ wptr SvcSessionManager::GetExtConnection(const BundleName & return nullptr; } if (!it->second.backUpConnection) { - auto callDied = [](const string &&bundleName, bool isSecondCalled = false) {}; + auto callDied = [](const string &&bundleName, bool isCleanCalled = false) {}; auto callConnected = [](const string &&bundleName) {}; it->second.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, bundleName)); diff --git a/tests/unittests/backup_sa/module_ipc/service_test.cpp b/tests/unittests/backup_sa/module_ipc/service_test.cpp index 9065de6ca..a459eca47 100644 --- a/tests/unittests/backup_sa/module_ipc/service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_test.cpp @@ -581,7 +581,7 @@ HWTEST_F(ServiceTest, SUB_Service_GetFileHandle_0101, testing::ext::TestSize.Lev SvcSessionManager::Impl impl_; impl_.clientToken = 1; BackupExtInfo extInfo {}; - auto callDied = [](const string &&bundleName, bool isSecondCalled) {}; + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; auto callConnected = [](const string &&bundleName) {}; extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, BUNDLE_NAME)); extInfo.schedAction = BConstants::ServiceSchedAction::RUNNING; @@ -723,7 +723,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtStart_0101, testing::ext::TestSize.Level1) SvcSessionManager::Impl impl_; impl_.clientToken = 1; BackupExtInfo extInfo {}; - auto callDied = [](const string &&bundleName, bool isSecondCalled) {}; + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; auto callConnected = [](const string &&bundleName) {}; extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, BUNDLE_NAME)); extInfo.backUpConnection->backupProxy_ = nullptr; @@ -1590,7 +1590,7 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0100, testing::ext::TestSize.Le SvcSessionManager::Impl impl_; impl_.clientToken = 1; BackupExtInfo extInfo {}; - auto callDied = [](const string &&bundleName, bool isSecondCalled) {}; + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; auto callConnected = [](const string &&bundleName) {}; extInfo.backUpConnection = sptr(new SvcBackupConnection(callDied, callConnected, BUNDLE_NAME)); impl_.backupExtNameMap[BUNDLE_NAME] = extInfo; diff --git a/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp index 886618eb6..bcc180e3c 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_backup_connection_test.cpp @@ -41,7 +41,7 @@ public: static inline shared_ptr castMock = nullptr; }; -static void CallDied(const std::string &&name, bool isSecondCalled) +static void CallDied(const std::string &&name, bool isCleanCalled) { GTEST_LOG_(INFO) << "ServiceReverseProxyTest-CallDied SUCCESS"; } @@ -114,12 +114,12 @@ HWTEST_F(SvcBackupConnectionTest, SUB_BackupConnection_OnAbilityDisconnectDone_0 int resultCode = 1; EXPECT_TRUE(backupCon_ != nullptr); - backupCon_->isConnectedDone_ = false; + backupCon_->isConnectCalled_ = false; backupCon_->OnAbilityDisconnectDone(element, resultCode); bool ret = backupCon_->IsExtAbilityConnected(); EXPECT_FALSE(ret); - backupCon_->isConnectedDone_ = true; + backupCon_->isConnectCalled_ = true; backupCon_->OnAbilityDisconnectDone(element, resultCode); ret = backupCon_->IsExtAbilityConnected(); EXPECT_FALSE(ret); -- Gitee