Fix S to T incremental OTA with XOR disabled
In aosp/2506303 VABCPartitionWriter::PerformSourceCopyOperation
was coded to skip all code path if XOR disabled. But actually, we still
need to write COPY blocks which are converted to a replace.
Test: th
Test: S to T incremental OTA
Bug: 274539246
Change-Id: Ibab15366593fe05834c7bf2234db92a6bff0e858
diff --git a/payload_consumer/vabc_partition_writer.cc b/payload_consumer/vabc_partition_writer.cc
index 2016af7..92f27a9 100644
--- a/payload_consumer/vabc_partition_writer.cc
+++ b/payload_consumer/vabc_partition_writer.cc
@@ -95,6 +95,8 @@
}
copy_blocks_.AddExtent(cow_op.dst_extent());
}
+ LOG(INFO) << "Partition `" << partition_update.partition_name() << " has "
+ << copy_blocks_.blocks() << " copy blocks";
}
bool VABCPartitionWriter::DoesDeviceSupportsXor() {
@@ -273,11 +275,6 @@
// we still want to verify that all blocks contain expected data.
auto source_fd = verified_source_fd_.ChooseSourceFD(operation, error);
TEST_AND_RETURN_FALSE(source_fd != nullptr);
- // For devices not supporting XOR, sequence op is not supported, so all COPY
- // operations are written up front in strict merge order.
- if (!DoesDeviceSupportsXor()) {
- return true;
- }
std::vector<CowOperation> converted;
const auto& src_extents = operation.src_extents();
@@ -286,6 +283,9 @@
BlockIterator it2{dst_extents};
const bool userSnapshots = android::base::GetBoolProperty(
"ro.virtual_ab.userspace.snapshots.enabled", false);
+ // For devices not supporting XOR, sequence op is not supported, so all COPY
+ // operations are written up front in strict merge order.
+ const auto sequence_op_supported = DoesDeviceSupportsXor();
while (!it1.is_end() && !it2.is_end()) {
const auto src_block = *it1;
const auto dst_block = *it2;
@@ -295,7 +295,9 @@
continue;
}
if (copy_blocks_.ContainsBlock(dst_block)) {
- push_back(&converted, {CowOperation::CowCopy, src_block, dst_block, 1});
+ if (sequence_op_supported) {
+ push_back(&converted, {CowOperation::CowCopy, src_block, dst_block, 1});
+ }
} else {
push_back(&converted,
{CowOperation::CowReplace, src_block, dst_block, 1});
diff --git a/payload_consumer/vabc_partition_writer_unittest.cc b/payload_consumer/vabc_partition_writer_unittest.cc
index b053bbf..3cdf3bc 100644
--- a/payload_consumer/vabc_partition_writer_unittest.cc
+++ b/payload_consumer/vabc_partition_writer_unittest.cc
@@ -151,7 +151,21 @@
if (xor_enabled) {
ON_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag())
.WillByDefault(Return(FeatureFlag(FeatureFlag::Value::LAUNCH)));
+ } else {
+ ON_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag())
+ .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE)));
}
+ InstallOperation& install_op = *partition_update_.add_operations();
+ install_op.set_type(InstallOperation::SOURCE_COPY);
+ *install_op.add_src_extents() = ExtentForRange(5, 1);
+ *install_op.add_src_extents() = ExtentForRange(10, 1);
+ *install_op.add_src_extents() = ExtentForRange(15, 2);
+ *install_op.add_src_extents() = ExtentForRange(20, 2);
+
+ *install_op.add_dst_extents() = ExtentForRange(10, 1);
+ *install_op.add_dst_extents() = ExtentForRange(15, 1);
+ *install_op.add_dst_extents() = ExtentForRange(20, 2);
+ *install_op.add_dst_extents() = ExtentForRange(25, 2);
AddMergeOp(&partition_update_, {5, 1}, {10, 1}, CowMergeOperation::COW_COPY);
AddMergeOp(&partition_update_, {10, 1}, {15, 1}, CowMergeOperation::COW_COPY);
AddMergeOp(&partition_update_, {15, 2}, {20, 2}, CowMergeOperation::COW_COPY);
@@ -178,6 +192,8 @@
EXPECT_CALL(*cow_writer, EmitCopy(20, 15, 2));
EXPECT_CALL(*cow_writer, EmitCopy(25, 20, 1));
+ EXPECT_CALL(*cow_writer, EmitRawBlocks(26, _, 4096))
+ .WillOnce(Return(true));
EXPECT_CALL(*cow_writer, Finalize());
} else {
Sequence s;
@@ -187,24 +203,13 @@
EXPECT_CALL(*cow_writer, EmitCopy(20, 15, 2)).InSequence(s);
EXPECT_CALL(*cow_writer, EmitCopy(25, 20, 1)).InSequence(s);
+ EXPECT_CALL(*cow_writer, EmitRawBlocks(26, _, 4096))
+ .InSequence(s)
+ .WillOnce(Return(true));
}
return cow_writer;
}));
ASSERT_TRUE(writer_.Init(&install_plan_, true, 0));
- if (!xor_enabled) {
- return;
- }
- InstallOperation install_op;
- install_op.set_type(InstallOperation::SOURCE_COPY);
- *install_op.add_src_extents() = ExtentForRange(5, 1);
- *install_op.add_src_extents() = ExtentForRange(10, 1);
- *install_op.add_src_extents() = ExtentForRange(15, 2);
- *install_op.add_src_extents() = ExtentForRange(20, 1);
-
- *install_op.add_dst_extents() = ExtentForRange(10, 1);
- *install_op.add_dst_extents() = ExtentForRange(15, 1);
- *install_op.add_dst_extents() = ExtentForRange(20, 2);
- *install_op.add_dst_extents() = ExtentForRange(25, 1);
ErrorCode error{};
ASSERT_TRUE(writer_.PerformSourceCopyOperation(install_op, &error));
}