diff options
author | Yurii Zubrytskyi <zyy@google.com> | 2021-02-19 00:08:36 -0800 |
---|---|---|
committer | Yurii Zubrytskyi <zyy@google.com> | 2021-02-22 05:15:50 +0000 |
commit | 3fde572afccd84e1a6573ebb02a89be3ff18d1fe (patch) | |
tree | 83abf13175c1272267b12a0ef09ffbe945824020 /services/incremental/IncrementalService.cpp | |
parent | a5946f7056fe30957f8eebd2beac06ea389dbbc9 (diff) |
Fix the progress getting for mapped files
Mapped files don't support querying their loading progress,
so we should simply skip them - they are already a part of
some other file, and will get accounted for loading when
that file's progress get queried
+ a bunch of small improvements
Bug: 180535478
Test: atest service.incremental_test, adb install --incremental
with mapped native libs
Change-Id: Ifc8a402144f2f3669a0419124fb0f35d7002190a
(cherry picked from commit 7731ebd1d8187c92a992d1f53c4114a6c40f7563)
Diffstat (limited to 'services/incremental/IncrementalService.cpp')
-rw-r--r-- | services/incremental/IncrementalService.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index 24623b2dacfc..ce6e6ab1e29c 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1936,25 +1936,33 @@ IncrementalService::LoadingProgress IncrementalService::getLoadingProgress( } IncrementalService::LoadingProgress IncrementalService::getLoadingProgressFromPath( - const IncFsMount& ifs, std::string_view storagePath, bool stopOnFirstIncomplete) const { - ssize_t totalBlocks = 0, filledBlocks = 0; - const auto filePaths = mFs->listFilesRecursive(storagePath); - for (const auto& filePath : filePaths) { + const IncFsMount& ifs, std::string_view storagePath, + const bool stopOnFirstIncomplete) const { + ssize_t totalBlocks = 0, filledBlocks = 0, error = 0; + mFs->listFilesRecursive(storagePath, [&, this](auto filePath) { const auto [filledBlocksCount, totalBlocksCount] = mIncFs->countFilledBlocks(ifs.control, filePath); + if (filledBlocksCount == -EOPNOTSUPP || filledBlocksCount == -ENOTSUP || + filledBlocksCount == -ENOENT) { + // a kind of a file that's not really being loaded, e.g. a mapped range + // an older IncFS used to return ENOENT in this case, so handle it the same way + return true; + } if (filledBlocksCount < 0) { LOG(ERROR) << "getLoadingProgress failed to get filled blocks count for: " << filePath << " errno: " << filledBlocksCount; - return {filledBlocksCount, filledBlocksCount}; + error = filledBlocksCount; + return false; } totalBlocks += totalBlocksCount; filledBlocks += filledBlocksCount; if (stopOnFirstIncomplete && filledBlocks < totalBlocks) { - break; + return false; } - } + return true; + }); - return {filledBlocks, totalBlocks}; + return error ? LoadingProgress{error, error} : LoadingProgress{filledBlocks, totalBlocks}; } bool IncrementalService::updateLoadingProgress( |