From 01f3387ab066450f9212f00a2530585e1500d913 Mon Sep 17 00:00:00 2001 From: "yaoruozi1@huawei.com" Date: Sat, 14 Sep 2024 12:14:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A6=96=E6=AC=A1=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E8=B6=85=E6=97=B6=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yaoruozi1@huawei.com --- .../native/backup_ext/include/ext_extension.h | 10 +++--- .../native/backup_ext/src/ext_extension.cpp | 24 ++++++++----- .../backup_ext/src/sub_ext_extension.cpp | 34 +++++++++++++++---- utils/include/b_resources/b_constants.h | 1 + 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 7d3090684..e9465ec41 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -171,7 +171,7 @@ private: void DoUser0Backup(const BJsonEntityExtensionConfig &usrConfig); int User0DoBackup(const BJsonEntityExtensionConfig &usrConfig); - + int DoIncrementalBackup(const std::vector &allFiles, const std::vector &smallFiles, const std::vector &bigFiles); @@ -270,7 +270,7 @@ private: void DealIncreUnPacketResult(const off_t tarFileSize, const std::string &tarFileName, const std::tuple &result); - void StartOnProcessTaskThread(wptr obj, BackupRestoreScenario scenario); + ErrCode StartOnProcessTaskThread(wptr obj, BackupRestoreScenario scenario); void FinishOnProcessTask(); void ExecCallOnProcessTask(wptr obj, BackupRestoreScenario scenario); void AsyncCallJsOnProcessTask(wptr obj, BackupRestoreScenario scenario); @@ -302,15 +302,17 @@ private: std::thread callJsOnProcessThread_; Utils::Timer onProcessTimeoutTimer_ {"onProcessTimeoutTimer_"}; uint32_t onProcessTimeoutTimerId_ { 0 }; - std::atomic onProcessTimeoutCnt_; + std::atomic onProcessTimeoutCnt_ { 0 }; std::atomic stopCallJsOnProcess_ {false}; std::condition_variable execOnProcessCon_; std::mutex onProcessLock_; std::atomic onProcessTimeout_ {false}; std::chrono::time_point g_onStart; std::mutex onStartTimeLock_; - OHOS::ThreadPool onProcessTaskPool_; AppRadar::DoRestoreInfo radarRestoreInfo_ { 0 }; + OHOS::ThreadPool onProcessTaskPool_; + std::atomic isFirstCallOnProcess_ { false }; + std::atomic isExecAppDone_ { false }; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 5bf369cce..19fc8d02f 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -1368,7 +1368,10 @@ void BackupExtExtension::AsyncTaskRestoreForUpgrade() HILOGE("On restore, start ext timer fail."); return; } - ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_RESTORE); + if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_RESTORE)) != ERR_OK) { + HILOGE("Call onProcess result is timeout"); + return; + } auto callBackup = ptr->OnRestoreCallback(obj); auto callBackupEx = ptr->OnRestoreExCallback(obj); ptr->UpdateOnStartTime(); @@ -1419,7 +1422,10 @@ void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() HILOGE("On incrementalRestore, start ext timer fail."); return; } - ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_RESTORE); + if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_RESTORE)) != ERR_OK) { + HILOGE("Call onProcess result is timeout"); + return; + } auto callBackup = ptr->IncreOnRestoreCallback(obj); auto callBackupEx = ptr->IncreOnRestoreExCallback(obj); ptr->UpdateOnStartTime(); @@ -1432,10 +1438,6 @@ void BackupExtExtension::AsyncTaskIncrementalRestoreForUpgrade() } catch (const BError &e) { ptr->AppIncrementalDone(e.GetCode()); ptr->DoClear(); - } catch (const exception &e) { - HILOGE("Catched an unexpected low-level exception %{public}s", e.what()); - ptr->AppIncrementalDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); - ptr->DoClear(); } catch (...) { HILOGE("Failed to restore the ext bundle"); ptr->AppIncrementalDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); @@ -1566,7 +1568,10 @@ void BackupExtExtension::AsyncTaskOnBackup() BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { - ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_BACKUP); + if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::FULL_BACKUP)) != ERR_OK) { + HILOGE("Call onProcess result is timeout"); + return; + } auto callBackup = ptr->OnBackupCallback(obj); auto callBackupEx = ptr->OnBackupExCallback(obj); ptr->UpdateOnStartTime(); @@ -1948,7 +1953,10 @@ void BackupExtExtension::AsyncTaskOnIncrementalBackup() BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "Extension handle have been released"); try { - ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_BACKUP); + if ((ptr->StartOnProcessTaskThread(obj, BackupRestoreScenario::INCREMENTAL_BACKUP)) != ERR_OK) { + HILOGE("Call onProcess result is timeout"); + return; + } auto callBackup = ptr->IncOnBackupCallback(obj); auto callBackupEx = ptr->IncOnBackupExCallback(obj); ptr->UpdateOnStartTime(); diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index e1225f60e..9dca70fc3 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -598,6 +598,7 @@ void BackupExtExtension::ReportAppProcessInfo(const std::string processInfo, Bac HILOGE("Report app process error, proxy is empty"); return; } + HILOGI("Will notify backup sa process result"); auto ret = proxy->ReportAppProcessInfo(processInfo, scenario); if (ret != ERR_OK) { HILOGE("Report app process error, ipc failed, ret:%{public}d", ret); @@ -605,12 +606,17 @@ void BackupExtExtension::ReportAppProcessInfo(const std::string processInfo, Bac } } -void BackupExtExtension::StartOnProcessTaskThread(wptr obj, BackupRestoreScenario scenario) +ErrCode BackupExtExtension::StartOnProcessTaskThread(wptr obj, BackupRestoreScenario scenario) { HILOGI("Begin Create onProcess Task Thread"); onProcessTimeoutTimer_.Setup(); + isFirstCallOnProcess_.store(true); StartOnProcessTimeOutTimer(obj, scenario); SyncCallJsOnProcessTask(obj, scenario); + if (isExecAppDone_.load()) { + HILOGE("Call onProcess timeout, Current extension finished"); + return BError(BError::Codes::EXT_ABILITY_TIMEOUT); + } callJsOnProcessThread_ = std::thread([obj, scenario]() { auto extPtr = obj.promote(); if (extPtr == nullptr) { @@ -620,11 +626,13 @@ void BackupExtExtension::StartOnProcessTaskThread(wptr obj, extPtr->ExecCallOnProcessTask(obj, scenario); }); HILOGI("End Create onProcess Task End"); + return BError(BError::Codes::OK); } void BackupExtExtension::ExecCallOnProcessTask(wptr obj, BackupRestoreScenario scenario) { HILOGI("Begin"); + isFirstCallOnProcess_.store(false); while (!stopCallJsOnProcess_.load()) { std::unique_lock lock(onProcessLock_); execOnProcessCon_.wait_for(lock, std::chrono::seconds(BConstants::CALL_APP_ON_PROCESS_TIME_INTERVAL), @@ -634,8 +642,8 @@ void BackupExtExtension::ExecCallOnProcessTask(wptr obj, Bac return; } HILOGI("Continue call js method onProcess"); - AsyncCallJsOnProcessTask(obj, scenario); StartOnProcessTimeOutTimer(obj, scenario); + AsyncCallJsOnProcessTask(obj, scenario); } HILOGI("End"); } @@ -672,7 +680,13 @@ void BackupExtExtension::SyncCallJsOnProcessTask(wptr obj, B HILOGE("Async call js onPreocess callback failed, exPtr is empty"); return; } + if (extPtr->onProcessTimeout_.load()) { + HILOGE("The result of invoking onProcess is timeout."); + extPtr->onProcessTimeout_.store(false); + return; + } extPtr->CloseOnProcessTimeOutTimer(); + extPtr->isFirstCallOnProcess_.store(false); extPtr->onProcessTimeout_.store(false); if (extPtr->onProcessTimeoutCnt_.load() > 0) { extPtr->onProcessTimeoutCnt_ = 0; @@ -681,6 +695,7 @@ void BackupExtExtension::SyncCallJsOnProcessTask(wptr obj, B if (processInfo.size() == 0) { HILOGE("Current extension has no js method named onProcess."); std::unique_lock lock(extPtr->onProcessLock_); + extPtr->isFirstCallOnProcess_.store(false); extPtr->stopCallJsOnProcess_.store(true); extPtr->execOnProcessCon_.notify_one(); lock.unlock(); @@ -688,7 +703,6 @@ void BackupExtExtension::SyncCallJsOnProcessTask(wptr obj, B } std::string processInfoJsonStr; BJsonUtil::BuildOnProcessRetInfo(processInfoJsonStr, processInfo); - HILOGI("Will notify backup sa process result"); extPtr->ReportAppProcessInfo(processInfoJsonStr, scenario); }; auto extenionPtr = obj.promote(); @@ -709,6 +723,8 @@ void BackupExtExtension::FinishOnProcessTask() HILOGI("Begin"); std::unique_lock lock(onProcessLock_); stopCallJsOnProcess_.store(true); + isFirstCallOnProcess_.store(false); + isExecAppDone_.store(false); onProcessTimeoutCnt_ = 0; execOnProcessCon_.notify_one(); lock.unlock(); @@ -731,10 +747,14 @@ void BackupExtExtension::StartOnProcessTimeOutTimer(wptr obj HILOGE("Start Create timeout callback failed, extPtr is empty"); return; } - if (extPtr->onProcessTimeoutCnt_.load() >= BConstants::APP_ON_PROCESS_TIMEOUT_MAX_COUNT) { - HILOGE("Current extension onProcess timeout more than three times"); + if (extPtr->onProcessTimeoutCnt_.load() >= BConstants::APP_ON_PROCESS_TIMEOUT_MAX_COUNT || + extPtr->isFirstCallOnProcess_.load()) { + HILOGE("The extension invokes the onProcess for more than three times or the first invoking of the" + "onProcess times out, timeoutCnt:%{public}d", extPtr->onProcessTimeoutCnt_.load()); std::unique_lock lock(extPtr->onProcessLock_); extPtr->stopCallJsOnProcess_.store(true); + extPtr->isFirstCallOnProcess_.store(false); + extPtr->isExecAppDone_.store(false); extPtr->onProcessTimeoutCnt_ = 0; extPtr->execOnProcessCon_.notify_one(); lock.unlock(); @@ -750,7 +770,9 @@ void BackupExtExtension::StartOnProcessTimeOutTimer(wptr obj extPtr->onProcessTimeout_.store(true); HILOGE("Extension onProcess timeout, Increase cnt:%{public}d", extPtr->onProcessTimeoutCnt_.load()); }; - uint32_t timerId = onProcessTimeoutTimer_.Register(timeoutCallback, BConstants::APP_ON_PROCESS_MAX_TIMEOUT, true); + int timeout = isFirstCallOnProcess_.load() ? BConstants::FIRST_CALL_APP_ON_PROCESS_MAX_TIMEOUT : + BConstants::APP_ON_PROCESS_MAX_TIMEOUT; + uint32_t timerId = onProcessTimeoutTimer_.Register(timeoutCallback, timeout, true); onProcessTimeoutTimerId_ = timerId; HILOGI("End"); } diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 849f07ecf..51907a8ae 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -90,6 +90,7 @@ constexpr uint32_t TIMEOUT_INVALID = UINT32_MAX; constexpr int CALL_APP_ON_PROCESS_TIME_INTERVAL = 5; // 框架每隔5s去调用应用的onProcess constexpr int APP_ON_PROCESS_MAX_TIMEOUT = 1000; // 应用的onProcess接口最大超时时间为1秒 +constexpr int FIRST_CALL_APP_ON_PROCESS_MAX_TIMEOUT = 15000; // 首次调用应用的onProcess接口最大超时时间为15秒 constexpr int APP_ON_PROCESS_TIMEOUT_MAX_COUNT = 3; // 应用的onProcess接口超时的上限次数 // backup.para内配置项的名称,该配置项值为true时可在不更新hap包的情况下,可以读取包管理元数据配置文件的内容 -- Gitee