Parallelize delta read non file data.
The non file data part could be thousands of blocks, which takes quite
some time, so put it into the thread pool.
Bug: 77817425
Test: generate a delta payload
Change-Id: I477d7b9cd8e06b4bc84df9474ad3cea358fefec4
diff --git a/payload_generator/delta_diff_utils.cc b/payload_generator/delta_diff_utils.cc
index 877e13f..bb98c62 100644
--- a/payload_generator/delta_diff_utils.cc
+++ b/payload_generator/delta_diff_utils.cc
@@ -214,8 +214,8 @@
void MergeOperation(vector<AnnotatedOperation>* aops);
private:
- const string& old_part_;
- const string& new_part_;
+ const string& old_part_; // NOLINT(runtime/member_string_references)
+ const string& new_part_; // NOLINT(runtime/member_string_references)
const PayloadVersion& version_;
// The block ranges of the old/new file within the src/tgt image
@@ -343,6 +343,36 @@
hard_chunk_blocks,
blob_file);
}
+ // Process all the blocks not included in any file. We provided all the unused
+ // blocks in the old partition as available data.
+ vector<Extent> new_unvisited = {
+ ExtentForRange(0, new_part.size / kBlockSize)};
+ new_unvisited = FilterExtentRanges(new_unvisited, new_visited_blocks);
+ if (!new_unvisited.empty()) {
+ vector<Extent> old_unvisited;
+ if (old_part.fs_interface) {
+ old_unvisited.push_back(ExtentForRange(0, old_part.size / kBlockSize));
+ old_unvisited = FilterExtentRanges(old_unvisited, old_visited_blocks);
+ }
+
+ LOG(INFO) << "Scanning " << utils::BlocksInExtents(new_unvisited)
+ << " unwritten blocks using chunk size of " << soft_chunk_blocks
+ << " blocks.";
+ // We use the soft_chunk_blocks limit for the <non-file-data> as we don't
+ // really know the structure of this data and we should not expect it to
+ // have redundancy between partitions.
+ file_delta_processors.emplace_back(
+ old_part.path,
+ new_part.path,
+ version,
+ std::move(old_unvisited),
+ std::move(new_unvisited),
+ vector<puffin::BitExtent>{}, // old_deflates,
+ vector<puffin::BitExtent>{}, // new_deflates
+ "<non-file-data>", // operation name
+ soft_chunk_blocks,
+ blob_file);
+ }
size_t max_threads = GetMaxThreads();
base::DelegateSimpleThreadPool thread_pool("incremental-update-generator",
@@ -357,38 +387,6 @@
processor.MergeOperation(aops);
}
- // Process all the blocks not included in any file. We provided all the unused
- // blocks in the old partition as available data.
- vector<Extent> new_unvisited = {
- ExtentForRange(0, new_part.size / kBlockSize)};
- new_unvisited = FilterExtentRanges(new_unvisited, new_visited_blocks);
- if (new_unvisited.empty())
- return true;
-
- vector<Extent> old_unvisited;
- if (old_part.fs_interface) {
- old_unvisited.push_back(ExtentForRange(0, old_part.size / kBlockSize));
- old_unvisited = FilterExtentRanges(old_unvisited, old_visited_blocks);
- }
-
- LOG(INFO) << "Scanning " << utils::BlocksInExtents(new_unvisited)
- << " unwritten blocks using chunk size of " << soft_chunk_blocks
- << " blocks.";
- // We use the soft_chunk_blocks limit for the <non-file-data> as we don't
- // really know the structure of this data and we should not expect it to have
- // redundancy between partitions.
- TEST_AND_RETURN_FALSE(DeltaReadFile(aops,
- old_part.path,
- new_part.path,
- old_unvisited,
- new_unvisited,
- {}, // old_deflates,
- {}, // new_deflates
- "<non-file-data>", // operation name
- soft_chunk_blocks,
- version,
- blob_file));
-
return true;
}