ota_extractor: improve logging
Now that partition extractions are multi-threaded, failure logs can get
confusing.
Add failed partition strings to CHECK(), which aborts all threads
immediately. Also report failed partitions by using std::pair<> to
handle TEST_AND_RETURN_FALSE() cases.
Test: m ota_extractor
Change-Id: I50ffbf8766c4e06bc114a9bd2ce4ef80021ba938
Signed-off-by: Juhyung Park <qkrwngud825@gmail.com>
diff --git a/aosp/ota_extractor.cc b/aosp/ota_extractor.cc
index d3b2705..42270f4 100644
--- a/aosp/ota_extractor.cc
+++ b/aosp/ota_extractor.cc
@@ -134,7 +134,8 @@
TEST_AND_RETURN_FALSE(fd_utils::ReadAndHashExtents(
in_fd, op.src_extents(), manifest.block_size(), &actual_hash));
CHECK_EQ(HexEncode(ToStringView(actual_hash)),
- HexEncode(op.src_sha256_hash()));
+ HexEncode(op.src_sha256_hash()))
+ << ", failed partition: " << partition.partition_name();
}
blob.resize(op.data_length());
@@ -146,7 +147,8 @@
brillo::Blob actual_hash;
TEST_AND_RETURN_FALSE(HashCalculator::RawHashOfData(blob, &actual_hash));
CHECK_EQ(HexEncode(ToStringView(actual_hash)),
- HexEncode(op.data_sha256_hash()));
+ HexEncode(op.data_sha256_hash()))
+ << ", failed partition: " << partition.partition_name();
}
auto direct_writer = std::make_unique<DirectExtentWriter>(out_fd);
if (op.type() == InstallOperation::ZERO) {
@@ -158,11 +160,13 @@
TEST_AND_RETURN_FALSE(executor.ExecuteReplaceOperation(
op, std::move(direct_writer), blob.data()));
} else if (op.type() == InstallOperation::SOURCE_COPY) {
- CHECK(in_fd->IsOpen());
+ CHECK(in_fd->IsOpen())
+ << ", failed partition: " << partition.partition_name();
TEST_AND_RETURN_FALSE(executor.ExecuteSourceCopyOperation(
op, std::move(direct_writer), in_fd));
} else {
- CHECK(in_fd->IsOpen());
+ CHECK(in_fd->IsOpen())
+ << ", failed partition: " << partition.partition_name();
TEST_AND_RETURN_FALSE(executor.ExecuteDiffOperation(
op, std::move(direct_writer), in_fd, blob.data(), blob.size()));
}
@@ -183,6 +187,8 @@
<< " hash mismatches. Either the source image or OTA package is "
"corrupted.";
+ LOG(INFO) << "Extracted partition " << partition.partition_name();
+
return true;
}
@@ -196,6 +202,7 @@
const size_t data_begin = metadata.GetMetadataSize() +
metadata.GetMetadataSignatureSize() +
payload_offset;
+ bool ret = true;
if (FLAGS_single_thread) {
for (const auto& partition : manifest.partitions()) {
@@ -205,28 +212,33 @@
payload_fd,
input_dir,
output_dir)) {
- return false;
+ ret = false;
+ LOG(ERROR) << "Extraction of partition " << partition.partition_name()
+ << " failed";
+ break;
}
}
} else {
- std::vector<std::future<bool>> futures;
+ std::vector<std::pair<std::future<bool>, std::string>> futures;
for (const auto& partition : manifest.partitions()) {
- futures.push_back(std::async(std::launch::async,
- ExtractImageFromPartition,
- manifest,
- partition,
- data_begin,
- payload_fd,
- input_dir,
- output_dir));
+ futures.push_back(std::make_pair(std::async(std::launch::async,
+ ExtractImageFromPartition,
+ manifest,
+ partition,
+ data_begin,
+ payload_fd,
+ input_dir,
+ output_dir),
+ partition.partition_name()));
}
for (auto& future : futures) {
- if (!future.get()) {
- return false;
+ if (!future.first.get()) {
+ ret = false;
+ LOG(ERROR) << "Extraction of partition " << future.second << " failed";
}
}
}
- return true;
+ return ret;
}
} // namespace chromeos_update_engine