From 7abb0f0e5ca4321bcbead1be30ce5a398596cedc Mon Sep 17 00:00:00 2001 From: Wannabe Date: Mon, 12 May 2025 10:44:17 +0800 Subject: [PATCH] Optimise the transmission mechanism of the backup framework. Signed-off-by: Wannabe --- .../native/backup_ext/include/ext_extension.h | 21 ++- .../native/backup_ext/src/ext_extension.cpp | 72 ++++---- .../backup_ext/src/sub_ext_extension.cpp | 159 ++++++++++++++++++ .../src/module_ipc/svc_session_manager.cpp | 2 + utils/BUILD.gn | 1 + utils/include/b_resources/b_constants.h | 2 +- utils/include/b_utils/scan_file_singleton.h | 69 ++++++++ utils/src/b_filesystem/b_dir.cpp | 13 +- utils/src/b_utils/scan_file_singleton.cpp | 105 ++++++++++++ 9 files changed, 403 insertions(+), 41 deletions(-) create mode 100644 utils/include/b_utils/scan_file_singleton.h create mode 100644 utils/src/b_utils/scan_file_singleton.cpp diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 9d7ab287b..8c64417d4 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -99,11 +99,22 @@ private: * @brief backup * * @param bigFileInfo bigfiles to be backup + * @param bigFileInfoBackuped bigfiles have been backuped * @param smallFiles smallfiles to be backup * @param includesNum sizeof includes * @param excludesNum sizeof excludes */ - int DoBackup(TarMap &bigFileInfo, map &smallFiles, uint32_t includesNum, uint32_t excludesNum); + int DoBackup(TarMap &bigFileInfo, TarMap &bigFileInfoBackuped, map &smallFiles, + uint32_t includesNum, uint32_t excludesNum); + + /** + * @brief backup + * + * @param bigFileInfo bigfiles to be backup + * @param backupedFileSize backuped file size + */ + int DoBackupBigFiles(TarMap &bigFileInfo, uint_32 backupedFileSize); + /** * @brief restore @@ -210,7 +221,7 @@ private: int DoIncrementalBackupTask(UniqueFd incrementalFd, UniqueFd manifestFd); ErrCode IncrementalBigFileReady(TarMap &pkgInfo, const vector &bigInfos, sptr proxy); - ErrCode BigFileReady(TarMap &bigFileInfo, sptr proxy); + ErrCode BigFileReady(TarMap &bigFileInfo, sptr proxy, uint32_t BackupedFileSize); void WaitToSendFd(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void RefreshTimeInfo(std::chrono::system_clock::time_point &startTime, int &fdSendNum); void IncrementalPacket(const vector &infos, TarMap &tar, sptr proxy); @@ -362,6 +373,12 @@ private: void OnRestoreExFinish(); void DoBackupStart(); void DoBackupEnd(); + void CalculateDataSizeTask(const string &config); + void DoBackUpTask(const string &config); + TarMap Transfer2Bigfiles(std::map files); + void PreDealExcludes(std::vector &excludes); + template + map MatchFiles(map files, vector endExcludes); private: pair> GetFileInfos(const vector &includes, const vector &excludes); void ReportAppStatistic(ErrCode errCode); diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 849fb2b59..2caa9548a 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -498,13 +498,14 @@ void BackupExtExtension::ClearNoPermissionFiles(TarMap &pkgInfo, vector proxy) +ErrCode BackupExtExtension::BigFileReady(TarMap &bigFileInfo, sptr proxy, uint32_t BackupedFileSize) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - HILOGI("BigFileReady Begin: bigFileInfo file size is: %{public}zu", bigFileInfo.size()); + HILOGI("BigFileReady Begin: bigFileInfo file size is: %{public}zu, BackupedFileSize is %{public}d", + bigFileInfo.size(), BackupedFileSize); ErrCode ret {ERR_OK}; auto startTime = std::chrono::system_clock::now(); - int fdNum = 0; + int fdNum = BackupedFileSize; vector noPermissionFiles; for (auto &item : bigFileInfo) { WaitToSendFd(startTime, fdNum); @@ -530,7 +531,7 @@ ErrCode BackupExtExtension::BigFileReady(TarMap &bigFileInfo, sptr pro RefreshTimeInfo(startTime, fdNum); } ClearNoPermissionFiles(bigFileInfo, noPermissionFiles); - HILOGI("BigFileReady End"); + HILOGI("BigFileReady End, fdNum is %{public}d", fdNum); return ret; } @@ -777,11 +778,12 @@ void BackupExtExtension::DoPacket(const map &srcFiles, TarMap &t appStatistic_->tarSpend_ = totalTarUs / MS_TO_US; } -int BackupExtExtension::DoBackup(TarMap &bigFileInfo, map &smallFiles, +int BackupExtExtension::DoBackup(TarMap &bigFileInfo, TarMap &fileBackupedInfo, map &smallFiles, uint32_t includesNum, uint32_t excludesNum) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - HILOGI("Start Do backup"); + HILOGI("bigFileInfo size: %{public}lu, fileBackupedInfo size %{public}lu, smallFiles size: %{public}lu", + bigFileInfo.size(), fileBackupedInfo.size()); auto start = std::chrono::system_clock::now(); if (extension_ == nullptr) { HILOGE("Failed to do backup, extension is nullptr"); @@ -798,24 +800,25 @@ int BackupExtExtension::DoBackup(TarMap &bigFileInfo, map &small // 回传大文件 HILOGI("Will notify BigFileReady"); - auto res = BigFileReady(bigFileInfo, proxy); + auto res = BigFileReady(bigFileInfo, proxy, fileBackupedInfo.size()); HILOGI("Start packet Tar files"); // 分片打包, 回传tar包 TarMap tarMap {}; DoPacket(smallFiles, tarMap, proxy); bigFileInfo.insert(tarMap.begin(), tarMap.end()); + fileBackupedInfo.insert(tarMap.begin(), tarMap.end()); HILOGI("Do backup, DoPacket end"); HILOGI("Will notify IndexFileReady"); - if (auto ret = IndexFileReady(bigFileInfo, proxy); ret) { + if (auto ret = IndexFileReady(fileBackupedInfo, proxy); ret) { return ret; } HILOGI("HandleBackup finish, ret = %{public}d", res); auto end = std::chrono::system_clock::now(); auto cost = std::chrono::duration_cast(end - start).count(); - AppRadar::DoBackupInfo doBackupInfo = {cost, bigFileInfo.size(), smallFiles.size(), tarMap.size(), + AppRadar::DoBackupInfo doBackupInfo = {cost, fileBackupedInfo.size(), smallFiles.size(), tarMap.size(), includesNum, excludesNum}; RecordDoBackupRes(bundleName_, res, doBackupInfo); return res; @@ -836,6 +839,7 @@ tuple BackupExtExtension::CalculateDataSize(const B // 扫描文件计算数据量 tie(bigFileInfo, smallFiles) = GetFileInfos(includes, excludes); + ScanFileSingleton::GetInstance().SetCompeletedFlag(true); appStatistic_->smallFileCount_ = smallFiles.size(); appStatistic_->bigFileCount_ = bigFileInfo.size(); for (const auto &item : bigFileInfo) { @@ -1020,32 +1024,7 @@ void BackupExtExtension::AsyncTaskBackup(const string config) auto ptr = obj.promote(); BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); try { - if (!ptr->StopExtTimer()) { - throw BError(BError::Codes::EXT_TIMER_ERROR, "Failed to stop extTimer"); - } - int64_t totalSize = 0; - TarMap bigFileInfo; - map smallFiles; - BJsonCachedEntity cachedEntity(config); - auto cache = cachedEntity.Structuralize(); - ptr->DoBackupStart(); - auto [err, includeSize, excludeSize] = ptr->CalculateDataSize(cache, totalSize, bigFileInfo, smallFiles); - if (err != ERR_OK) { - throw BError(BError::Codes::EXT_INVAL_ARG, "Failed to mkdir"); - } - if (!ptr->RefreshDataSize(totalSize)) { - throw BError(BError::Codes::EXT_INVAL_ARG, "Failed to RefreshDataSize"); - } - bool isFwkStart; - ptr->StartFwkTimer(isFwkStart); - if (!isFwkStart) { - HILOGE("Do backup, start fwk timer fail."); - throw BError(BError::Codes::EXT_TIMER_ERROR, "Failed to start fwkTimer"); - } - auto ret = ptr->DoBackup(bigFileInfo, smallFiles, includeSize, excludeSize); - ptr->DoBackupEnd(); - ptr->AppDone(ret); - HILOGI("backup app done %{public}d", ret); + ptr->CalculateDataSizeTask(config); } catch (const BError &e) { HILOGE("extension: AsyncTaskBackup error, err code:%{public}d", e.GetCode()); ptr->AppDone(e.GetCode()); @@ -1066,6 +1045,29 @@ void BackupExtExtension::AsyncTaskBackup(const string config) HILOGE("Failed to add task to thread pool"); } }); + + auto dobackupTask = [obj {wptr(this)}, config]() { + auto ptr = obj.promote(); + BExcepUltils::BAssert(ptr, BError::Codes::EXT_BROKEN_FRAMEWORK, "Ext extension handle have been released"); + try { + ptr->DoBackUpTask(config); + } catch (const BError &e) { + HILOGE("extension: AsyncTaskBackup error, err code:%{public}d", e.GetCode()); + ptr->AppDone(e.GetCode()); + } catch (...) { + HILOGE("Failed to restore the ext bundle"); + ptr->AppDone(BError(BError::Codes::EXT_INVAL_ARG).GetCode()); + } + ptr->DoClear(); + }; + + threadPool_.AddTask([dobackupTask]() { + try { + dobackupTask(); + } catch (...) { + HILOGE("Failed to add task to thread pool"); + } + }); } void BackupExtExtension::RestoreBigFilesForSpecialCloneCloud(const ExtManageInfo &item) diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index cf9de6eb4..a165d5594 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,7 @@ #include "b_ohos/startup/backup_para.h" #include "b_radar/b_radar.h" #include "b_tarball/b_tarball_factory.h" +#include "b_utils/scan_file_singleton.h" #include "filemgmt_libhilog.h" #include "hitrace_meter.h" #include "sandbox_helper.h" @@ -1467,4 +1469,161 @@ void BackupExtExtension::RmBigFileReportForSpecialCloneCloud(const std::string & } reportHashSrcPathMap_.erase(iter); } + +void BackupExtExtension::CalculateDataSizeTask(const string &config) +{ + if (!StopExtTimer()) { + throw BError(BError::Codes::EXT_TIMER_ERROR, "Failed to stop extTimer"); + } + int64_t totalSize = 0; + TarMap bigFileInfo; + map smallFiles; + BJsonCachedEntity cachedEntity(config); + auto cache = cachedEntity.Structuralize(); + auto [err, includeSize, excludeSize] = CalculateDataSize(cache, totalSize, bigFileInfo, smallFiles); + ScanFileSingleton::GetInstance().SetIncludeSize(includeSize); + ScanFileSingleton::GetInstance().SetExcludeSize(excludeSize); + if (err != ERR_OK) { + throw BError(BError::Codes::EXT_INVAL_ARG, "Failed to mkdir"); + } + if (!RefreshDataSize(totalSize)) { + throw BError(BError::Codes::EXT_INVAL_ARG, "Failed to RefreshDataSize"); + } + bool isFwkStart; + StartFwkTimer(isFwkStart); + if (!isFwkStart) { + HILOGE("Do backup, start fwk timer fail."); + throw BError(BError::Codes::EXT_TIMER_ERROR, "Failed to start fwkTimer"); + } +} + +void BackupExtExtension::DoBackUpTask(const string &config) +{ + BJsonCachedEntity cachedEntity(config); + auto cache = cachedEntity.Structuralize(); + vector excludes = cache.GetExcludes(); + vector endExcludes = excludes; + PreDealExcludes(endExcludes); + + int ret = 0; + TarMap fileBackupedInfo; + while (ScanFileSingleton::GetInstance().GetCompeletedFlag()) { + ScanFileSingleton::GetInstance().WaitForFiles(); + std::map incFiles = ScanFileSingleton::GetInstance().GetAllBigFiles(); + if (incFiles.empty()) { + continue; + } + map bigFiles = MatchFiles(incFiles, endExcludes); + TarMap bigFileInfo = Transfer2Bigfiles(bigFiles); + ret = DoBackupBigFiles(bigFileInfo, fileBackupedInfo.size()); + fileBackupedInfo.insert(bigFileInfo.begin(), bigFileInfo.end()); + } + + map incSmallFiles = ScanFileSingleton::GetInstance().GetAllSmallFiles(); + map smallFiles = MatchFiles(incSmallFiles, endExcludes); + + std::map incFiles = ScanFileSingleton::GetInstance().GetAllBigFiles(); + map bigFiles = MatchFiles(incFiles, endExcludes); + TarMap bigFileInfo = Transfer2Bigfiles(bigFiles); + uint32_t includeSize = ScanFileSingleton::GetInstance().GetIncludeSize(); + uint32_t excludeSize = ScanFileSingleton::GetInstance().GetExcludeSize(); + + fileBackupedInfo.insert(bigFileInfo.begin(), bigFileInfo.end()); + ret = DoBackup(bigFileInfo, fileBackupedInfo, smallFiles, includeSize, excludeSize); + AppDone(ret); + HILOGI("backup app done %{public}d", ret); +} + +template