From 54277a29478f41ebca993e515fb07fb72fdfc433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=99=9F=E9=92=B0?= Date: Thu, 30 May 2024 17:38:22 +0800 Subject: [PATCH] =?UTF-8?q?extension=20=E5=86=85=E5=AD=98=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张晟钰 --- .../native/backup_ext/include/ext_extension.h | 12 +-- .../native/backup_ext/src/ext_extension.cpp | 98 +++++++++++-------- .../src/module_ipc/service_incremental.cpp | 1 - .../backup_ext/ext_extension_test.cpp | 73 ++++++-------- 4 files changed, 97 insertions(+), 87 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 4496d2976..cfd08e8b2 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -137,15 +137,15 @@ private: void AsyncTaskOnBackup(); - int DoIncrementalBackup(const std::map &allFiles, - const std::map &smallFiles, - const std::map &bigFiles); + int DoIncrementalBackup(const std::vector &allFiles, + const std::vector &smallFiles, + const std::vector &bigFiles); void CompareFiles(UniqueFd incrementalFd, UniqueFd manifestFd, - map &allFiles, - map &smallFiles, - map &bigFiles); + vector &allFiles, + vector &smallFiles, + vector &bigFiles); void AsyncTaskDoIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd); void AsyncTaskOnIncrementalBackup(); diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 3d03d6418..dfba355a3 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -1260,11 +1260,25 @@ static bool CheckTar(const string &fileName) return ExtractFileExt(fileName) == "tar"; } +static bool IfEquality(const ReportFileInfo &info, const ReportFileInfo &infoAd) +{ + return info.filePath < infoAd.filePath; +} + +static void AdDeduplication(vector &FilesList) +{ + sort(FilesList.begin(), FilesList.end(), IfEquality); + auto it = unique(FilesList.begin(), FilesList.end(), [](const ReportFileInfo &info, const ReportFileInfo &infoAd) { + return info.filePath == infoAd.filePath; + }); + FilesList.erase(it, FilesList.end()); +} + void BackupExtExtension::CompareFiles(UniqueFd incrementalFd, UniqueFd manifestFd, - map &allFiles, - map &smallFiles, - map &bigFiles) + vector &allFiles, + vector &smallFiles, + vector &bigFiles) { HILOGI("Begin Compare"); struct ReportFileInfo storageFiles; @@ -1274,14 +1288,14 @@ void BackupExtExtension::CompareFiles(UniqueFd incrementalFd, while (storageRp.GetStorageReportInfos(storageFiles)) { // 进行文件对比 - string path = storageFiles.filePath; + const string &path = storageFiles.filePath; if (path.empty()) { HILOGD("GetStorageReportInfos failed"); continue; } bool isExist = cloudFiles.find(path) != cloudFiles.end() ? true : false; if (storageFiles.isIncremental == true && storageFiles.isDir == true && !isExist) { - smallFiles.try_emplace(path, storageFiles); + smallFiles.push_back(storageFiles); } if (storageFiles.isIncremental == true && storageFiles.isDir == false) { auto [res, fileHash] = BFileHash::HashWithSHA256(path); @@ -1295,17 +1309,20 @@ void BackupExtExtension::CompareFiles(UniqueFd incrementalFd, storageFiles.userTar = 1; } - allFiles.try_emplace(path, storageFiles); + allFiles.push_back(storageFiles); if (storageFiles.isDir == false && storageFiles.isIncremental == true && (!isExist || cloudFiles.find(path)->second.hash != storageFiles.hash)) { // 在云空间简报里不存在或者hash不一致 if (storageFiles.size <= BConstants::BIG_FILE_BOUNDARY) { - smallFiles.try_emplace(path, storageFiles); + smallFiles.push_back(storageFiles); continue; } - bigFiles.try_emplace(path, storageFiles); + bigFiles.push_back(storageFiles); } } + AdDeduplication(allFiles); + AdDeduplication(smallFiles); + AdDeduplication(bigFiles); HILOGI("End Compare"); } @@ -1346,7 +1363,7 @@ tuple BackupExtExtension::GetIncrementalBackupFileHandle() return {UniqueFd(-1), UniqueFd(-1)}; } -static void WriteFile(const string &filename, const map &srcFiles) +static void WriteFile(const string &filename, const vector &srcFiles) { fstream f; f.open(filename.data(), ios::out); @@ -1359,11 +1376,10 @@ static void WriteFile(const string &filename, const map &files) +static TarMap GetIncrmentBigInfos(const vector &files) { auto getStringHash = [](const TarMap &m, const string &str) -> string { ostringstream strHex; @@ -1398,10 +1414,12 @@ static TarMap GetIncrmentBigInfos(const map &file TarMap bigFiles; for (const auto &item : files) { struct stat sta = {}; - stat(item.first.c_str(), &sta); - string md5Name = getStringHash(bigFiles, item.first); + if (stat(item.filePath.c_str(), &sta) != 0) { + throw BError(BError::Codes::EXT_INVAL_ARG, "Get file stat failed"); + } + string md5Name = getStringHash(bigFiles, item.filePath); if (!md5Name.empty()) { - bigFiles.emplace(md5Name, make_tuple(item.first, sta, true)); + bigFiles.emplace(md5Name, make_tuple(item.filePath, sta, true)); } } @@ -1412,7 +1430,7 @@ static TarMap GetIncrmentBigInfos(const map &file * 增量tar包和简报信息回传 */ static ErrCode IncrementalTarFileReady(const TarMap &bigFileInfo, - const map &srcFiles, + const vector &srcFiles, sptr proxy) { string tarFile = bigFileInfo.begin()->first; @@ -1438,7 +1456,7 @@ static ErrCode IncrementalTarFileReady(const TarMap &bigFileInfo, * 增量大文件和简报信息回传 */ static ErrCode IncrementalBigFileReady(const TarMap &pkgInfo, - const map &bigInfos, + const vector &bigInfos, sptr proxy) { ErrCode ret {ERR_OK}; @@ -1455,13 +1473,15 @@ static ErrCode IncrementalBigFileReady(const TarMap &pkgInfo, errno); errCode = BError::GetCodeByErrno(errno); } - - struct ReportFileInfo info = bigInfos.find(path)->second; + vector bigInfo; + for (const auto &tempFile : bigInfos) { + if (tempFile.filePath == path) { + bigInfo.emplace_back(tempFile); + break; + } + } string file = GetReportFileName(string(INDEX_FILE_INCREMENTAL_BACKUP).append(item.first)); - map bigInfo; - bigInfo.try_emplace(path, info); WriteFile(file, bigInfo); - ret = proxy->AppIncrementalFileReady(item.first, std::move(fd), UniqueFd(open(file.data(), O_RDONLY)), errCode); if (SUCCEEDED(ret)) { HILOGI("IncrementalBigFileReady: The application is packaged successfully, package name is %{public}s", @@ -1479,7 +1499,7 @@ void BackupExtExtension::AsyncTaskDoIncrementalBackup(UniqueFd incrementalFd, Un HILOGI("Start AsyncTaskDoIncrementalBackup"); int incrementalFdDup = dup(incrementalFd); int manifestFdDup = dup(manifestFd); - if (incrementalFdDup < 0 || manifestFdDup < 0) { + if (incrementalFdDup < 0) { throw BError(BError::Codes::EXT_INVAL_ARG, "dup failed"); } auto task = [obj {wptr(this)}, manifestFdDup, incrementalFdDup]() { @@ -1489,16 +1509,16 @@ void BackupExtExtension::AsyncTaskDoIncrementalBackup(UniqueFd incrementalFd, Un "Ext extension handle have been already released"); BExcepUltils::BAssert(ptr->extension_, BError::Codes::EXT_INVAL_ARG, "extension handle have been already released"); - map allFiles; - map smallFiles; - map bigFiles; UniqueFd incrementalDupFd(dup(incrementalFdDup)); UniqueFd manifestDupFd(dup(manifestFdDup)); - if (incrementalDupFd < 0 || manifestDupFd < 0) { + if (incrementalDupFd < 0) { throw BError(BError::Codes::EXT_INVAL_ARG, "dup failed"); } close(incrementalFdDup); close(manifestFdDup); + vector allFiles; + vector smallFiles; + vector bigFiles; ptr->CompareFiles(move(incrementalDupFd), move(manifestDupFd), allFiles, smallFiles, bigFiles); auto ret = ptr->DoIncrementalBackup(allFiles, smallFiles, bigFiles); ptr->AppIncrementalDone(ret); @@ -1571,22 +1591,22 @@ static string GetIncrmentPartName() return to_string(milliseconds.count()) + "_part"; } -static void IncrementalPacket(const map &infos, TarMap &tar, sptr proxy) +static void IncrementalPacket(const vector &infos, TarMap &tar, sptr proxy) { HILOGI("IncrementalPacket begin"); string path = string(BConstants::PATH_BUNDLE_BACKUP_HOME).append(BConstants::SA_BUNDLE_BACKUP_BACKUP); int64_t totalSize = 0; uint32_t fileCount = 0; vector packFiles; - map tarInfos; + vector tarInfos; // 设置下打包模式 TarFile::GetInstance().SetPacketMode(true); string partName = GetIncrmentPartName(); for (auto small : infos) { - totalSize += small.second.size; + totalSize += small.size; fileCount += 1; - packFiles.emplace_back(small.first); - tarInfos.try_emplace(small.first, small.second); + packFiles.emplace_back(small.filePath); + tarInfos.emplace_back(small); if (totalSize >= DEFAULT_SLICE_SIZE || fileCount >= MAX_FILE_COUNT) { TarMap tarMap {}; TarFile::GetInstance().Packet(packFiles, partName, path, tarMap); @@ -1611,7 +1631,7 @@ static void IncrementalPacket(const map &infos, T } static ErrCode IncrementalAllFileReady(const TarMap &pkgInfo, - const map &srcFiles, + const vector &srcFiles, sptr proxy) { UniqueFd fdIndex(open(INDEX_FILE_BACKUP.data(), O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)); @@ -1641,9 +1661,9 @@ static ErrCode IncrementalAllFileReady(const TarMap &pkgInfo, return ret; } -int BackupExtExtension::DoIncrementalBackup(const map &allFiles, - const map &smallFiles, - const map &bigFiles) +int BackupExtExtension::DoIncrementalBackup(const vector &allFiles, + const vector &smallFiles, + const vector &bigFiles) { HILOGI("Do increment backup"); if (extension_->GetExtensionAction() != BConstants::ExtensionAction::BACKUP) { diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index 8aa1079e2..51a78c521 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -137,7 +137,6 @@ void Service::StartGetFdTask(std::string bundleName, wptr ptr) auto session = thisPtr->session_; if (session == nullptr) { throw BError(BError::Codes::SA_INVAL_ARG, "session is nullptr"); - return; } auto backUpConnection = session->GetExtConnection(bundleName); auto proxy = backUpConnection->GetBackupExtProxy(); diff --git a/tests/unittests/backup_ext/ext_extension_test.cpp b/tests/unittests/backup_ext/ext_extension_test.cpp index b739e24f0..87a4cdcbb 100644 --- a/tests/unittests/backup_ext/ext_extension_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_test.cpp @@ -333,7 +333,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0601, testing::ext::TestSize.Level int fd = open(fileName.data(), O_RDWR | O_TRUNC, S_IRWXU); EXPECT_GT(fd, 0); close(fd); - map srcFiles; + vector srcFiles; WriteFile(fileName, srcFiles); ifstream f(fileName); if (!f.is_open()) { @@ -368,7 +368,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0602, testing::ext::TestSize.Level int fd = open(fileName.data(), O_RDWR | O_TRUNC, S_IRWXU); EXPECT_GT(fd, 0); close(fd); - map srcFiles; + vector srcFiles; struct ReportFileInfo info; info.mode = "755"; info.isDir = 0; @@ -377,7 +377,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0602, testing::ext::TestSize.Level info.hash = "1234567890"; info.userTar = 1; info.encodeFlag = true; - srcFiles["/data/test.txt"] = info; + srcFiles.push_back(info); WriteFile(fileName, srcFiles); ifstream f(fileName); if (!f.is_open()) { @@ -408,7 +408,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0603, testing::ext::TestSize.Level GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0603"; try { string fileName = PATH + BUNDLE_NAME + FILE_NAME; - map srcFiles; + vector srcFiles; struct ReportFileInfo info; info.mode = "755"; info.isDir = 0; @@ -417,7 +417,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0603, testing::ext::TestSize.Level info.hash = "1234567890"; info.userTar = 1; info.encodeFlag = false; - srcFiles["/data/test.txt"] = info; + srcFiles.push_back(info); WriteFile(fileName, srcFiles); ifstream f(fileName); if (!f.is_open()) { @@ -447,7 +447,7 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0700, testing::ext::TestSize.Level { GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0700"; try { - map files; + vector files; TarMap result = GetIncrmentBigInfos(files); EXPECT_TRUE(result.empty()); } catch (...) { @@ -470,9 +470,18 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0701, testing::ext::TestSize.Level { GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0701"; try { - map files; - files.emplace("test", (struct ReportFileInfo) {}); - TarMap result = GetIncrmentBigInfos(files); + vector srcFiles; + struct ReportFileInfo info; + info.filePath = PATH + BUNDLE_NAME; + info.mode = "755"; + info.isDir = 0; + info.size = 1024; + info.mtime = 123456789; + info.hash = "1234567890"; + info.userTar = 1; + info.encodeFlag = false; + srcFiles.push_back(info); + TarMap result = GetIncrmentBigInfos(srcFiles); EXPECT_EQ(result.size(), 1); } catch (...) { EXPECT_TRUE(false); @@ -494,42 +503,24 @@ HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0702, testing::ext::TestSize.Level { GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0702"; try { - map files; - files.emplace("test", (struct ReportFileInfo) {}); - files.emplace("test", (struct ReportFileInfo) {}); - TarMap result = GetIncrmentBigInfos(files); - EXPECT_EQ(result.size(), 1); - } catch (...) { - EXPECT_TRUE(false); - GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; - } - GTEST_LOG_(INFO) << "ExtExtensionTest-end Ext_Extension_Test_0702"; -} - -/** - * @tc.number: SUB_Ext_Extension_0703 - * @tc.name: Ext_Extension_Test_0703 - * @tc.desc: 测试file有2个元素 - * @tc.size: MEDIUM - * @tc.type: FUNC - * @tc.level Level 1 - * @tc.require: I9P3Y3 - */ -HWTEST_F(ExtExtensionTest, Ext_Extension_Test_0703, testing::ext::TestSize.Level1) -{ - GTEST_LOG_(INFO) << "ExtExtensionTest-begin Ext_Extension_Test_0703"; - try { - map files; - files.emplace("test1", (struct ReportFileInfo) {}); - files.emplace("test2", (struct ReportFileInfo) {}); - TarMap result = GetIncrmentBigInfos(files); + vector srcFiles; + struct ReportFileInfo info; + info.filePath = PATH + BUNDLE_NAME; + info.mode = "755"; + info.isDir = 0; + info.size = 1024; + info.mtime = 123456789; + info.hash = "1234567890"; + info.userTar = 1; + info.encodeFlag = false; + srcFiles.push_back(info); + srcFiles.push_back(info); + TarMap result = GetIncrmentBigInfos(srcFiles); EXPECT_EQ(result.size(), 2); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ExtExtensionTest-an exception occurred by construction."; } - GTEST_LOG_(INFO) << "ExtExtensionTest-end Ext_Extension_Test_0703"; + GTEST_LOG_(INFO) << "ExtExtensionTest-end Ext_Extension_Test_0702"; } - - } // namespace OHOS::FileManagement::Backup \ No newline at end of file -- Gitee