From 3c62a2961987a62146728c6b8533dff7413d25b6 Mon Sep 17 00:00:00 2001 From: linan24 Date: Mon, 26 May 2025 21:32:16 +0800 Subject: [PATCH] fix stability issue Signed-off-by: linan24 --- .../backup_kit_inner/src/service_client.cpp | 1 + .../backup_sa/include/module_ipc/service.h | 2 + .../src/module_ipc/service_incremental.cpp | 41 +++++++++++++------ .../module_ipc/service_incremental_test.cpp | 22 +++++++--- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/frameworks/native/backup_kit_inner/src/service_client.cpp b/frameworks/native/backup_kit_inner/src/service_client.cpp index f4af54168..0fbf3f9d1 100644 --- a/frameworks/native/backup_kit_inner/src/service_client.cpp +++ b/frameworks/native/backup_kit_inner/src/service_client.cpp @@ -42,6 +42,7 @@ bool ServiceClient::CheckServiceProxy() sptr ServiceClient::GetServiceProxyPointer() { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + unique_lock lock(proxyMutex_); return serviceProxy_; } diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index aa7913f2c..9398f2d2c 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -649,6 +649,8 @@ private: void CancelTask(std::string bundleName, wptr ptr); + bool CancelSessionClean(sptr session, std::string bundleName); + void SetUserIdAndRestoreType(RestoreTypeEnum restoreType, int32_t userId); ErrCode VerifySendRateParam(); diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 2215a7110..6d8469981 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -966,6 +966,34 @@ void Service::SetBundleIncDataInfo(const std::vector& bundlesT } } +bool Service::CancelSessionClean(sptr session, std::string bundleName) +{ + if (session == nullptr) { + HILOGE("Session is nullptr"); + return false; + } + auto connectionWptr = session->GetExtConnection(bundleName); + if (connectionWptr == nullptr) { + HILOGE("connectionWptr is null."); + return false; + } + auto backUpConnection = connectionWptr.promote(); + if (backUpConnection == nullptr) { + HILOGE("Promote backUpConnection ptr is null."); + return false; + } + auto proxy = backUpConnection->GetBackupExtProxy(); + if (!proxy) { + HILOGE("Extension backup Proxy is empty."); + return false; + } + proxy->HandleClear(); + session->StopFwkTimer(bundleName); + session->StopExtTimer(bundleName); + backUpConnection->DisconnectBackupExtAbility(); + return true; +} + void Service::CancelTask(std::string bundleName, wptr ptr) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); @@ -987,20 +1015,9 @@ void Service::CancelTask(std::string bundleName, wptr ptr) } do { std::lock_guard lock(mutexPtr->callbackMutex); - auto backUpConnection = session->GetExtConnection(bundleName); - if (backUpConnection == nullptr) { - HILOGE("Promote backUpConnection ptr is null."); - break; - } - auto proxy = backUpConnection->GetBackupExtProxy(); - if (!proxy) { - HILOGE("Extension backup Proxy is empty."); + if (!CancelSessionClean(session, bundleName)) { break; } - proxy->HandleClear(); - session->StopFwkTimer(bundleName); - session->StopExtTimer(bundleName); - backUpConnection->DisconnectBackupExtAbility(); thisPtr->ClearSessionAndSchedInfo(bundleName); IServiceReverseType::Scenario scenario = session->GetScenario(); if ((scenario == IServiceReverseType::Scenario::BACKUP && session->GetIsIncrementalBackup()) || diff --git a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp index 5813e2ea9..fdb43da06 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -1764,12 +1764,17 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0000, TestSiz service->CancelTask("", service); EXPECT_TRUE(true); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + std::string bundleName = "123"; + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; + auto callConnected = [](const string &&bundleName) {}; + auto connectPtr = sptr(new SvcBackupConnection(callDied, callConnected, bundleName)); + + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(nullptr)); service->CancelTask("", service); EXPECT_TRUE(true); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(false)); @@ -1779,7 +1784,7 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0000, TestSiz service->CancelTask("", service); EXPECT_TRUE(true); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(false)); @@ -1809,7 +1814,12 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0100, TestSiz { GTEST_LOG_(INFO) << "ServiceIncrementalTest-begin SUB_ServiceIncremental_CancelTask_0100"; try { - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + std::string bundleName = "123"; + auto callDied = [](const string &&bundleName, bool isCleanCalled) {}; + auto callConnected = [](const string &&bundleName) {}; + auto connectPtr = sptr(new SvcBackupConnection(callDied, callConnected, bundleName)); + + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(false)); @@ -1821,7 +1831,7 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0100, TestSiz service->CancelTask("", service); EXPECT_TRUE(true); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)); + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(false)); @@ -1832,7 +1842,7 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_CancelTask_0100, TestSiz service->CancelTask("", service); EXPECT_TRUE(true); - EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(connect)).WillOnce(Return(nullptr)); + EXPECT_CALL(*session, GetExtConnection(_)).WillOnce(Return(wptr(connectPtr))).WillOnce(Return(nullptr)); EXPECT_CALL(*connect, GetBackupExtProxy()).WillOnce(Return(svcProxy)); EXPECT_CALL(*svcProxy, HandleClear()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*session, StopFwkTimer(_)).WillOnce(Return(false)); -- Gitee