diff --git a/frameworks/native/backup_kit_inner/src/service_client.cpp b/frameworks/native/backup_kit_inner/src/service_client.cpp index f4af5416867c6b4a15f85c155c7c706a67534921..0fbf3f9d1256677f2b8165da1dd8aef0f8cbedc5 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 aa7913f2c3cabaeec00a46619956c4a2bffdb155..9398f2d2ccbd6ceb82e05243f7a23c775d8996b1 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 2215a7110019520e60ea98e957f2f62f97867af4..6d84699810a97fa4e3e22ceca40bfb5059e2f632 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 5813e2ea9e089408d78b76435b7a47d5d7c2411c..fdb43da0616b9ef8445ffb619e90eaacd9c6434e 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));