From 8ffe88445fb6acb1206d2b1d69c80d8df33cb04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B8=8A?= Date: Tue, 6 May 2025 16:36:11 +0800 Subject: [PATCH 1/4] add new dfx statistic for radar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘渊 --- .gitignore | 8 +- .../native/backup_ext/include/ext_extension.h | 16 +- .../native/backup_ext/include/tar_file.h | 2 +- .../native/backup_ext/src/ext_extension.cpp | 49 ++++- .../backup_ext/src/sub_ext_extension.cpp | 50 +++++ services/backup_sa/IExtension.idl | 1 + .../backup_sa/include/module_ipc/service.h | 8 + .../module_ipc/svc_backup_connection.h | 4 + .../include/module_ipc/svc_session_manager.h | 2 + services/backup_sa/src/module_ipc/service.cpp | 21 +++ .../src/module_ipc/service_incremental.cpp | 6 + .../backup_sa/src/module_ipc/sub_service.cpp | 19 ++ .../src/module_ipc/svc_backup_connection.cpp | 2 + .../src/module_ipc/svc_session_manager.cpp | 13 ++ .../include/svc_extension_proxy_mock.h | 1 + .../include/svc_session_manager_mock.h | 2 + .../module_ipc/svc_extension_proxy_mock.cpp | 5 + .../module_ipc/svc_session_manager_mock.cpp | 4 + .../svc_session_manager_throw_mock.cpp | 4 + .../svc_session_manager_throw_mock.h | 2 + .../backup_impl/include/ext_extension_mock.h | 4 + .../module_ipc/service_incremental_test.cpp | 9 +- .../module_ipc/service_other_test.cpp | 4 + .../module_ipc/service_throw_test.cpp | 80 ++------ .../backup_utils/b_filesystem/b_dir_test.cpp | 15 +- utils/BUILD.gn | 2 + utils/include/b_filesystem/b_dir.h | 5 +- utils/include/b_filesystem/b_file.h | 9 + utils/include/b_radar/radar_app_statistic.h | 158 ++++++++++++++++ utils/include/b_radar/radar_const.h | 150 +++++++++++++++ utils/include/b_radar/radar_total_statistic.h | 49 +++++ utils/include/b_resources/b_constants.h | 2 + utils/include/b_utils/b_time.h | 7 + utils/src/b_filesystem/b_dir.cpp | 16 +- utils/src/b_filesystem/b_file.cpp | 10 + utils/src/b_radar/radar_app_statistic.cpp | 174 ++++++++++++++++++ utils/src/b_radar/radar_total_statistic.cpp | 59 ++++++ utils/src/b_utils/b_time.cpp | 24 +++ 38 files changed, 910 insertions(+), 86 deletions(-) create mode 100644 utils/include/b_radar/radar_app_statistic.h create mode 100644 utils/include/b_radar/radar_const.h create mode 100644 utils/include/b_radar/radar_total_statistic.h create mode 100644 utils/src/b_radar/radar_app_statistic.cpp create mode 100644 utils/src/b_radar/radar_total_statistic.cpp diff --git a/.gitignore b/.gitignore index 4d99d6187..ce4379dde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,8 @@ .vscode -target \ No newline at end of file +.vs +target + +*.sln +*.vcxproj +*.vcxproj.filters +*.vcxproj.user \ No newline at end of file diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index f298b40f9..9d7ab287b 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -17,6 +17,7 @@ #define OHOS_FILEMGMT_BACKUP_BACKUP_EXT_EXTENSION_H #include +#include #include #include #include @@ -28,6 +29,7 @@ #include "b_json/b_json_entity_ext_manage.h" #include "b_json/b_report_entity.h" #include "b_radar/b_radar.h" +#include "b_radar/radar_app_statistic.h" #include "ext_backup_js.h" #include "extension_stub.h" #include "service_common.h" @@ -60,7 +62,7 @@ public: void ExtClear(void); void AsyncTaskIncrementalRestoreForUpgrade(void); ErrCode User0OnBackup() override; - + ErrCode UpdateDfxInfo(int64_t uniqId, uint32_t extConnectSpend, const std::string &bundleName) override; public: explicit BackupExtExtension(const std::shared_ptr &extension, const std::string &bundleName) : extension_(extension) @@ -73,6 +75,7 @@ public: onProcessTaskPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); reportOnProcessRetPool_.Start(BConstants::EXTENSION_THREAD_POOL_COUNT); SetStagingPathProperties(); + appStatistic_ = std::make_shared(); } ~BackupExtExtension() { @@ -353,7 +356,17 @@ private: tuple GetIncreFileHandleForSpecialVersion(const string &fileName); void RmBigFileReportForSpecialCloneCloud(const std::string &srcFile); string GetReportFileName(const string &fileName); + void OnBackupFinish(); + void OnBackupExFinish(); + void OnRestoreFinish(); + void OnRestoreExFinish(); + void DoBackupStart(); + void DoBackupEnd(); private: + pair> GetFileInfos(const vector &includes, const vector &excludes); + void ReportAppStatistic(ErrCode errCode); + ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy); + std::shared_mutex lock_; std::shared_ptr extension_; std::string backupInfo_; @@ -390,6 +403,7 @@ private: std::mutex reportHashLock_; std::map reportHashSrcPathMap_; + std::shared_ptr appStatistic_ = nullptr; BackupRestoreScenario curScenario_ { BackupRestoreScenario::FULL_BACKUP }; }; } // namespace OHOS::FileManagement::Backup diff --git a/frameworks/native/backup_ext/include/tar_file.h b/frameworks/native/backup_ext/include/tar_file.h index ce8afbaa8..0a875704c 100644 --- a/frameworks/native/backup_ext/include/tar_file.h +++ b/frameworks/native/backup_ext/include/tar_file.h @@ -99,6 +99,7 @@ public: */ void SetPacketMode(bool isReset); + uint64_t GetTarFileSize() { return static_cast(currentTarFileSize_); } private: TarFile() {} ~TarFile() = default; @@ -219,7 +220,6 @@ private: bool I2OcsConvert(const struct stat &st, TarHeader &hdr, std::string &fileName); bool ToAddFile(std::string &path, int &err); - private: uint32_t fileCount_ {0}; TarMap tarMap_ {}; diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 22fa1d6bd..11b9414c5 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -471,7 +471,7 @@ ErrCode BackupExtExtension::HandleClear() } } -static ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy) +ErrCode BackupExtExtension::IndexFileReady(const TarMap &pkgInfo, sptr proxy) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); UniqueFd fd(open(INDEX_FILE_BACKUP.data(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)); @@ -484,6 +484,7 @@ static ErrCode IndexFileReady(const TarMap &pkgInfo, sptr proxy) cache.SetExtManage(pkgInfo); cachedEntity.Persist(); close(cachedEntity.GetFd().Release()); + appStatistic_->manageJsonSize_ = BFile::GetFileSize(INDEX_FILE_BACKUP); int fdval = open(INDEX_FILE_BACKUP.data(), O_RDONLY); ErrCode ret = proxy->AppFileReady(string(BConstants::EXT_BACKUP_MANAGE), fdval, @@ -655,10 +656,13 @@ static bool IsUserTar(const string &tarFile, const std::vector &e return false; } -static pair> GetFileInfos(const vector &includes, const vector &excludes) +pair> BackupExtExtension::GetFileInfos(const vector &includes, + const vector &excludes) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); - auto [errCode, files, smallFiles] = BDir::GetBigFiles(includes, excludes); + appStatistic_->scanFileSpend_.Start(); + auto [errCode, files, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); + appStatistic_->scanFileSpend_.End(); if (errCode != 0) { return {}; } @@ -682,12 +686,13 @@ static pair> GetFileInfos(const vector &incl TarMap bigFiles; for (const auto &item : files) { + int64_t hashStart = TimeUtils::GetTimeUS(); string md5Name = getStringHash(bigFiles, item.first); + appStatistic_->hashSpendUS_ += TimeUtils::GetSpendUS(hashStart); if (!md5Name.empty()) { bigFiles.emplace(md5Name, make_tuple(item.first, item.second, true)); } } - return {bigFiles, smallFiles}; } @@ -747,13 +752,18 @@ void BackupExtExtension::DoPacket(const map &srcFiles, TarMap &t auto startTime = std::chrono::system_clock::now(); int fdNum = 0; auto reportCb = ReportErrFileByProc(wptr {this}, curScenario_); + uint32_t totalTarUs = 0; for (const auto &small : srcFiles) { totalSize += small.second; fileCount += 1; packFiles.emplace_back(small.first); if (totalSize >= BConstants::DEFAULT_SLICE_SIZE || fileCount >= BConstants::MAX_FILE_COUNT) { TarMap tarMap {}; + int64_t tarStartUs = TimeUtils::GetTimeUS(); TarFile::GetInstance().Packet(packFiles, "part", path, tarMap, reportCb); + totalTarUs += TimeUtils::GetSpendUS(tarStartUs); + appStatistic_->tarFileSize_ += TarFile::GetInstance().GetTarFileSize(); + appStatistic_->tarFileCount_++; tar.insert(tarMap.begin(), tarMap.end()); // 执行tar包回传功能 WaitToSendFd(startTime, fdNum); @@ -768,7 +778,11 @@ void BackupExtExtension::DoPacket(const map &srcFiles, TarMap &t if (fileCount > 0) { // 打包回传 TarMap tarMap {}; + int64_t tarStartUs = TimeUtils::GetTimeUS(); TarFile::GetInstance().Packet(packFiles, "part", path, tarMap, reportCb); + totalTarUs += TimeUtils::GetSpendUS(tarStartUs); + appStatistic_->tarFileSize_ += TarFile::GetInstance().GetTarFileSize(); + appStatistic_->tarFileCount_++; TarFileReady(tarMap, proxy); fdNum = 1; WaitToSendFd(startTime, fdNum); @@ -776,6 +790,7 @@ void BackupExtExtension::DoPacket(const map &srcFiles, TarMap &t packFiles.clear(); RefreshTimeInfo(startTime, fdNum); } + appStatistic_->tarSpend_ = totalTarUs / MS_TO_US; } int BackupExtExtension::DoBackup(TarMap &bigFileInfo, map &smallFiles, @@ -837,15 +852,19 @@ tuple BackupExtExtension::CalculateDataSize(const B // 扫描文件计算数据量 tie(bigFileInfo, smallFiles) = GetFileInfos(includes, excludes); + appStatistic_->smallFileCount_ = smallFiles.size(); + appStatistic_->bigFileCount_ = bigFileInfo.size(); for (const auto &item : bigFileInfo) { int64_t fileSize = static_cast(std::get<1>(item.second).st_size); HILOGD("bigfile size = %{public}" PRId64 "", fileSize); totalSize += fileSize; } + appStatistic_->bigFileSize_ = totalSize; HILOGI("bigfile size = %{public}" PRId64 "", totalSize); for (const auto &item : smallFiles) { totalSize += static_cast(item.second); } + appStatistic_->smallFileSize_ = totalSize - appStatistic_->bigFileSize_; HILOGI("scanning end, Datasize = %{public}" PRId64 "", totalSize); return {ERR_OK, static_cast(includes.size()), static_cast(excludes.size())}; } @@ -1025,6 +1044,7 @@ void BackupExtExtension::AsyncTaskBackup(const string config) 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"); @@ -1039,6 +1059,7 @@ void BackupExtExtension::AsyncTaskBackup(const string config) 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); } catch (const BError &e) { @@ -1801,10 +1822,28 @@ void BackupExtExtension::DoClear() } } +void BackupExtExtension::ReportAppStatistic(ErrCode errCode) +{ + if (curScenario_ == BackupRestoreScenario::FULL_BACKUP || + curScenario_ == BackupRestoreScenario::INCREMENTAL_BACKUP) { + appStatistic_->ReportBackup("AppDone", errCode); + } else { + appStatistic_->untarSpend_ = static_cast(radarRestoreInfo_.tarFileSpendTime); + appStatistic_->bigFileSpend_ = static_cast(radarRestoreInfo_.bigFileSpendTime); + appStatistic_->doRestoreSpend_ = static_cast(radarRestoreInfo_.totalFileSpendTime); + appStatistic_->bigFileCount_ = radarRestoreInfo_.bigFileNum; + appStatistic_->tarFileCount_ = radarRestoreInfo_.tarFileNum; + appStatistic_->bigFileSize_ = radarRestoreInfo_.bigFileSize; + appStatistic_->tarFileSize_ = radarRestoreInfo_.tarFileSize; + appStatistic_->ReportRestore("AppDone", errCode); + } +} + void BackupExtExtension::AppDone(ErrCode errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("AppDone Begin."); + ReportAppStatistic(errCode); auto proxy = ServiceClient::GetInstance(); if (proxy == nullptr) { HILOGE("Failed to obtain the ServiceClient handle"); @@ -1880,6 +1919,8 @@ void BackupExtExtension::UpdateOnStartTime() { std::lock_guard lock(onStartTimeLock_); g_onStart = std::chrono::system_clock::now(); + appStatistic_->onBackupSpend_.Start(); + appStatistic_->onBackupexSpend_.Start(); } void BackupExtExtension::AsyncTaskOnBackup() diff --git a/frameworks/native/backup_ext/src/sub_ext_extension.cpp b/frameworks/native/backup_ext/src/sub_ext_extension.cpp index 8b9d8fea4..cf9de6eb4 100644 --- a/frameworks/native/backup_ext/src/sub_ext_extension.cpp +++ b/frameworks/native/backup_ext/src/sub_ext_extension.cpp @@ -206,6 +206,7 @@ std::function BackupExtExtension::OnRestoreCallback( HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnRestoreFinish(); if (extensionPtr->isExecAppDone_.load()) { HILOGE("Appdone has been executed for the current application"); return; @@ -242,6 +243,7 @@ std::function BackupExtExtension::OnRestoreExCallbac HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnRestoreExFinish(); if (extensionPtr->extension_ == nullptr) { HILOGE("Extension handle have been released"); return; @@ -306,6 +308,7 @@ std::function BackupExtExtension::IncreOnRestoreExCa HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnRestoreExFinish(); if (extensionPtr->extension_ == nullptr) { HILOGE("Extension handle have been released"); return; @@ -353,6 +356,7 @@ std::function BackupExtExtension::IncreOnRestoreCall HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnRestoreFinish(); if (extensionPtr->isExecAppDone_.load()) { HILOGE("Appdone has been executed for the current application"); return; @@ -398,6 +402,7 @@ std::function BackupExtExtension::OnBackupCall HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnBackupFinish(); if (extensionPtr->extension_ == nullptr) { HILOGE("Extension handle have been released"); return; @@ -440,6 +445,7 @@ std::function BackupExtExtension::OnBackupExCa HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnBackupExFinish(); if (extensionPtr->extension_ == nullptr) { HILOGE("Extension handle have been released"); return; @@ -492,6 +498,7 @@ std::function BackupExtExtension::IncOnBackupC HILOGE("Current extension execute call backup error, extPtr is empty"); return; } + extPtr->OnBackupFinish(); if (extPtr->isExecAppDone_.load()) { HILOGE("Appdone has been executed for the current application"); return; @@ -534,6 +541,7 @@ std::function BackupExtExtension::IncOnBackupE HILOGE("Ext extension handle have been released"); return; } + extensionPtr->OnBackupExFinish(); if (extensionPtr->extension_ == nullptr) { HILOGE("Extension handle have been released"); return; @@ -630,6 +638,36 @@ void BackupExtExtension::ExecCallOnProcessTask(wptr obj, Bac HILOGI("End"); } +void BackupExtExtension::OnBackupFinish() +{ + appStatistic_->onBackupSpend_.End(); +} + +void BackupExtExtension::OnBackupExFinish() +{ + appStatistic_->onBackupexSpend_.End(); +} + +void BackupExtExtension::OnRestoreFinish() +{ + appStatistic_->onRestoreSpend_.End(); +} + +void BackupExtExtension::OnRestoreExFinish() +{ + appStatistic_->onRestoreexSpend_.End(); +} + +void BackupExtExtension::DoBackupStart() +{ + appStatistic_->doBackupSpend_.Start(); +} + +void BackupExtExtension::DoBackupEnd() +{ + appStatistic_->doBackupSpend_.End(); +} + void BackupExtExtension::AsyncCallJsOnProcessTask(wptr obj, BackupRestoreScenario scenario) { HILOGI("Begin"); @@ -739,6 +777,7 @@ void BackupExtExtension::CloseOnProcessTimeOutTimer() void BackupExtExtension::AppIncrementalDone(ErrCode errCode) { HILOGI("Begin"); + ReportAppStatistic(errCode); auto proxy = ServiceClient::GetInstance(); if (proxy == nullptr) { HILOGE("Failed to obtain the ServiceClient handle"); @@ -794,7 +833,10 @@ ErrCode BackupExtExtension::UpdateFdSendRate(const std::string &bundleName, int3 bundleName_ = bundleName; sendRate_ = sendRate; if (sendRate > 0) { + appStatistic_->UpdateSendRateZeroSpend(); startSendFdRateCon_.notify_one(); + } else { + appStatistic_->sendRateZeroStart_ = TimeUtils::GetTimeUS(); } return ERR_OK; } catch (...) { @@ -803,6 +845,14 @@ ErrCode BackupExtExtension::UpdateFdSendRate(const std::string &bundleName, int3 } } +ErrCode BackupExtExtension::UpdateDfxInfo(int64_t uniqId, uint32_t extConnectSpend, const std::string &bundleName) +{ + appStatistic_->SetUniqId(uniqId); + appStatistic_->extConnectSpend_ = extConnectSpend; + appStatistic_->appCaller_ = bundleName; + return ERR_OK; +} + bool BackupExtExtension::SetStagingPathProperties() { struct stat curBundleStat {}; diff --git a/services/backup_sa/IExtension.idl b/services/backup_sa/IExtension.idl index ae259f3bf..d6d37d3d1 100644 --- a/services/backup_sa/IExtension.idl +++ b/services/backup_sa/IExtension.idl @@ -28,4 +28,5 @@ interface OHOS.FileManagement.Backup.IExtension{ [ipccode 11] void GetBackupInfo([out] String getBackupInfoResult); [ipccode 12] void UpdateFdSendRate([in] String bundleName, [in] int sendRate); [ipccode 13] void User0OnBackup(); + [ipccode 14] void UpdateDfxInfo([in] long uniqId, [in] unsigned int extConnectSpend, [in] String bundleName); } \ No newline at end of file diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index b846f8389..f68dd45d3 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -17,12 +17,14 @@ #define OHOS_FILEMGMT_BACKUP_SERVICE_H #include +#include #include #include "b_jsonutil/b_jsonutil.h" #include "b_json/b_json_clear_data_config.h" #include "b_json/b_json_entity_caps.h" #include "b_json/b_json_service_disposal_config.h" +#include "b_radar/radar_total_statistic.h" #include "iservice_reverse.h" #include "iremote_stub.h" #include "module_sched/sched_scheduler.h" @@ -384,6 +386,11 @@ private: */ void ClearSessionAndSchedInfo(const std::string &bundleName); + /** + * @brief 上报总体统计打点 + */ + void TotalStatReport(ErrCode errCode); + /** * @brief 整个备份恢复流程结束 * @@ -714,6 +721,7 @@ private: std::condition_variable getDataSizeCon_; std::atomic isScannedEnd_ {false}; std::atomic onScanning_ {false}; + std::shared_ptr totalStatistic_ = nullptr; public: std::map> backupExtMutexMap_; std::map failedBundles_; 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 33c1c6978..ff2c5a84e 100644 --- a/services/backup_sa/include/module_ipc/svc_backup_connection.h +++ b/services/backup_sa/include/module_ipc/svc_backup_connection.h @@ -17,6 +17,7 @@ #define OHOS_FILEMGMT_BACKUP_SVC_BACKUP_CONNECTION_H #include "ability_connect_callback_stub.h" +#include "b_radar/radar_const.h" #include "iextension.h" namespace OHOS::FileManagement::Backup { @@ -89,6 +90,8 @@ public: */ bool WaitDisconnectDone(); + uint32_t GetConnectSpan() { return connectSpend_.GetSpan(); } + public: SvcBackupConnection(std::function callDied, std::function callConnected, @@ -111,6 +114,7 @@ private: std::function callDied_; std::function callConnected_; std::string bundleNameIndexInfo_; + Duration connectSpend_; }; } // namespace OHOS::FileManagement::Backup diff --git a/services/backup_sa/include/module_ipc/svc_session_manager.h b/services/backup_sa/include/module_ipc/svc_session_manager.h index a63978318..c7dad1c97 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -217,6 +217,8 @@ public: */ wptr GetExtConnection(const BundleName &bundleName); + void UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId); + /** * @brief get sa extension connection * diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index ba1779f2c..e9c892796 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -470,9 +470,11 @@ ErrCode Service::VerifyCaller(IServiceReverseType::Scenario scenario) ErrCode Service::InitRestoreSession(const sptr &remote) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::RESTORE, GetCallerName()); ErrCode ret = VerifyCaller(); if (ret != ERR_OK) { HILOGE("Init restore session failed, verify caller failed"); + totalStatistic_->Report("InitRestoreSession", ret, MODULE_INIT); return ret; } ret = session_->Active({ @@ -490,6 +492,7 @@ ErrCode Service::InitRestoreSession(const sptr &remote) ClearFileReadyRadarReport(); return ret; } + totalStatistic_->Report("InitRestoreSession", ret, MODULE_INIT); if (ret == BError(BError::Codes::SA_SESSION_CONFLICT)) { HILOGE("Active restore session error, Already have a session"); return ret; @@ -502,9 +505,11 @@ ErrCode Service::InitRestoreSession(const sptr &remote) ErrCode Service::InitBackupSession(const sptr &remote) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::BACKUP, GetCallerName()); ErrCode ret = VerifyCaller(); if (ret != ERR_OK) { HILOGE("Init full backup session fail, verify caller failed"); + totalStatistic_->Report("InitBackupSession", ret, MODULE_INIT); return ret; } int32_t oldSize = StorageMgrAdapter::UpdateMemPara(BConstants::BACKUP_VFS_CACHE_PRESSURE); @@ -525,6 +530,7 @@ ErrCode Service::InitBackupSession(const sptr &remote) ClearFileReadyRadarReport(); return ret; } + totalStatistic_->Report("InitBackupSession", ret, MODULE_INIT); if (ret == BError(BError::Codes::SA_SESSION_CONFLICT)) { HILOGE("Active backup session error, Already have a session"); return ret; @@ -666,6 +672,9 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, int32_t userId) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + if (totalStatistic_ != nullptr) { + totalStatistic_->totalSpendTime_.Start(); + } HILOGI("Begin"); try { if (session_ == nullptr || isOccupyingSession_.load()) { @@ -769,6 +778,9 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, int32_t userId) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + if (totalStatistic_ != nullptr) { + totalStatistic_->totalSpendTime_.Start(); + } try { if (session_ == nullptr || isOccupyingSession_.load()) { HILOGE("AppendBundles restore session error, session is empty"); @@ -869,6 +881,9 @@ void Service::SetCurrentSessProperties( ErrCode Service::AppendBundlesBackupSession(const vector &bundleNames) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + if (totalStatistic_ != nullptr) { + totalStatistic_->totalSpendTime_.Start(); + } try { if (session_ == nullptr || isOccupyingSession_.load()) { HILOGE("AppendBundles backup session error, session is empty"); @@ -908,6 +923,9 @@ ErrCode Service::AppendBundlesDetailsBackupSession(const vector &bun const vector &bundleInfos) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + if (totalStatistic_ != nullptr) { + totalStatistic_->totalSpendTime_.Start(); + } try { if (session_ == nullptr || isOccupyingSession_.load()) { HILOGE("AppendBundles backup session with infos error, session is empty"); @@ -1259,6 +1277,9 @@ void Service::ExtConnectDone(string bundleName) session_->SetServiceSchedAction(bundleName, BConstants::ServiceSchedAction::CLEAN); } else { session_->SetServiceSchedAction(bundleName, BConstants::ServiceSchedAction::RUNNING); + if (totalStatistic_ != nullptr) { + session_->UpdateDfxInfo(bundleName, totalStatistic_->GetUniqId()); + } bool needCleanData = session_->GetClearDataFlag(bundleName); if (needCleanData) { HILOGI("Current bundle need clean data, bundleName:%{public}s", bundleName.c_str()); diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 71c77ce06..f0bac2704 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -303,9 +303,11 @@ ErrCode Service::GetAppLocalListAndDoIncrementalBackup() ErrCode Service::InitIncrementalBackupSession(const sptr& remote) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::BACKUP, GetCallerName(), Mode::INCREMENTAL); ErrCode errCode = VerifyCaller(); if (errCode != ERR_OK) { HILOGE("Init incremental backup session fail, Verify caller failed, errCode:%{public}d", errCode); + totalStatistic_->Report("InitIncrementalBackupSession", errCode, MODULE_INIT); return errCode; } if (session_ == nullptr) { @@ -326,6 +328,7 @@ ErrCode Service::InitIncrementalBackupSession(const sptr& remot ClearFileReadyRadarReport(); return errCode; } + totalStatistic_->Report("InitIncrementalBackupSession", errCode, MODULE_INIT); if (errCode == BError(BError::Codes::SA_SESSION_CONFLICT)) { HILOGE("Active restore session error, Already have a session"); return errCode; @@ -338,9 +341,11 @@ ErrCode Service::InitIncrementalBackupSession(const sptr& remot ErrCode Service::InitIncrementalBackupSessionWithErrMsg(const sptr& remote, std::string &errMsg) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::BACKUP, GetCallerName(), Mode::INCREMENTAL); ErrCode errCode = VerifyCaller(); if (errCode != ERR_OK) { HILOGE("Init incremental backup session fail, Verify caller failed, errCode:%{public}d", errCode); + totalStatistic_->Report("InitIncrementalBackupSessionWithErrMsg", errCode, MODULE_INIT); return errCode; } if (session_ == nullptr) { @@ -361,6 +366,7 @@ ErrCode Service::InitIncrementalBackupSessionWithErrMsg(const sptrReport("InitIncrementalBackupSessionWithErrMsg", errCode, MODULE_INIT); if (errCode == BError(BError::Codes::SA_SESSION_CONFLICT)) { errMsg = BJsonUtil::BuildInitSessionErrInfo(session_->GetSessionUserId(), session_->GetSessionCallerName(), diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index 1b83bbfa4..af34f0b6f 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -714,12 +714,25 @@ void Service::NoticeClientFinish(const string &bundleName, ErrCode errCode) } } +void Service::TotalStatReport(ErrCode errCode) +{ + if (totalStatistic_ == nullptr) { + HILOGE("totalStat is null"); + return; + } + totalStatistic_->totalSpendTime_.End(); + totalStatistic_->succBundleCount_ = successBundlesNum_.load(); + totalStatistic_->failBundleCount_ = failedBundles_.size(); + totalStatistic_->Report("OnAllBundlesFinished", errCode); +} + void Service::OnAllBundlesFinished(ErrCode errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGI("called begin."); if (session_->IsOnAllBundlesFinished()) { IServiceReverseType::Scenario scenario = session_->GetScenario(); + TotalStatReport(errCode); if (isInRelease_.load() && (scenario == IServiceReverseType::Scenario::RESTORE)) { HILOGI("Will destory session info"); SessionDeactive(); @@ -860,9 +873,11 @@ ErrCode Service::InitRestoreSessionWithErrMsg(const sptr &remot ErrCode Service::InitRestoreSession(const sptr& remote, std::string &errMsg) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::RESTORE, GetCallerName()); ErrCode ret = VerifyCaller(); if (ret != ERR_OK) { HILOGE("Init restore session failed, verify caller failed"); + totalStatistic_->Report("InitRestoreSession", ret, MODULE_INIT); return ret; } ret = session_->Active({ @@ -880,6 +895,7 @@ ErrCode Service::InitRestoreSession(const sptr& remote, std::st ClearFileReadyRadarReport(); return ret; } + totalStatistic_->Report("InitRestoreSession", ret, MODULE_INIT); if (ret == BError(BError::Codes::SA_SESSION_CONFLICT)) { errMsg = BJsonUtil::BuildInitSessionErrInfo(session_->GetSessionUserId(), session_->GetSessionCallerName(), @@ -895,9 +911,11 @@ ErrCode Service::InitRestoreSession(const sptr& remote, std::st ErrCode Service::InitBackupSessionWithErrMsg(const sptr& remote, std::string &errMsg) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + totalStatistic_ = std::make_shared(BizScene::BACKUP, GetCallerName()); ErrCode ret = VerifyCaller(); if (ret != ERR_OK) { HILOGE("Init full backup session fail, verify caller failed"); + totalStatistic_->Report("InitBackupSessionWithErrMsg", ret, MODULE_INIT); return ret; } int32_t oldSize = StorageMgrAdapter::UpdateMemPara(BConstants::BACKUP_VFS_CACHE_PRESSURE); @@ -918,6 +936,7 @@ ErrCode Service::InitBackupSessionWithErrMsg(const sptr& remote ClearFileReadyRadarReport(); return ret; } + totalStatistic_->Report("InitBackupSessionWithErrMsg", ret, MODULE_INIT); if (ret == BError(BError::Codes::SA_SESSION_CONFLICT)) { errMsg = BJsonUtil::BuildInitSessionErrInfo(session_->GetSessionUserId(), session_->GetSessionCallerName(), 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 58bdb6158..8aba251e0 100644 --- a/services/backup_sa/src/module_ipc/svc_backup_connection.cpp +++ b/services/backup_sa/src/module_ipc/svc_backup_connection.cpp @@ -36,6 +36,7 @@ void SvcBackupConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &el int resultCode) { HILOGI("called begin"); + connectSpend_.End(); if (remoteObject == nullptr) { HILOGE("Failed to ability connect done, remote is nullptr"); return; @@ -109,6 +110,7 @@ ErrCode SvcBackupConnection::ConnectBackupExtAbility(AAFwk::Want &want, int32_t isCleanCalled_.store(isCleanCalled); isConnectCalled_.store(true); std::unique_lock lock(mutex_); + connectSpend_.Start(); ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, userId); HILOGI("Called end, ret=%{public}d, userId=%{public}d.", ret, userId); return ret; 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 8a79ef982..4293b6dc6 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -310,6 +310,19 @@ wptr SvcSessionManager::GetExtConnection(const BundleName & return wptr(it->second.backUpConnection); } +void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId) +{ + auto backupConnection = GetExtConnection(bundleName); + if (backupConnection == nullptr) { + return; + } + auto proxy = backupConnection->GetBackupExtProxy(); + if (proxy == nullptr) { + return; + } + proxy->UpdateDfxInfo(uniqId, backupConnection->GetConnectSpan(), bundleName); +} + std::weak_ptr SvcSessionManager::GetSAExtConnection(const BundleName &bundleName) { HILOGD("svcMrg:GetExt, bundleName:%{public}s", bundleName.c_str()); diff --git a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h index f1b41eec8..a41f5f27a 100644 --- a/tests/mock/module_ipc/include/svc_extension_proxy_mock.h +++ b/tests/mock/module_ipc/include/svc_extension_proxy_mock.h @@ -38,6 +38,7 @@ MOCK_METHOD(ErrCode, GetIncrementalBackupFileHandle, (UniqueFdGroup &)); MOCK_METHOD(ErrCode, GetBackupInfo, (std::string &)); MOCK_METHOD(ErrCode, UpdateFdSendRate, (const std::string &, int32_t)); MOCK_METHOD(ErrCode, User0OnBackup, ()); +MOCK_METHOD(ErrCode, UpdateDfxInfo, (int64_t, uint32_t, const std::string &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_BACKUP_CONNECTION_MOCK_H \ No newline at end of file diff --git a/tests/mock/module_ipc/include/svc_session_manager_mock.h b/tests/mock/module_ipc/include/svc_session_manager_mock.h index 83d363ceb..99fc754ee 100644 --- a/tests/mock/module_ipc/include/svc_session_manager_mock.h +++ b/tests/mock/module_ipc/include/svc_session_manager_mock.h @@ -62,6 +62,7 @@ public: virtual int GetSessionCnt() = 0; virtual SvcSessionManager::Impl GetImpl() = 0; virtual std::string GetOldBackupVersion() = 0; + virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; public: BSvcSessionManager() = default; virtual ~BSvcSessionManager() = default; @@ -110,6 +111,7 @@ public: MOCK_METHOD(int, GetSessionCnt, ()); MOCK_METHOD(SvcSessionManager::Impl, GetImpl, ()); MOCK_METHOD(std::string, GetOldBackupVersion, ()); + MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_SESSION_MANAGER_MOCK_H diff --git a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp index 3b8ae2212..63eacdcff 100644 --- a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp +++ b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp @@ -82,4 +82,9 @@ ErrCode ExtensionProxy::GetIncrementalBackupFileHandle(UniqueFdGroup &fdGroup) { return 0; } + +ErrCode ExtensionProxy::UpdateDfxInfo(int64_t uniqId, uint32_t extConnectSpend, const std::string &bundleName) +{ + return 0; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index 61a2c2eb7..9fca8e48f 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -502,4 +502,8 @@ std::string SvcSessionManager::GetOldBackupVersion() { return impl_.oldBackupVersion; } + +void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId) +{ +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp index fdec296b7..3ff137565 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -115,6 +115,10 @@ void SvcSessionManager::SetServiceSchedAction(const string &bundleName, BConstan BackupSvcSessionManager::session->SetServiceSchedAction(bundleName, action); } +void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId) +{ +} + string SvcSessionManager::GetBackupExtName(const string &bundleName) { return BackupSvcSessionManager::session->GetBackupExtName(bundleName); diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.h b/tests/mock/module_ipc/svc_session_manager_throw_mock.h index effea3050..0c0df92f8 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -98,6 +98,7 @@ public: virtual void SetIsReadyLaunch(const std::string &bundleName) = 0; virtual void SetOldBackupVersion(const std::string &backupVersion) = 0; virtual std::string GetOldBackupVersion() = 0; + virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; public: static inline std::shared_ptr session = nullptr; }; @@ -175,6 +176,7 @@ public: MOCK_METHOD(void, SetIsReadyLaunch, (const std::string &)); MOCK_METHOD(void, SetOldBackupVersion, (const std::string &)); MOCK_METHOD(std::string, GetOldBackupVersion, ()); + MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); }; } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h index 614905b0e..be0b0d4c8 100644 --- a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h +++ b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h @@ -164,6 +164,10 @@ public: return BError(BError::Codes::OK); }; + ErrCode UpdateDfxInfo(int64_t uniqId, uint32_t extConnectSpend, const std::string &bundleName) override + { + return ERR_OK; + }; private: int32_t nHandleBackupNum_ = 0; }; 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 3a9f94ffb..405223861 100644 --- a/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_incremental_test.cpp @@ -746,8 +746,8 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_InitIncrementalBackupSes GTEST_LOG_(INFO) << "ServiceIncrementalTest-begin SUB_ServiceIncremental_InitIncrementalBackupSession_0000"; try { EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); + EXPECT_CALL(*srvMock, GetCallerName()).WillRepeatedly(Return("")); EXPECT_EQ(service->InitIncrementalBackupSession(nullptr), BError(BError::Codes::SA_INVAL_ARG).GetCode()); - auto session_ = service->session_; service->session_ = nullptr; EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); @@ -759,21 +759,18 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_InitIncrementalBackupSes EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::OK))); EXPECT_EQ(service->InitIncrementalBackupSession(srPrt), BError(BError::Codes::OK).GetCode()); EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::SA_SESSION_CONFLICT))); EXPECT_EQ(service->InitIncrementalBackupSession(nullptr), BError(BError::Codes::SA_SESSION_CONFLICT).GetCode()); EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); EXPECT_EQ(service->InitIncrementalBackupSession(nullptr), BError(BError::Codes::SA_INVAL_ARG).GetCode()); @@ -800,6 +797,7 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_InitIncrementalBackupSes std::string errMsg; sptr reverseNUll = nullptr; EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); + EXPECT_CALL(*srvMock, GetCallerName()).WillRepeatedly(Return("")); EXPECT_EQ(service->InitIncrementalBackupSessionWithErrMsg(reverseNUll, errMsg), BError(BError::Codes::SA_INVAL_ARG).GetCode()); @@ -813,14 +811,12 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_InitIncrementalBackupSes EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::OK))); EXPECT_EQ(service->InitIncrementalBackupSessionWithErrMsg(reverseNUll, errMsg), BError(BError::Codes::OK).GetCode()); EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::SA_SESSION_CONFLICT))); EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); EXPECT_CALL(*session, GetSessionCallerName()).WillOnce(Return("")); @@ -832,7 +828,6 @@ HWTEST_F(ServiceIncrementalTest, SUB_ServiceIncremental_InitIncrementalBackupSes EXPECT_CALL(*srvMock, VerifyCaller()).WillOnce(Return(BError(BError::Codes::OK).GetCode())); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*srvMock, GetUserIdDefault()).WillOnce(Return(0)); - EXPECT_CALL(*srvMock, GetCallerName()).WillOnce(Return("")); EXPECT_CALL(*session, Active(_, _)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); EXPECT_EQ(service->InitIncrementalBackupSessionWithErrMsg(reverseNUll, errMsg), BError(BError::Codes::SA_INVAL_ARG).GetCode()); diff --git a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp index db6367853..5c80651bf 100644 --- a/tests/unittests/backup_sa/module_ipc/service_other_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_other_test.cpp @@ -161,6 +161,8 @@ std::shared_ptr Service::GetExtensionMutex(const BundleName void Service::RemoveExtensionMutex(const BundleName&) {} void Service::CreateDirIfNotExist(const std::string&) {} + +void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t uniqId) {} } class BThreadPool { @@ -1380,6 +1382,7 @@ HWTEST_F(ServiceTest, SUB_Service_LaunchBackupExtension_0100, TestSize.Level1) ASSERT_TRUE(service != nullptr); std::string bundleName = ""; EXPECT_CALL(*session, GetScenario()).WillOnce(Return(IServiceReverseType::Scenario::UNDEFINED)); + EXPECT_CALL(*session, UpdateDfxInfo(_, _)).WillOnce(Return()); auto ret = service->LaunchBackupExtension(bundleName); EXPECT_EQ(ret, BError(BError::Codes::SA_INVAL_ARG)); @@ -1444,6 +1447,7 @@ HWTEST_F(ServiceTest, SUB_Service_LaunchBackupExtension_0200, TestSize.Level1) EXPECT_CALL(*connect, IsExtAbilityConnected()).WillOnce(Return(false)); EXPECT_CALL(*session, GetServiceSchedAction(_)).WillOnce(Return(BConstants::ServiceSchedAction::START)); EXPECT_CALL(*session, GetSessionUserId()).WillOnce(Return(0)); + EXPECT_CALL(*session, UpdateDfxInfo(_, _)).WillOnce(Return()); EXPECT_CALL(*connect, ConnectBackupExtAbility(_, _, _)) .WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG).GetCode())); auto ret = service->LaunchBackupExtension(bundleName); diff --git a/tests/unittests/backup_sa/module_ipc/service_throw_test.cpp b/tests/unittests/backup_sa/module_ipc/service_throw_test.cpp index 5d49c9320..fa28d59b9 100644 --- a/tests/unittests/backup_sa/module_ipc/service_throw_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_throw_test.cpp @@ -132,8 +132,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0100, testing::e { GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitRestoreSession_0100"; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverse = nullptr; @@ -141,9 +141,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0100, testing::e EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); @@ -151,9 +148,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0100, testing::e EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -176,8 +170,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0200, testing::e GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitRestoreSession_0200"; std::string errMsg; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverseNUll = nullptr; @@ -185,9 +179,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0200, testing::e EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); @@ -195,9 +186,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0200, testing::e EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_SESSION_CONFLICT))); @@ -205,9 +193,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitRestoreSession_0200, testing::e EXPECT_EQ(ret, BError(BError::Codes::SA_SESSION_CONFLICT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -229,8 +214,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0100, testing::ex { GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitBackupSession_0100"; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverse = nullptr; @@ -238,9 +223,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0100, testing::ex EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); @@ -248,9 +230,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0100, testing::ex EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -273,8 +252,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0200, testing::ex GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitBackupSession_0200"; std::string errMsg; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverseNUll = nullptr; @@ -282,9 +261,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0200, testing::ex EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); @@ -292,9 +268,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0200, testing::ex EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_SESSION_CONFLICT))); @@ -302,9 +275,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitBackupSession_0200, testing::ex EXPECT_EQ(ret, BError(BError::Codes::SA_SESSION_CONFLICT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -521,7 +491,7 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppFileReady_0100, testing::ext::Te string fileName; EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); int fd = 1; @@ -531,7 +501,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppFileReady_0100, testing::ext::Te EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)) .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); ret = service->AppFileReady(fileName, fd, 0); @@ -559,7 +528,7 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppDone_0100, testing::ext::TestSiz EXPECT_NE(service, nullptr); EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); auto ret = service->AppDone(0); @@ -976,8 +945,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0100, { GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitIncrementalBackupSession_0100"; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverse = nullptr; @@ -985,9 +954,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0100, EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); @@ -997,9 +963,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0100, EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -1022,8 +985,8 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0200, GTEST_LOG_(INFO) << "ServiceThrowTest-begin SUB_Service_throw_InitIncrementalBackupSession_0200"; std::string errMsg; EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::DEFAULT_USER_ID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); + EXPECT_CALL(*skeleton, GetCallingTokenID()).WillRepeatedly(Return(0)); + EXPECT_CALL(*token, GetTokenType(_)).WillRepeatedly(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); sptr reverseNUll = nullptr; @@ -1031,9 +994,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0200, EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); @@ -1041,9 +1001,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0200, EXPECT_EQ(ret, BError(BError::Codes::SA_REFUSED_ACT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::SA_SESSION_CONFLICT))); @@ -1051,9 +1008,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_InitIncrementalBackupSession_0200, EXPECT_EQ(ret, BError(BError::Codes::SA_SESSION_CONFLICT).GetCode()); EXPECT_CALL(*skeleton, GetCallingUid()).WillOnce(Return(BConstants::SYSTEM_UID)); - EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)).WillOnce(Return(0)).WillOnce(Return(0)); - EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)) - .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL)); EXPECT_CALL(*param, GetBackupDebugOverrideAccount()) .WillOnce(Return(make_pair(true, DEBUG_ID + 1))); EXPECT_CALL(*sessionMock, Active(_)).WillOnce(Return(BError(BError::Codes::OK))); @@ -1183,7 +1137,7 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppIncrementalFileReady_0100, testi string fileName; EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)).WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); int fd = 1; @@ -1193,7 +1147,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppIncrementalFileReady_0100, testi EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)) .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); ret = service->AppIncrementalFileReady(fileName, fd, fd, 0); @@ -1222,7 +1175,7 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppIncrementalDone_0100, testing::e EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)) .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); + EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillRepeatedly(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_INVAL_ARG))); auto ret = service->AppIncrementalDone(0); @@ -1231,7 +1184,6 @@ HWTEST_F(ServiceThrowTest, SUB_Service_throw_AppIncrementalDone_0100, testing::e EXPECT_CALL(*skeleton, GetCallingTokenID()).WillOnce(Return(0)); EXPECT_CALL(*token, GetTokenType(_)) .WillOnce(Return(Security::AccessToken::ATokenTypeEnum::TOKEN_HAP)); - EXPECT_CALL(*token, GetHapTokenInfo(_, _)).WillOnce(Return(0)); EXPECT_CALL(*jsonUtil, BuildBundleNameIndexInfo(_, _)).WillOnce(Return("bundleName")); EXPECT_CALL(*sessionMock, VerifyBundleName(_)).WillOnce(Return(BError(BError::Codes::SA_REFUSED_ACT))); ret = service->AppIncrementalDone(0); diff --git a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp index 582bf86d4..38663e9e9 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "b_filesystem/b_dir.h" #include "b_dir.cpp" @@ -37,6 +38,8 @@ public: static void TearDownTestCase() {}; void SetUp() {}; void TearDown() {}; +protected: + std::shared_ptr appStatistic_ = std::make_shared(); }; /** @@ -144,7 +147,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0100, testing::ext::TestSize.Level1) EXPECT_EQ(ret, 0); vector includes = {rootDir}; vector excludes = {filePath2}; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); EXPECT_EQ(mpNameToStat.at(filePath1).st_size, 1024 * 1024 * 3); EXPECT_EQ(mpNameToStat.find(filePath2), mpNameToStat.end()); @@ -170,7 +173,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0200, testing::ext::TestSize.Level1) try { vector includes = {{}, {}}; vector excludes = {{}}; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); } catch (...) { EXPECT_TRUE(false); @@ -194,7 +197,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0201, testing::ext::TestSize.Level1) try { vector includes = {"/data/"}; vector excludes; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); } catch (...) { EXPECT_TRUE(false); @@ -218,7 +221,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0202, testing::ext::TestSize.Level1) try { vector includes = {"/data/app/"}; vector excludes; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); } catch (...) { EXPECT_TRUE(false); @@ -243,7 +246,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0203, testing::ext::TestSize.Level1) vector includes; vector excludes; const string str = ""; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); } catch (...) { EXPECT_TRUE(false); @@ -284,7 +287,7 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0300, testing::ext::TestSize.Level1) system(touchFilePrefix.append("c.txt").c_str()); vector includes = {preparedDir + string("/*"), preparedDir + string("test")}; vector excludes = {preparedDir + string("/test/test1/test2"), {}}; - auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); + auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes, appStatistic_); EXPECT_EQ(errCode, ERR_OK); } catch (...) { EXPECT_TRUE(false); diff --git a/utils/BUILD.gn b/utils/BUILD.gn index 7dae8821d..de06ec613 100644 --- a/utils/BUILD.gn +++ b/utils/BUILD.gn @@ -77,6 +77,8 @@ ohos_shared_library("backup_utils") { "src/b_process/b_guard_signal.cpp", "src/b_process/b_process.cpp", "src/b_radar/b_radar.cpp", + "src/b_radar/radar_app_statistic.cpp", + "src/b_radar/radar_total_statistic.cpp", "src/b_sa/b_sa_utils.cpp", "src/b_tarball/b_tarball_cmdline.cpp", "src/b_tarball/b_tarball_factory.cpp", diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index 3220a88fa..6afe25a8e 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #include #include "b_json/b_report_entity.h" +#include "b_radar/radar_app_statistic.h" #include "errors.h" namespace OHOS::FileManagement::Backup { @@ -49,7 +51,8 @@ public: * @return 错误码、大文件名集合 */ static std::tuple, std::map> GetBigFiles( - const std::vector &includes, const std::vector &excludes); + const std::vector &includes, const std::vector &excludes, + std::shared_ptr appStatistic); /** * @brief Get the Dirs object diff --git a/utils/include/b_filesystem/b_file.h b/utils/include/b_filesystem/b_file.h index c2cc3c8af..281f085d7 100644 --- a/utils/include/b_filesystem/b_file.h +++ b/utils/include/b_filesystem/b_file.h @@ -92,6 +92,15 @@ public: * @return false str is not endswith suffix */ static bool EndsWith(const string &str, const string &suffix); + + /** + * @brief get file size by path + * + * @param path file path + * @return 0 if path is invalid + * @return file size in byte if path is valid + */ + static uint64_t GetFileSize(const string &path); private: }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h new file mode 100644 index 000000000..dacccdcc3 --- /dev/null +++ b/utils/include/b_radar/radar_app_statistic.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_FILEMGMT_BACKUP_RADAR_APP_STATISTIC_H +#define OHOS_FILEMGMT_BACKUP_RADAR_APP_STATISTIC_H + +#include +#include "b_resources/b_constants.h" +#include "radar_const.h" + +namespace OHOS::FileManagement::Backup { + +struct ItemInfo { + uint32_t count = 0; + uint64_t size = 0; +}; + +constexpr uint8_t TYPE_DEF_COUNT = 7; +constexpr uint8_t CATEGORY_TYPE_COUNT = 10; + +constexpr uint8_t SIZE_DEF_COUNT = 6; + +enum FileType : uint8_t { + TXT, + PIC, + AUDIO, + VEDIO, + COMPRESS, + BIN, + OTHER, +}; + +const std::unordered_map FileTypeDef = { + {"txt", TXT}, {"log", TXT}, {"json", TXT}, {"xml", TXT}, + {"jpg", PIC}, {"jpeg", PIC}, {"png", PIC}, {"bmp", PIC}, {"gif", PIC}, {"svg", PIC}, {"webp", PIC}, {"tif", PIC}, + {"raw", PIC}, + {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, + {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"apk", COMPRESS}, + {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} +}; + +constexpr uint64_t ONE_MB = 1024 * 1024; +constexpr uint64_t TWO_MB = 2 * ONE_MB; +constexpr uint64_t TEN_MB = 10 * ONE_MB; +constexpr uint64_t HUNDRED_MB = 100 * ONE_MB; +constexpr uint64_t ONE_GB = 1024 * ONE_MB; + +enum FileSize : uint8_t { + TINY, // [0, 1M) + SMALL, // [1M, 2M) + MEDIUM, // [2M, 10M) + BIG, // [10M, 100M) + GREAT_BIG, // [100M, 1G) + GIANT, // >=1G +}; + +class FileStatList { +public: + std::string ToJsonString(); + virtual ItemInfo* GetListPtr() = 0; + virtual uint32_t GetListSize() = 0; +}; + +class FileTypeStat : public FileStatList { +public: + uint8_t GetIndexByType(std::string fileExtension); + void UpdateStat(std::string extension, uint64_t size); + ItemInfo* GetListPtr() override + { + return typeInfoList_; + } + uint32_t GetListSize() override + { + return TYPE_DEF_COUNT; + } +private: + ItemInfo typeInfoList_[TYPE_DEF_COUNT] = {{0, 0}}; +}; + +class FileSizeStat : public FileStatList { +public: + void UpdateStat(uint64_t fileSize); + ItemInfo* GetListPtr() override + { + return sizeInfoList_; + } + uint32_t GetListSize() override + { + return SIZE_DEF_COUNT; + } +private: + ItemInfo sizeInfoList_[SIZE_DEF_COUNT] = {{0, 0}}; +}; + +class RadarAppStatistic { +public: + std::string appCaller_; // tool app + uint32_t smallFileCount_ = 0; + uint64_t smallFileSize_ = 0; + uint32_t bigFileCount_ = 0; + uint64_t bigFileSize_ = 0; + uint32_t tarFileCount_ = 0; + uint64_t tarFileSize_ = 0; + uint32_t dirDepth_ = 0; + uint64_t tarBoundSize_ = BConstants::BIG_FILE_BOUNDARY; + uint64_t manageJsonSize_ = 0; + uint32_t extConnectSpend_ = 0; + + Duration onBackupSpend_ = {0, 0}; + Duration onBackupexSpend_ = {0, 0}; + Duration scanFileSpend_ = {0, 0}; + int64_t sendRateZeroStart_ = 0; + uint32_t sendRateZeroSpendUS_ = 0; + uint32_t tarSpend_ = 0; + uint32_t hashSpendUS_ = 0; + Duration doBackupSpend_ = {0, 0}; + + Duration onRestoreSpend_ = {0, 0}; + Duration onRestoreexSpend_ = {0, 0}; + uint32_t untarSpend_ = 0; + uint32_t bigFileSpend_ = 0; + uint32_t doRestoreSpend_ = 0; + + RadarAppStatistic() {}; + ~RadarAppStatistic() = default; + RadarAppStatistic(const RadarAppStatistic &) = delete; + RadarAppStatistic &operator=(const RadarAppStatistic &) = delete; + RadarAppStatistic(RadarAppStatistic &&) = delete; + RadarAppStatistic &operator=(RadarAppStatistic &&) = delete; + + void SetUniqId(int64_t uniqId) { uniqId_ = uniqId; }; + void UpdateSendRateZeroSpend(); + void UpdateFileDist(std::string fileExtension, uint64_t fileSize); + void ReportBackup(const std::string &func, int32_t errorCode = ERROR_OK); + void ReportBackup(const std::string &func, BError errCode); + void ReportRestore(const std::string &func, int32_t errorCode = ERROR_OK); + void ReportRestore(const std::string &func, BError errCode); + +private: + FileSizeStat fileSizeDist_; + FileTypeStat fileTypeDist_; + int64_t uniqId_ = 0; +}; +} // namespace OHOS::FileManagement::Backup +#endif // OHOS_FILEMGMT_BACKUP_RADAR_APP_STATISTIC_H diff --git a/utils/include/b_radar/radar_const.h b/utils/include/b_radar/radar_const.h new file mode 100644 index 000000000..6951c5c25 --- /dev/null +++ b/utils/include/b_radar/radar_const.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_FILEMGMT_BACKUP_RADAR_CONST_H +#define OHOS_FILEMGMT_BACKUP_RADAR_CONST_H + +#include +#include "b_error/b_error.h" +#include "b_utils/b_time.h" + +namespace OHOS::FileManagement::Backup { + +enum class Mode : uint32_t { + FULL = 1, + INCREMENTAL = 2 +}; + +enum class BizScene : int32_t { + UNKNOWN = 0, + BACKUP = 1, + RESTORE = 2, +}; + +struct Duration { + uint32_t GetSpan() const + { + if (endMilli_ < startMilli_ || startMilli_ == 0) { + return 0; + } + return static_cast(endMilli_ - startMilli_); + } + + void Start() + { + startMilli_ = static_cast(TimeUtils::GetTimeMS()); + } + + void End() + { + endMilli_ = static_cast(TimeUtils::GetTimeMS()); + } + + uint64_t startMilli_ = 0; + uint64_t endMilli_ = 0; +}; + +constexpr uint32_t MASK_SYS = 0xff; +constexpr uint32_t MASK_MODULE = 0x1f; +constexpr uint32_t MASK_ERROR = 0xffff; +constexpr uint8_t MOVE_BIT_MODULE = 16; +constexpr uint8_t MOVE_BIT_SYS = MOVE_BIT_MODULE + 5; + +constexpr int32_t DIVIDE_BASE = 1000; +constexpr int32_t MOD_BASE = 100; + +// ERROR CODE +constexpr uint32_t SUB_SYSTEM_ID = 800; +constexpr uint32_t MODULE_UNKNOWN = 0; +constexpr uint32_t MODULE_INIT = 1; +constexpr uint32_t MODULE_BACKUP = 2; +constexpr uint32_t MODULE_RESTORE = 3; +constexpr uint32_t MODULE_OTHER = 4; + +constexpr int32_t ERROR_OK = 0; + +constexpr uint16_t ERR_VERIFY_CALLER_FAIL = 1000; +constexpr uint16_t ERR_ACTIVE_SESSION_FAIL = 1001; + +struct RadarErrorCode { + RadarErrorCode(BError errCode) { SetByErrCode(errCode); } + RadarErrorCode(uint32_t moduleId, BError errCode) : moduleId_(moduleId) { SetByErrCode(errCode); } + RadarErrorCode(uint32_t moduleId) : moduleId_(moduleId) {} + RadarErrorCode(uint32_t moduleId, uint16_t error) : moduleId_(moduleId), error_(error) {} + int32_t GenCode() + { + if (error_ == 0) { + return ERROR_OK; + } + return static_cast(((SUB_SYSTEM_ID & MASK_SYS) << MOVE_BIT_SYS) + | ((moduleId_ & MASK_MODULE) << MOVE_BIT_MODULE) | (error_ & MASK_ERROR)); + } + void SetByErrCode(BError errCode) + { + int32_t code = errCode.GetCode(); + error_ = static_cast(code / DIVIDE_BASE + code % MOD_BASE); + } + + uint32_t moduleId_ = MODULE_UNKNOWN; + uint16_t error_ = 0; +}; + +constexpr char DOMAIN[] = "APP_FILE_SVC"; +const std::string DOMAIN_NAME = "APP_FILE_SVC"; +const std::string BACKUP_RESTORE_APP_STATISTIC = "BACKUP_RESTORE_APP_STATISTIC"; +const std::string BACKUP_RESTORE_STATISTIC = "BACKUP_RESTORE_STATISTIC"; + +const std::string ORG_PKG = "ORG_PKG"; +const std::string FUNC = "FUNC"; +const std::string BIZ_SCENE = "BIZ_SCENE"; +const std::string UNIQUE_ID = "UNIQUE_ID"; +const std::string ERROR_CODE = "ERROR_CODE"; + +const std::string HOST_PKG = "HOST_PKG"; +const std::string APP_CALLER = "APP_CALLER"; +const std::string MODE = "MODE"; +const std::string FILE_SIZE_DIST = "FILE_SIZE_DIST"; +const std::string FILE_TYPE_DIST = "FILE_TYPE_DIST"; +const std::string SMALL_FILE_COUNT = "SMALL_FILE_COUNT"; +const std::string SMALL_FILE_SIZE = "SMALL_FILE_SIZE"; +const std::string BIG_FILE_COUNT = "BIG_FILE_COUNT"; +const std::string BIG_FILE_SIZE = "BIG_FILE_SIZE"; +const std::string TAR_FILE_COUNT = "TAR_FILE_COUNT"; +const std::string TAR_FILE_SIZE = "TAR_FILE_SIZE"; +const std::string TAR_BOUND_SIZE = "TAR_BOUND_SIZE"; +const std::string DIR_DEPTH = "DIR_DEPTH"; +const std::string MANAGE_JSON_SIZE = "MANAGE_JSON_SIZE"; +const std::string EXTENSION_CONNECT_SPEND = "EXTENSION_CONNECT_SPEND"; + +const std::string ON_BACKUP_SPEND = "ON_BACKUP_SPEND"; +const std::string ON_BACKUPEX_SPEND = "ON_BACKUPEX_SPEND"; +const std::string DO_BACKUP_SPEND = "DO_BACKUP_SPEND"; +const std::string TAR_SPEND = "TAR_SPEND"; +const std::string HASH_SPEND = "HASH_SPEND"; +const std::string SCAN_FILE_SPEND = "SCAN_FILE_SPEND"; +const std::string SEND_RATE_ZERO_SPAN = "SEND_RATE_ZERO_SPAN"; + +const std::string ON_RESTORE_SPEND = "ON_RESTORE_SPEND"; +const std::string ON_RESTOREEX_SPEND = "ON_RESTOREEX_SPEND"; +const std::string DO_RESTORE_SPEND = "DO_RESTORE_SPEND"; +const std::string UNTAR_SPEND = "UNTAR_SPEND"; +const std::string BIG_FILE_SPEND = "BIG_FILE_SPEND"; + +const std::string TOTAL_SPEND = "TOTAL_SPEND"; +const std::string SUCC_BUNDLE_CNT = "SUCC_BUNDLE_CNT"; +const std::string FAIL_BUNDLE_CNT = "FAIL_BUNDLE_CNT"; + +} // namespace OHOS::FileManagement::Backup +#endif // OHOS_FILEMGMT_BACKUP_RADAR_CONST_H diff --git a/utils/include/b_radar/radar_total_statistic.h b/utils/include/b_radar/radar_total_statistic.h new file mode 100644 index 000000000..71ddc161b --- /dev/null +++ b/utils/include/b_radar/radar_total_statistic.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_FILEMGMT_BACKUP_RADAR_TOTAL_STATISTIC_H +#define OHOS_FILEMGMT_BACKUP_RADAR_TOTAL_STATISTIC_H + +#include "radar_const.h" +#include "b_error/b_error.h" + +namespace OHOS::FileManagement::Backup { + +class RadarTotalStatistic { +public: + uint32_t succBundleCount_ = 0; + uint32_t failBundleCount_ = 0; + Duration totalSpendTime_ = {0, 0}; + + RadarTotalStatistic(BizScene bizScene, std::string caller, Mode mode = Mode::FULL); + RadarTotalStatistic(const RadarTotalStatistic &) = delete; + RadarTotalStatistic &operator=(const RadarTotalStatistic &) = delete; + RadarTotalStatistic(RadarTotalStatistic &&) = delete; + RadarTotalStatistic &operator=(RadarTotalStatistic &&) = delete; + ~RadarTotalStatistic() = default; + + void Report(const std::string &func, int32_t error = ERROR_OK); + void Report(const std::string &func, uint32_t moduleId, uint16_t moduleErr); + void Report(const std::string &func, BError errCode, uint32_t moduleId = MODULE_UNKNOWN); + int64_t GetUniqId() { return uniqId_; } + +private: + BizScene bizScene_ = BizScene::UNKNOWN; + std::string hostPkg_ = ""; + Mode mode_ = Mode::FULL; + int64_t uniqId_ = 0; +}; +} // namespace OHOS::FileManagement::Backup +#endif // OHOS_FILEMGMT_BACKUP_RADAR_TOTAL_STATISTIC_H diff --git a/utils/include/b_resources/b_constants.h b/utils/include/b_resources/b_constants.h index 7b7adda9a..a1a54f925 100644 --- a/utils/include/b_resources/b_constants.h +++ b/utils/include/b_resources/b_constants.h @@ -182,6 +182,8 @@ static inline std::string GetSaBundleBackupToolDir(int32_t userId) return str; } +constexpr uint32_t APP_BASE_PATH_DEPTH = 4; + // 备份恢复配置文件暂存路径 static inline std::string_view BACKUP_CONFIG_EXTENSION_PATH = "/data/storage/el2/base/cache/"; diff --git a/utils/include/b_utils/b_time.h b/utils/include/b_utils/b_time.h index 840e5e5b7..e5726f797 100644 --- a/utils/include/b_utils/b_time.h +++ b/utils/include/b_utils/b_time.h @@ -18,11 +18,18 @@ #include namespace OHOS::FileManagement::Backup { + +constexpr uint32_t MS_TO_US = 1000; +constexpr uint32_t SECOND_TO_MS = 1000; + class TimeUtils { public: static int64_t GetTimeS(); static int64_t GetTimeMS(); static int64_t GetTimeUS(); + static uint32_t GetSpendSecond(int64_t startSecond); + static uint32_t GetSpendMS(int64_t startMS); + static uint32_t GetSpendUS(int64_t startUS); static std::string GetCurrentTime(); }; } // namespace OHOS::FileManagement::TimeUtils diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 286e5e3ba..e01ea2e11 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -283,8 +283,18 @@ static set ExpandPathWildcard(const vector &vec, bool onlyPath) return filteredPath; } +static void UpdateFileStat(std::shared_ptr appStatistic, std::string filePath, uint64_t fileSize, + uint32_t& maxDirDepth) +{ + appStatistic->UpdateFileDist(ExtractFileExt(filePath), fileSize); + uint32_t dirDepth = std::count(filePath.begin(), filePath.end(), '/'); + if (dirDepth > maxDirDepth) { + maxDirDepth = dirDepth; + } +} + tuple, map> BDir::GetBigFiles(const vector &includes, - const vector &excludes) + const vector &excludes, std::shared_ptr appStatistic) { set inc = ExpandPathWildcard(includes, true); @@ -317,9 +327,11 @@ tuple, map> BDir::GetBigFiles( }; map resSmallFiles; + uint32_t maxDirDepth = BConstants::APP_BASE_PATH_DEPTH; for (const auto &item : incSmallFiles) { if (!isMatch(endExcludes, item.first)) { resSmallFiles.emplace(item); + UpdateFileStat(appStatistic, item.first, item.second, maxDirDepth); } } @@ -327,8 +339,10 @@ tuple, map> BDir::GetBigFiles( for (const auto &item : incFiles) { if (!isMatch(endExcludes, item.first)) { bigFiles.emplace(item); + UpdateFileStat(appStatistic, item.first, item.second.st_size, maxDirDepth); } } + appStatistic->dirDepth_ = maxDirDepth - BConstants::APP_BASE_PATH_DEPTH; HILOGW("total number of big files is %{public}zu", bigFiles.size()); HILOGW("total number of small files is %{public}zu", resSmallFiles.size()); return {ERR_OK, move(bigFiles), move(resSmallFiles)}; diff --git a/utils/src/b_filesystem/b_file.cpp b/utils/src/b_filesystem/b_file.cpp index 27b910078..afa9839dd 100644 --- a/utils/src/b_filesystem/b_file.cpp +++ b/utils/src/b_filesystem/b_file.cpp @@ -218,4 +218,14 @@ bool BFile::EndsWith(const string &str, const string &suffix) } return (str.rfind(suffix) == (str.length() - suffix.length())); } + +uint64_t BFile::GetFileSize(const string &path) +{ + struct stat sta = {}; + if (stat(path.data(), &sta) == -1) { + HILOGE("get file size fail: %{public}s", path.c_str()); + return 0; + } + return sta.st_size; +} } // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_radar/radar_app_statistic.cpp b/utils/src/b_radar/radar_app_statistic.cpp new file mode 100644 index 000000000..29af92800 --- /dev/null +++ b/utils/src/b_radar/radar_app_statistic.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "b_radar/radar_app_statistic.h" +#include "filemgmt_libhilog.h" +#include "hisysevent.h" + +namespace OHOS::FileManagement::Backup { + +std::string FileStatList::ToJsonString() +{ + std::string result = "["; + ItemInfo* list = GetListPtr(); + uint32_t size = GetListSize(); + for (uint32_t i = 0; i < size; i++) { + if (i != 0) { + result += ","; + } + result += "{\"count\":" + std::to_string(list[i].count) + ", \"size\":" + std::to_string(list[i].size) + "}"; + } + result += "]"; + return result; +} + +uint8_t FileTypeStat::GetIndexByType(std::string fileExtension) +{ + auto it = FileTypeDef.find(fileExtension); + if (fileExtension.size() > 0 && it != FileTypeDef.end()) { + return static_cast(it->second); + } + return static_cast(FileType::OTHER); +} + +void FileTypeStat::UpdateStat(std::string extension, uint64_t size) +{ + uint8_t idx = GetIndexByType(extension); + typeInfoList_[idx].count++; + typeInfoList_[idx].size += size; +} + +void FileSizeStat::UpdateStat(uint64_t fileSize) +{ + if (fileSize < ONE_MB) { + sizeInfoList_[TINY].count++; + sizeInfoList_[TINY].size += fileSize; + } else if (fileSize < TWO_MB) { + sizeInfoList_[SMALL].count++; + sizeInfoList_[SMALL].size += fileSize; + } else if (fileSize < TEN_MB) { + sizeInfoList_[MEDIUM].count++; + sizeInfoList_[MEDIUM].size += fileSize; + } else if (fileSize < HUNDRED_MB) { + sizeInfoList_[BIG].count++; + sizeInfoList_[BIG].size += fileSize; + } else if (fileSize < ONE_GB) { + sizeInfoList_[GREAT_BIG].count++; + sizeInfoList_[GREAT_BIG].size += fileSize; + } else { + sizeInfoList_[GIANT].count++; + sizeInfoList_[GIANT].size += fileSize; + } +} + +void RadarAppStatistic::ReportBackup(const std::string &func, int32_t errorCode) +{ + HILOGI("radar__report appCaller:%{public}s, err:%{public}d, uniqId:%{public}ld, manageJsonSize:%{public}lu, " + "exConnectSpend:%{public}u, onBackupSpend:%{public}u, onBackupExSpend:%{public}u, tarSpend:%{public}u, " + "hashSpend:%{public}u, scanFileSpend:%{public}u, sendRZSpend:%{public}u, doBackupSpend:%{public}u, " + "smallFileCount:%{public}u, smallFileSize:%{public}lu, tarFileCount:%{public}u, tarFileSize:%{public}lu, " + "bigFileCount:%{public}u, bigFileSize:%{public}lu, tarBoundSize:%{public}lu, fileTypeDist:%{public}s, " + "fileSizeDist:%{public}s, dirDepth:%{public}u", + appCaller_.c_str(), errorCode, uniqId_, manageJsonSize_, + extConnectSpend_, onBackupSpend_.GetSpan(), onBackupexSpend_.GetSpan(), tarSpend_, hashSpendUS_ / MS_TO_US, + scanFileSpend_.GetSpan(), sendRateZeroSpendUS_ / MS_TO_US, doBackupSpend_.GetSpan(), smallFileCount_, + smallFileSize_, tarFileCount_, tarFileSize_, bigFileCount_, bigFileSize_, tarBoundSize_, + fileTypeDist_.ToJsonString().c_str(), fileSizeDist_.ToJsonString().c_str(), dirDepth_); + HiSysEventWrite( + DOMAIN, + BACKUP_RESTORE_APP_STATISTIC, + OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, + ORG_PKG, DOMAIN_NAME, + FUNC, func, + UNIQUE_ID, uniqId_, + BIZ_SCENE, static_cast(BizScene::BACKUP), + APP_CALLER, appCaller_, + FILE_SIZE_DIST, fileSizeDist_.ToJsonString(), + FILE_TYPE_DIST, fileTypeDist_.ToJsonString(), + SMALL_FILE_COUNT, smallFileCount_, + SMALL_FILE_SIZE, smallFileSize_, + BIG_FILE_COUNT, bigFileCount_, + BIG_FILE_SIZE, bigFileSize_, + TAR_FILE_COUNT, tarFileCount_, + TAR_FILE_SIZE, tarFileSize_, + TAR_BOUND_SIZE, tarBoundSize_, + DIR_DEPTH, dirDepth_, + MANAGE_JSON_SIZE, manageJsonSize_, + EXTENSION_CONNECT_SPEND, extConnectSpend_, + ON_BACKUP_SPEND, onBackupSpend_.GetSpan(), + ON_BACKUPEX_SPEND, onBackupexSpend_.GetSpan(), + TAR_SPEND, tarSpend_, + HASH_SPEND, hashSpendUS_ / MS_TO_US, + SCAN_FILE_SPEND, scanFileSpend_.GetSpan(), + SEND_RATE_ZERO_SPAN, sendRateZeroSpendUS_ / MS_TO_US, + DO_BACKUP_SPEND, doBackupSpend_.GetSpan(), + ERROR_CODE, errorCode); +} + +void RadarAppStatistic::ReportBackup(const std::string &func, BError errCode) +{ + ReportBackup(func, RadarErrorCode(MODULE_BACKUP, errCode).GenCode()); +} + +void RadarAppStatistic::ReportRestore(const std::string &func, int32_t errorCode) +{ + HILOGI("radar__report appCaller:%{public}s, err:%{public}d, uniqId:%{public}ld, tarFileCount:%{public}u, " + "tarFileSize:%{public}lu, bigFileCount:%{public}u, bigFileSize:%{public}lu, exConnectSpend:%{public}u, " + "onRestoreSpend:%{public}u, onRestoreExSpend:%{public}u, untarSpend:%{public}u, bigFileSpend:%{public}u, " + "doRestoreSpend:%{public}u, tarBoundSize:%{public}lu", + appCaller_.c_str(), errorCode, uniqId_, tarFileCount_, tarFileSize_, bigFileCount_, bigFileSize_, + extConnectSpend_, onRestoreSpend_.GetSpan(), onRestoreexSpend_.GetSpan(), untarSpend_, bigFileSpend_, + doRestoreSpend_, tarBoundSize_); + HiSysEventWrite( + DOMAIN, + BACKUP_RESTORE_APP_STATISTIC, + OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, + ORG_PKG, DOMAIN_NAME, + FUNC, func, + UNIQUE_ID, uniqId_, + BIZ_SCENE, static_cast(BizScene::RESTORE), + APP_CALLER, appCaller_, + BIG_FILE_COUNT, bigFileCount_, + BIG_FILE_SIZE, bigFileSize_, + TAR_FILE_COUNT, tarFileCount_, + TAR_FILE_SIZE, tarFileSize_, + TAR_BOUND_SIZE, tarBoundSize_, + EXTENSION_CONNECT_SPEND, extConnectSpend_, + ON_RESTORE_SPEND, onRestoreSpend_.GetSpan(), + ON_RESTOREEX_SPEND, onRestoreexSpend_.GetSpan(), + UNTAR_SPEND, untarSpend_, + BIG_FILE_SPEND, bigFileSpend_, + DO_RESTORE_SPEND, doRestoreSpend_, + ERROR_CODE, errorCode); +} + +void RadarAppStatistic::ReportRestore(const std::string &func, BError errCode) +{ + ReportRestore(func, RadarErrorCode(MODULE_RESTORE, errCode).GenCode()); +} + +void RadarAppStatistic::UpdateSendRateZeroSpend() +{ + sendRateZeroSpendUS_ += TimeUtils::GetSpendUS(sendRateZeroStart_); + sendRateZeroStart_ = 0; +} + +void RadarAppStatistic::UpdateFileDist(std::string fileExtension, uint64_t fileSize) +{ + fileSizeDist_.UpdateStat(fileSize); + fileTypeDist_.UpdateStat(fileExtension, fileSize); +} + +} // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_radar/radar_total_statistic.cpp b/utils/src/b_radar/radar_total_statistic.cpp new file mode 100644 index 000000000..e8c02429e --- /dev/null +++ b/utils/src/b_radar/radar_total_statistic.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "b_radar/radar_total_statistic.h" +#include "b_utils/b_time.h" +#include "filemgmt_libhilog.h" +#include "hisysevent.h" + +namespace OHOS::FileManagement::Backup { + +RadarTotalStatistic::RadarTotalStatistic(BizScene bizScene, std::string callerName, Mode mode) + : bizScene_(bizScene), hostPkg_(callerName), mode_(mode) +{ + uniqId_ = TimeUtils::GetTimeUS(); +} + +void RadarTotalStatistic::Report(const std::string &func, int32_t error) +{ + HILOGI("radar__report scene:%{public}d, err:%{public}d, uniqId:%{public}ld, hostPkg:%{public}s, mode:%{public}u, " + "succ:%{public}u, fail:%{public}u, totalSpend: %{public}u", static_cast(bizScene_), error, uniqId_, + hostPkg_.c_str(), static_cast(mode_), succBundleCount_, failBundleCount_, totalSpendTime_.GetSpan()); + HiSysEventWrite( + DOMAIN, + BACKUP_RESTORE_STATISTIC, + OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC, + ORG_PKG, DOMAIN_NAME, + FUNC, func, + UNIQUE_ID, uniqId_, + BIZ_SCENE, static_cast(bizScene_), + HOST_PKG, hostPkg_, + MODE, static_cast(mode_), + FAIL_BUNDLE_CNT, failBundleCount_, + SUCC_BUNDLE_CNT, succBundleCount_, + TOTAL_SPEND, totalSpendTime_.GetSpan(), + ERROR_CODE, error); +} + +void RadarTotalStatistic::Report(const std::string &func, uint32_t moduleId, uint16_t moduleErr) +{ + Report(func, RadarErrorCode(moduleId, moduleErr).GenCode()); +} + +void RadarTotalStatistic::Report(const std::string &func, BError errCode, uint32_t moduleId) +{ + Report(func, RadarErrorCode(moduleId, errCode).GenCode()); +} +} // namespace OHOS::FileManagement::Backup \ No newline at end of file diff --git a/utils/src/b_utils/b_time.cpp b/utils/src/b_utils/b_time.cpp index e6f49f7ce..f4ea1d3ec 100644 --- a/utils/src/b_utils/b_time.cpp +++ b/utils/src/b_utils/b_time.cpp @@ -42,6 +42,30 @@ int64_t TimeUtils::GetTimeUS() return nowUs.count(); } +uint32_t TimeUtils::GetSpendSecond(int64_t startTime) +{ + if (startTime == 0) { + return 0; + } + return static_cast(GetTimeS() - startTime); +} + +uint32_t TimeUtils::GetSpendMS(int64_t startTime) +{ + if (startTime == 0) { + return 0; + } + return static_cast(GetTimeMS() - startTime); +} + +uint32_t TimeUtils::GetSpendUS(int64_t startTime) +{ + if (startTime == 0) { + return 0; + } + return static_cast(GetTimeUS() - startTime); +} + std::string TimeUtils::GetCurrentTime() { auto now = std::chrono::system_clock::now(); -- Gitee From 48d8abece4c265f4cacb72ea3f176c2a2dae06a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B8=8A?= Date: Tue, 6 May 2025 19:35:40 +0800 Subject: [PATCH 2/4] fix code style check problem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘渊 --- .../native/backup_ext/src/ext_extension.cpp | 18 +----------------- .../include/module_ipc/svc_session_manager.h | 16 ++++++++++++++++ services/backup_sa/src/module_ipc/service.cpp | 11 +++-------- .../backup_ext/ext_extension_test.cpp | 4 ++-- utils/include/b_filesystem/b_dir.h | 8 ++++++++ utils/include/b_filesystem/b_file.h | 2 +- utils/include/b_radar/radar_app_statistic.h | 2 +- utils/src/b_filesystem/b_dir.cpp | 16 ++++++++++++++++ 8 files changed, 48 insertions(+), 29 deletions(-) diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 11b9414c5..849fb2b59 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -188,22 +188,6 @@ void BackupExtExtension::VerifyCaller() } } -static bool CheckAndCreateDirectory(const string &filePath) -{ - size_t pos = filePath.rfind('/'); - if (pos == string::npos) { - return true; - } - - string folderPath = "/" + filePath.substr(0, pos); - if (access(folderPath.c_str(), F_OK) != 0) { - if (!ForceCreateDirectory(folderPath.data())) { - return false; - } - } - return true; -} - static UniqueFd GetFileHandleForSpecialCloneCloud(const string &fileName) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); @@ -1329,7 +1313,7 @@ static bool RestoreBigFilePrecheck(string &fileName, const string &path, const s } // 目录不存在且只有大文件时,不能通过untar创建,需要检查并创建 - if (!CheckAndCreateDirectory(filePath)) { + if (!BDir::CheckAndCreateDirectory(filePath)) { HILOGE("failed to create directory %{public}s", GetAnonyString(filePath).c_str()); return false; } diff --git a/services/backup_sa/include/module_ipc/svc_session_manager.h b/services/backup_sa/include/module_ipc/svc_session_manager.h index c7dad1c97..63ab2fecc 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -644,6 +644,22 @@ private: std::atomic sessionCnt_ {0}; int32_t memoryParaCurSize_ {BConstants::DEFAULT_VFS_CACHE_PRESSURE}; }; + +class CounterHelper { +public: + CounterHelper(sptr session, const std::string& funcName) + : session_(session), funcName_(funcName) + { + session_->IncreaseSessionCnt(funcName_); + } + ~CounterHelper() + { + session_->DecreaseSessionCnt(funcName_); + } +private: + sptr session_; + std::string funcName_; +}; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_SESSION_MANAGER_H diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index e9c892796..6e4218602 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -681,45 +681,40 @@ ErrCode Service::AppendBundlesRestoreSession(UniqueFd fd, HILOGE("AppendBundles restore session with infos error, session is empty"); return BError(BError::Codes::SA_INVAL_ARG); } - session_->IncreaseSessionCnt(__PRETTY_FUNCTION__); + CounterHelper counterHelper(session_, __PRETTY_FUNCTION__); SetUserIdAndRestoreType(restoreType, userId); ErrCode ret = VerifyCaller(IServiceReverseType::Scenario::RESTORE); if (ret != ERR_OK) { HILOGE("AppendBundles restore session with infos error, verify caller failed, ret:%{public}d", ret); HandleExceptionOnAppendBundles(session_, bundleNames, {}); - session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return ret; } std::vector bundleNamesOnly; std::map isClearDataFlags; std::map> bundleNameDetailMap = BJsonUtil::BuildBundleInfos(bundleNames, bundleInfos, bundleNamesOnly, session_->GetSessionUserId(), - isClearDataFlags); + isClearDataFlags); std::string oldBackupVersion; auto restoreInfos = GetRestoreBundleNames(move(fd), session_, bundleNames, oldBackupVersion); auto restoreBundleNames = SvcRestoreDepsManager::GetInstance().GetRestoreBundleNames(restoreInfos, restoreType); HandleExceptionOnAppendBundles(session_, bundleNames, restoreBundleNames); if (restoreBundleNames.empty()) { HILOGE("AppendBundlesRestoreSession failed, restoreBundleNames is empty."); - session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return BError(BError::Codes::OK); } AppendBundles(restoreBundleNames); SetCurrentSessProperties(restoreInfos, restoreBundleNames, bundleNameDetailMap, isClearDataFlags, restoreType, - oldBackupVersion); + oldBackupVersion); OnStartSched(); - session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); HILOGI("End"); return BError(BError::Codes::OK); } catch (const BError &e) { HILOGE("Catch exception"); HandleExceptionOnAppendBundles(session_, bundleNames, {}); - session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return e.GetCode(); } catch (...) { HILOGE("Unexpected exception"); HandleExceptionOnAppendBundles(session_, bundleNames, {}); - session_->DecreaseSessionCnt(__PRETTY_FUNCTION__); return EPERM; } } diff --git a/tests/unittests/backup_ext/ext_extension_test.cpp b/tests/unittests/backup_ext/ext_extension_test.cpp index 9cb6f7cfd..8471b72d4 100644 --- a/tests/unittests/backup_ext/ext_extension_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_test.cpp @@ -86,7 +86,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0100, testing::ext::TestSize.Level GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0100"; try { string filePath = " "; - EXPECT_TRUE(CheckAndCreateDirectory(filePath)); + EXPECT_TRUE(BDir::CheckAndCreateDirectory(filePath)); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; @@ -108,7 +108,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0101, testing::ext::TestSize.Level GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0101"; try { string filePath = PATH + "/tmp"; - EXPECT_TRUE(CheckAndCreateDirectory(filePath)); + EXPECT_TRUE(BDir::CheckAndCreateDirectory(filePath)); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index 6afe25a8e..6952eafd3 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -43,6 +43,14 @@ public: */ static std::tuple> GetDirFiles(const std::string &path); + /** + * @brief 校验文件父目录是否存在,不存在时创建 + * + * @param 文件路径 + * @return 文件父目录是否已可用 + */ + static bool CheckAndCreateDirectory(const string &filePath); + /** * @brief 从给定的includes和excludes目录及文件中获取所有有用大文件和其链接文件的集合 * diff --git a/utils/include/b_filesystem/b_file.h b/utils/include/b_filesystem/b_file.h index 281f085d7..976afc300 100644 --- a/utils/include/b_filesystem/b_file.h +++ b/utils/include/b_filesystem/b_file.h @@ -100,7 +100,7 @@ public: * @return 0 if path is invalid * @return file size in byte if path is valid */ - static uint64_t GetFileSize(const string &path); + static uint64_t GetFileSize(const string &path); private: }; } // namespace OHOS::FileManagement::Backup diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h index dacccdcc3..2f70a3760 100644 --- a/utils/include/b_radar/radar_app_statistic.h +++ b/utils/include/b_radar/radar_app_statistic.h @@ -48,7 +48,7 @@ const std::unordered_map FileTypeDef = { {"raw", PIC}, {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, - {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"apk", COMPRESS}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} }; diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index e01ea2e11..32e2de21f 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -283,6 +283,22 @@ static set ExpandPathWildcard(const vector &vec, bool onlyPath) return filteredPath; } +bool BDir::CheckAndCreateDirectory(const string &filePath) +{ + size_t pos = filePath.rfind('/'); + if (pos == string::npos) { + return true; + } + + string folderPath = "/" + filePath.substr(0, pos); + if (access(folderPath.c_str(), F_OK) != 0) { + if (!ForceCreateDirectory(folderPath.data())) { + return false; + } + } + return true; +} + static void UpdateFileStat(std::shared_ptr appStatistic, std::string filePath, uint64_t fileSize, uint32_t& maxDirDepth) { -- Gitee From a8aec8de8e351ce113834fa4d83c974290759ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B8=8A?= Date: Wed, 7 May 2025 11:12:34 +0800 Subject: [PATCH 3/4] fix review problem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘渊 --- utils/include/b_filesystem/b_dir.h | 2 +- utils/include/b_radar/radar_app_statistic.h | 2 +- utils/src/b_filesystem/b_dir.cpp | 11 ++++++++++- utils/src/b_filesystem/b_file.cpp | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/utils/include/b_filesystem/b_dir.h b/utils/include/b_filesystem/b_dir.h index 6952eafd3..3a50241de 100644 --- a/utils/include/b_filesystem/b_dir.h +++ b/utils/include/b_filesystem/b_dir.h @@ -49,7 +49,7 @@ public: * @param 文件路径 * @return 文件父目录是否已可用 */ - static bool CheckAndCreateDirectory(const string &filePath); + static bool CheckAndCreateDirectory(const std::string &filePath); /** * @brief 从给定的includes和excludes目录及文件中获取所有有用大文件和其链接文件的集合 diff --git a/utils/include/b_radar/radar_app_statistic.h b/utils/include/b_radar/radar_app_statistic.h index 2f70a3760..eb3a933ac 100644 --- a/utils/include/b_radar/radar_app_statistic.h +++ b/utils/include/b_radar/radar_app_statistic.h @@ -48,7 +48,7 @@ const std::unordered_map FileTypeDef = { {"raw", PIC}, {"wav", AUDIO}, {"flac", AUDIO}, {"wma", AUDIO}, {"acc", AUDIO}, {"mp3", AUDIO}, {"ogg", AUDIO}, {"opus", AUDIO}, {"mov", VEDIO}, {"wmv", VEDIO}, {"rm", VEDIO}, {"rmvb", VEDIO}, {"3gp", VEDIO}, {"m4v", VEDIO}, {"mkv", VEDIO}, - {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, + {"rar", COMPRESS}, {"zip", COMPRESS}, {"7z", COMPRESS}, {"gz", COMPRESS}, {"iso", COMPRESS}, {"tar", COMPRESS}, {"exe", BIN}, {"doc", BIN}, {"docx", BIN}, {"xls", BIN}, {"xlsx", BIN}, {"ppt", BIN}, {"pdf", BIN} }; diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 32e2de21f..174767445 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -303,7 +303,16 @@ static void UpdateFileStat(std::shared_ptr appStatistic, std: uint32_t& maxDirDepth) { appStatistic->UpdateFileDist(ExtractFileExt(filePath), fileSize); - uint32_t dirDepth = std::count(filePath.begin(), filePath.end(), '/'); + uint32_t dirDepth = 0; + const char* pstr = filePath.c_str(); + char pre = '-'; + uint32_t pathLen = filePath.size(); + for (int i = 0; i < pathLen; i++) { + if (pstr[i] == '/' && pre != '/') { + dirDepth++; + } + pre = pstr[i]; + } if (dirDepth > maxDirDepth) { maxDirDepth = dirDepth; } diff --git a/utils/src/b_filesystem/b_file.cpp b/utils/src/b_filesystem/b_file.cpp index afa9839dd..1456a8e9a 100644 --- a/utils/src/b_filesystem/b_file.cpp +++ b/utils/src/b_filesystem/b_file.cpp @@ -223,7 +223,7 @@ uint64_t BFile::GetFileSize(const string &path) { struct stat sta = {}; if (stat(path.data(), &sta) == -1) { - HILOGE("get file size fail: %{public}s", path.c_str()); + HILOGE("get file size fail error:%{public}s", strerror(errno)); return 0; } return sta.st_size; -- Gitee From d89a65f956cc2bba68859716d02cdb84057dc5b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B8=8A?= Date: Wed, 7 May 2025 15:11:38 +0800 Subject: [PATCH 4/4] fix gitee compile problem MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘渊 --- utils/src/b_radar/radar_app_statistic.cpp | 18 ------------------ utils/src/b_radar/radar_total_statistic.cpp | 3 --- 2 files changed, 21 deletions(-) diff --git a/utils/src/b_radar/radar_app_statistic.cpp b/utils/src/b_radar/radar_app_statistic.cpp index 29af92800..6a78e9fbb 100644 --- a/utils/src/b_radar/radar_app_statistic.cpp +++ b/utils/src/b_radar/radar_app_statistic.cpp @@ -75,17 +75,6 @@ void FileSizeStat::UpdateStat(uint64_t fileSize) void RadarAppStatistic::ReportBackup(const std::string &func, int32_t errorCode) { - HILOGI("radar__report appCaller:%{public}s, err:%{public}d, uniqId:%{public}ld, manageJsonSize:%{public}lu, " - "exConnectSpend:%{public}u, onBackupSpend:%{public}u, onBackupExSpend:%{public}u, tarSpend:%{public}u, " - "hashSpend:%{public}u, scanFileSpend:%{public}u, sendRZSpend:%{public}u, doBackupSpend:%{public}u, " - "smallFileCount:%{public}u, smallFileSize:%{public}lu, tarFileCount:%{public}u, tarFileSize:%{public}lu, " - "bigFileCount:%{public}u, bigFileSize:%{public}lu, tarBoundSize:%{public}lu, fileTypeDist:%{public}s, " - "fileSizeDist:%{public}s, dirDepth:%{public}u", - appCaller_.c_str(), errorCode, uniqId_, manageJsonSize_, - extConnectSpend_, onBackupSpend_.GetSpan(), onBackupexSpend_.GetSpan(), tarSpend_, hashSpendUS_ / MS_TO_US, - scanFileSpend_.GetSpan(), sendRateZeroSpendUS_ / MS_TO_US, doBackupSpend_.GetSpan(), smallFileCount_, - smallFileSize_, tarFileCount_, tarFileSize_, bigFileCount_, bigFileSize_, tarBoundSize_, - fileTypeDist_.ToJsonString().c_str(), fileSizeDist_.ToJsonString().c_str(), dirDepth_); HiSysEventWrite( DOMAIN, BACKUP_RESTORE_APP_STATISTIC, @@ -124,13 +113,6 @@ void RadarAppStatistic::ReportBackup(const std::string &func, BError errCode) void RadarAppStatistic::ReportRestore(const std::string &func, int32_t errorCode) { - HILOGI("radar__report appCaller:%{public}s, err:%{public}d, uniqId:%{public}ld, tarFileCount:%{public}u, " - "tarFileSize:%{public}lu, bigFileCount:%{public}u, bigFileSize:%{public}lu, exConnectSpend:%{public}u, " - "onRestoreSpend:%{public}u, onRestoreExSpend:%{public}u, untarSpend:%{public}u, bigFileSpend:%{public}u, " - "doRestoreSpend:%{public}u, tarBoundSize:%{public}lu", - appCaller_.c_str(), errorCode, uniqId_, tarFileCount_, tarFileSize_, bigFileCount_, bigFileSize_, - extConnectSpend_, onRestoreSpend_.GetSpan(), onRestoreexSpend_.GetSpan(), untarSpend_, bigFileSpend_, - doRestoreSpend_, tarBoundSize_); HiSysEventWrite( DOMAIN, BACKUP_RESTORE_APP_STATISTIC, diff --git a/utils/src/b_radar/radar_total_statistic.cpp b/utils/src/b_radar/radar_total_statistic.cpp index e8c02429e..73d40debe 100644 --- a/utils/src/b_radar/radar_total_statistic.cpp +++ b/utils/src/b_radar/radar_total_statistic.cpp @@ -28,9 +28,6 @@ RadarTotalStatistic::RadarTotalStatistic(BizScene bizScene, std::string callerNa void RadarTotalStatistic::Report(const std::string &func, int32_t error) { - HILOGI("radar__report scene:%{public}d, err:%{public}d, uniqId:%{public}ld, hostPkg:%{public}s, mode:%{public}u, " - "succ:%{public}u, fail:%{public}u, totalSpend: %{public}u", static_cast(bizScene_), error, uniqId_, - hostPkg_.c_str(), static_cast(mode_), succBundleCount_, failBundleCount_, totalSpendTime_.GetSpan()); HiSysEventWrite( DOMAIN, BACKUP_RESTORE_STATISTIC, -- Gitee