diff options
author | Kelvin Zhang <zhangkelvin@google.com> | 2022-04-07 20:32:13 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-04-07 20:32:13 +0000 |
commit | 9a79f4529f218714f6d46de8eccddcfacd723691 (patch) | |
tree | e13b5159a7992ed86c1b34408556504949ecfbdf | |
parent | 68b45aa07739d897de816ea8d78b0528d3992fad (diff) | |
parent | 1d5acb2b6c47d4453b1c28b4dc53055af0a4990c (diff) |
Fix S and T mixed build OTA am: 1c4b981c71 am: 0c7fbe95c8 am: 1d5acb2b6c
Original change: https://android-review.googlesource.com/c/platform/system/update_engine/+/2058027
Change-Id: I8cf8b5f9c98d8c67045e15608ba085b5f364ae86
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | aosp/dynamic_partition_control_android.cc | 9 | ||||
-rw-r--r-- | aosp/dynamic_partition_control_android.h | 2 | ||||
-rw-r--r-- | aosp/mock_dynamic_partition_control_android.h | 4 | ||||
-rw-r--r-- | common/dynamic_partition_control_interface.h | 2 | ||||
-rw-r--r-- | common/dynamic_partition_control_stub.cc | 4 | ||||
-rw-r--r-- | common/dynamic_partition_control_stub.h | 3 | ||||
-rw-r--r-- | common/mock_dynamic_partition_control.h | 4 | ||||
-rw-r--r-- | payload_consumer/vabc_partition_writer.cc | 12 | ||||
-rw-r--r-- | payload_consumer/vabc_partition_writer_unittest.cc | 14 |
9 files changed, 50 insertions, 4 deletions
diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc index e39e7bc7..27d1d541 100644 --- a/aosp/dynamic_partition_control_android.cc +++ b/aosp/dynamic_partition_control_android.cc @@ -82,6 +82,8 @@ constexpr char kVirtualAbEnabled[] = "ro.virtual_ab.enabled"; constexpr char kVirtualAbRetrofit[] = "ro.virtual_ab.retrofit"; constexpr char kVirtualAbCompressionEnabled[] = "ro.virtual_ab.compression.enabled"; +constexpr auto&& kVirtualAbCompressionXorEnabled = + "ro.virtual_ab.compression.xor.enabled"; // Currently, android doesn't have a retrofit prop for VAB Compression. However, // struct FeatureFlag forces us to determine if a feature is 'retrofit'. So this @@ -126,6 +128,8 @@ DynamicPartitionControlAndroid::DynamicPartitionControlAndroid( virtual_ab_(GetFeatureFlag(kVirtualAbEnabled, kVirtualAbRetrofit)), virtual_ab_compression_(GetFeatureFlag(kVirtualAbCompressionEnabled, kVirtualAbCompressionRetrofit)), + virtual_ab_compression_xor_( + GetFeatureFlag(kVirtualAbCompressionXorEnabled, "")), source_slot_(source_slot) { if (GetVirtualAbFeatureFlag().IsEnabled()) { snapshot_ = SnapshotManager::New(); @@ -152,6 +156,11 @@ DynamicPartitionControlAndroid::GetVirtualAbCompressionFeatureFlag() { return virtual_ab_compression_; } +FeatureFlag +DynamicPartitionControlAndroid::GetVirtualAbCompressionXorFeatureFlag() { + return virtual_ab_compression_xor_; +} + bool DynamicPartitionControlAndroid::OptimizeOperation( const std::string& partition_name, const InstallOperation& operation, diff --git a/aosp/dynamic_partition_control_android.h b/aosp/dynamic_partition_control_android.h index 457ef182..92761d22 100644 --- a/aosp/dynamic_partition_control_android.h +++ b/aosp/dynamic_partition_control_android.h @@ -44,6 +44,7 @@ class DynamicPartitionControlAndroid : public DynamicPartitionControlInterface { FeatureFlag GetDynamicPartitionsFeatureFlag() override; FeatureFlag GetVirtualAbFeatureFlag() override; FeatureFlag GetVirtualAbCompressionFeatureFlag() override; + FeatureFlag GetVirtualAbCompressionXorFeatureFlag() override; bool OptimizeOperation(const std::string& partition_name, const InstallOperation& operation, InstallOperation* optimized) override; @@ -339,6 +340,7 @@ class DynamicPartitionControlAndroid : public DynamicPartitionControlInterface { const FeatureFlag dynamic_partitions_; const FeatureFlag virtual_ab_; const FeatureFlag virtual_ab_compression_; + const FeatureFlag virtual_ab_compression_xor_; std::unique_ptr<android::snapshot::ISnapshotManager> snapshot_; std::unique_ptr<android::snapshot::AutoDevice> metadata_device_; bool target_supports_snapshot_ = false; diff --git a/aosp/mock_dynamic_partition_control_android.h b/aosp/mock_dynamic_partition_control_android.h index 33ef39c8..f55cdf78 100644 --- a/aosp/mock_dynamic_partition_control_android.h +++ b/aosp/mock_dynamic_partition_control_android.h @@ -73,6 +73,10 @@ class MockDynamicPartitionControlAndroid MOCK_METHOD(std::string, GetSuperPartitionName, (uint32_t), (override)); MOCK_METHOD(FeatureFlag, GetVirtualAbFeatureFlag, (), (override)); MOCK_METHOD(FeatureFlag, GetVirtualAbCompressionFeatureFlag, (), (override)); + MOCK_METHOD(FeatureFlag, + GetVirtualAbCompressionXorFeatureFlag, + (), + (override)); MOCK_METHOD(bool, FinishUpdate, (bool), (override)); MOCK_METHOD(bool, GetSystemOtherPath, diff --git a/common/dynamic_partition_control_interface.h b/common/dynamic_partition_control_interface.h index e6ebe6a1..2c01b1a9 100644 --- a/common/dynamic_partition_control_interface.h +++ b/common/dynamic_partition_control_interface.h @@ -73,6 +73,8 @@ class DynamicPartitionControlInterface { // DOES NOT tell you if VABC is used for current OTA update. For that, use // UpdateUsesSnapshotCompression. virtual FeatureFlag GetVirtualAbCompressionFeatureFlag() = 0; + // Return the feature flag for Virtual AB Compression XOR + virtual FeatureFlag GetVirtualAbCompressionXorFeatureFlag() = 0; // Attempt to optimize |operation|. // If successful, |optimized| contains an operation with extents that diff --git a/common/dynamic_partition_control_stub.cc b/common/dynamic_partition_control_stub.cc index dd30a8b6..6283b1db 100644 --- a/common/dynamic_partition_control_stub.cc +++ b/common/dynamic_partition_control_stub.cc @@ -38,6 +38,10 @@ FeatureFlag DynamicPartitionControlStub::GetVirtualAbCompressionFeatureFlag() { return FeatureFlag(FeatureFlag::Value::NONE); } +FeatureFlag DynamicPartitionControlStub::GetVirtualAbCompressionXorFeatureFlag() { + return FeatureFlag(FeatureFlag::Value::NONE); +} + bool DynamicPartitionControlStub::OptimizeOperation( const std::string& partition_name, const InstallOperation& operation, diff --git a/common/dynamic_partition_control_stub.h b/common/dynamic_partition_control_stub.h index 5aa43367..15137d2c 100644 --- a/common/dynamic_partition_control_stub.h +++ b/common/dynamic_partition_control_stub.h @@ -27,11 +27,12 @@ namespace chromeos_update_engine { -class DynamicPartitionControlStub : public DynamicPartitionControlInterface { +class DynamicPartitionControlStub final : public DynamicPartitionControlInterface { public: FeatureFlag GetDynamicPartitionsFeatureFlag() override; FeatureFlag GetVirtualAbFeatureFlag() override; FeatureFlag GetVirtualAbCompressionFeatureFlag() override; + FeatureFlag GetVirtualAbCompressionXorFeatureFlag() override; bool OptimizeOperation(const std::string& partition_name, const InstallOperation& operation, InstallOperation* optimized) override; diff --git a/common/mock_dynamic_partition_control.h b/common/mock_dynamic_partition_control.h index f3a446af..fd0a5a98 100644 --- a/common/mock_dynamic_partition_control.h +++ b/common/mock_dynamic_partition_control.h @@ -34,6 +34,10 @@ class MockDynamicPartitionControl : public DynamicPartitionControlInterface { MOCK_METHOD(bool, GetDeviceDir, (std::string*), (override)); MOCK_METHOD(FeatureFlag, GetDynamicPartitionsFeatureFlag, (), (override)); MOCK_METHOD(FeatureFlag, GetVirtualAbCompressionFeatureFlag, (), (override)); + MOCK_METHOD(FeatureFlag, + GetVirtualAbCompressionXorFeatureFlag, + (), + (override)); MOCK_METHOD(FeatureFlag, GetVirtualAbFeatureFlag, (), (override)); MOCK_METHOD(bool, FinishUpdate, (bool), (override)); MOCK_METHOD(std::unique_ptr<FileDescriptor>, diff --git a/payload_consumer/vabc_partition_writer.cc b/payload_consumer/vabc_partition_writer.cc index 54aea860..8ae0b51f 100644 --- a/payload_consumer/vabc_partition_writer.cc +++ b/payload_consumer/vabc_partition_writer.cc @@ -97,7 +97,17 @@ VABCPartitionWriter::VABCPartitionWriter( bool VABCPartitionWriter::Init(const InstallPlan* install_plan, bool source_may_exist, size_t next_op_index) { - xor_map_ = ComputeXorMap(partition_update_.merge_operations()); + if (dynamic_control_->GetVirtualAbCompressionXorFeatureFlag().IsEnabled()) { + xor_map_ = ComputeXorMap(partition_update_.merge_operations()); + if (xor_map_.size() > 0) { + LOG(INFO) << "Virtual AB Compression with XOR is enabled"; + } else { + LOG(INFO) << "Device supports Virtual AB compression with XOR, but OTA " + "package does not."; + } + } else { + LOG(INFO) << "Virtual AB Compression with XOR is disabled."; + } TEST_AND_RETURN_FALSE(install_plan != nullptr); if (source_may_exist && install_part_.source_size > 0) { TEST_AND_RETURN_FALSE(!install_part_.source_path.empty()); diff --git a/payload_consumer/vabc_partition_writer_unittest.cc b/payload_consumer/vabc_partition_writer_unittest.cc index f331091d..20aa75f8 100644 --- a/payload_consumer/vabc_partition_writer_unittest.cc +++ b/payload_consumer/vabc_partition_writer_unittest.cc @@ -48,7 +48,11 @@ static constexpr auto& fake_part_name = "fake_part"; static constexpr size_t FAKE_PART_SIZE = 4096 * 50; class VABCPartitionWriterTest : public ::testing::Test { public: - void SetUp() override { ftruncate(source_part_.fd, FAKE_PART_SIZE); } + void SetUp() override { + ftruncate(source_part_.fd, FAKE_PART_SIZE); + ON_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag()) + .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE))); + } protected: CowMergeOperation* AddMergeOp(PartitionUpdate* partition, @@ -102,6 +106,8 @@ TEST_F(VABCPartitionWriterTest, MergeSequenceWriteTest) { ON_CALL(*cow_writer, EmitLabel(_)).WillByDefault(Return(true)); return cow_writer; })); + EXPECT_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag()) + .WillRepeatedly(Return(FeatureFlag(FeatureFlag::Value::LAUNCH))); ASSERT_TRUE(writer_.Init(&install_plan_, true, 0)); } @@ -125,6 +131,8 @@ TEST_F(VABCPartitionWriterTest, MergeSequenceXorSameBlock) { ON_CALL(*cow_writer, EmitLabel(_)).WillByDefault(Return(true)); return cow_writer; })); + EXPECT_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag()) + .WillRepeatedly(Return(FeatureFlag(FeatureFlag::Value::LAUNCH))); ASSERT_TRUE(writer_.Init(&install_plan_, true, 0)); } @@ -224,10 +232,12 @@ TEST_F(VABCPartitionWriterTest, StreamXORBlockTest) { .WillOnce(Return(true)); return cow_writer; })); + EXPECT_CALL(dynamic_control_, GetVirtualAbCompressionXorFeatureFlag()) + .WillRepeatedly(Return(FeatureFlag(FeatureFlag::Value::LAUNCH))); VABCPartitionWriter writer_{ partition_update_, install_part_, &dynamic_control_, kBlockSize}; ASSERT_TRUE(writer_.Init(&install_plan_, true, 0)); - auto patch_data = GetNoopBSDIFF(kBlockSize * 5); + const auto patch_data = GetNoopBSDIFF(kBlockSize * 5); ASSERT_GT(patch_data.size(), 0UL); ASSERT_TRUE(writer_.PerformDiffOperation( *install_op, nullptr, patch_data.data(), patch_data.size())); |