Set src_extents before calling PopulateXorOps
PopulateXorOps needs to read aop.op.src_extents(), so set that before
calling
Test: ota_from_target_files --enable_vabc_xor
Change-Id: Id2207cf44868d22ee9fe2e5c1a2bf45fc7f6185b
diff --git a/payload_generator/delta_diff_utils.cc b/payload_generator/delta_diff_utils.cc
index 077fbfe..b4b49e6 100644
--- a/payload_generator/delta_diff_utils.cc
+++ b/payload_generator/delta_diff_utils.cc
@@ -155,6 +155,8 @@
size_t src_block,
size_t dst_block,
size_t src_offset) {
+ CHECK_NE(src_block, std::numeric_limits<uint64_t>::max());
+ CHECK_NE(dst_block, std::numeric_limits<uint64_t>::max());
if (ShouldCreateNewOp(*ops, src_block, dst_block, src_offset)) {
auto& op = ops->emplace_back();
op.mutable_src_extent()->set_start_block(src_block);
@@ -162,6 +164,7 @@
op.mutable_dst_extent()->set_start_block(dst_block);
op.mutable_dst_extent()->set_num_blocks(1);
op.set_src_offset(src_offset);
+ op.set_type(CowMergeOperation::COW_XOR);
} else {
auto& op = ops->back();
auto& src_extent = *op.mutable_src_extent();
@@ -902,6 +905,7 @@
bsdiff_delta.size(),
src_extents.size())) {
if (config.enable_vabc_xor) {
+ StoreExtents(src_extents, operation.mutable_src_extents());
PopulateXorOps(&aop, bsdiff_delta);
}
operation.set_type(operation_type);
@@ -971,7 +975,11 @@
// Embed extents in the operation. Replace (all variants), zero and discard
// operations should not have source extents.
if (!IsNoSourceOperation(operation.type())) {
- StoreExtents(src_extents, operation.mutable_src_extents());
+ if (operation.src_extents_size() == 0) {
+ StoreExtents(src_extents, operation.mutable_src_extents());
+ }
+ } else {
+ operation.clear_src_extents();
}
*out_data = std::move(data_blob);
diff --git a/payload_generator/delta_diff_utils_unittest.cc b/payload_generator/delta_diff_utils_unittest.cc
index 436e265..5e7d6f0 100644
--- a/payload_generator/delta_diff_utils_unittest.cc
+++ b/payload_generator/delta_diff_utils_unittest.cc
@@ -614,6 +614,9 @@
&aop,
reinterpret_cast<const uint8_t*>(patch_data.data()),
patch_data.size());
+ for (const auto& op : aop.xor_ops) {
+ ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+ }
ASSERT_EQ(aop.xor_ops.size(), 1UL) << "Only 1 block can possibly be XORed";
ASSERT_EQ(aop.xor_ops[0].src_extent().num_blocks(), 1UL);
ASSERT_EQ(aop.xor_ops[0].src_extent().start_block(), 51UL);
@@ -643,6 +646,9 @@
&aop,
reinterpret_cast<const uint8_t*>(patch_data.data()),
patch_data.size());
+ for (const auto& op : aop.xor_ops) {
+ ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+ }
ASSERT_EQ(aop.xor_ops.size(), 1UL) << "Only 1 block can possibly be XORed";
ASSERT_EQ(aop.xor_ops[0].src_extent().num_blocks(), 1UL);
ASSERT_EQ(aop.xor_ops[0].src_extent().start_block(), 51UL);
@@ -678,6 +684,9 @@
patch_data.size());
ASSERT_EQ(aop.xor_ops.size(), 4UL);
for (const auto& op : aop.xor_ops) {
+ ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+ }
+ for (const auto& op : aop.xor_ops) {
ASSERT_EQ(op.src_offset(), 123UL + 456UL);
LOG(INFO) << op.src_extent() << ", " << op.dst_extent();
}
diff --git a/payload_generator/merge_sequence_generator.cc b/payload_generator/merge_sequence_generator.cc
index c5fd988..7f5032b 100644
--- a/payload_generator/merge_sequence_generator.cc
+++ b/payload_generator/merge_sequence_generator.cc
@@ -129,6 +129,8 @@
CHECK_EQ(op.src_extent().num_blocks(),
op.dst_extent().num_blocks() + 1);
}
+ CHECK_NE(op.src_extent().start_block(),
+ std::numeric_limits<uint64_t>::max());
});
return true;
}