diff options
author | Kelvin Zhang <zhangkelvin@google.com> | 2021-03-16 23:42:40 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-03-16 23:42:40 +0000 |
commit | f260ea9b88ea15aa7e9d6e307405f3f184285ec0 (patch) | |
tree | dc7bb569d81005c0c12b1903daf78b2ea73221a3 | |
parent | 74db000b0079f3840b8c43be33a7d46aab52cb48 (diff) | |
parent | ebd115e8bd045dfd05889e3574d5a02e7b53b2be (diff) | |
download | update_engine-f260ea9b88ea15aa7e9d6e307405f3f184285ec0.tar.gz |
Pass in source slot to ctor of dynamic control am: ebd115e8bd
Original change: https://android-review.googlesource.com/c/platform/system/update_engine/+/1622020
Change-Id: I542615fc8da27cfb2ce1ac671c193f10096b2da7
-rw-r--r-- | aosp/boot_control_android.cc | 3 | ||||
-rw-r--r-- | aosp/dynamic_partition_control_android.cc | 36 | ||||
-rw-r--r-- | aosp/dynamic_partition_control_android.h | 6 | ||||
-rw-r--r-- | aosp/dynamic_partition_control_android_unittest.cc | 5 | ||||
-rw-r--r-- | aosp/mock_dynamic_partition_control_android.h | 7 | ||||
-rw-r--r-- | common/dynamic_partition_control_interface.h | 3 | ||||
-rw-r--r-- | common/dynamic_partition_control_stub.cc | 2 | ||||
-rw-r--r-- | common/dynamic_partition_control_stub.h | 2 | ||||
-rw-r--r-- | common/mock_dynamic_partition_control.h | 5 | ||||
-rw-r--r-- | payload_consumer/delta_performer.cc | 21 | ||||
-rw-r--r-- | payload_consumer/delta_performer.h | 2 | ||||
-rw-r--r-- | payload_consumer/filesystem_verifier_action.cc | 5 | ||||
-rw-r--r-- | payload_consumer/filesystem_verifier_action_unittest.cc | 2 |
13 files changed, 64 insertions, 35 deletions
diff --git a/aosp/boot_control_android.cc b/aosp/boot_control_android.cc index 3b20fc21..c1ac0d42 100644 --- a/aosp/boot_control_android.cc +++ b/aosp/boot_control_android.cc @@ -67,7 +67,8 @@ bool BootControlAndroid::Init() { LOG(INFO) << "Loaded boot control hidl hal."; - dynamic_control_ = std::make_unique<DynamicPartitionControlAndroid>(); + dynamic_control_ = + std::make_unique<DynamicPartitionControlAndroid>(GetCurrentSlot()); return true; } diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc index aba6deb4..4220445c 100644 --- a/aosp/dynamic_partition_control_android.cc +++ b/aosp/dynamic_partition_control_android.cc @@ -116,12 +116,14 @@ static FeatureFlag GetFeatureFlag(const char* enable_prop, return FeatureFlag(FeatureFlag::Value::NONE); } -DynamicPartitionControlAndroid::DynamicPartitionControlAndroid() +DynamicPartitionControlAndroid::DynamicPartitionControlAndroid( + uint32_t source_slot) : dynamic_partitions_( GetFeatureFlag(kUseDynamicPartitions, kRetrfoitDynamicPartitions)), virtual_ab_(GetFeatureFlag(kVirtualAbEnabled, kVirtualAbRetrofit)), virtual_ab_compression_(GetFeatureFlag(kVirtualAbCompressionEnabled, - kVirtualAbCompressionRetrofit)) { + kVirtualAbCompressionRetrofit)), + source_slot_(source_slot) { if (GetVirtualAbFeatureFlag().IsEnabled()) { snapshot_ = SnapshotManager::New(); } else { @@ -1019,8 +1021,8 @@ DynamicPartitionControlAndroid::GetPartitionDevice( // target slot. const auto& partition_name_suffix = partition_name + SlotSuffixForSlotNumber(slot); - if (UpdateUsesSnapshotCompression() && IsDynamicPartition(partition_name) && - slot != current_slot) { + if (UpdateUsesSnapshotCompression() && slot != current_slot && + IsDynamicPartition(partition_name, slot)) { return { {.mountable_device_path = base::FilePath{std::string{VABC_DEVICE_DIR}} .Append(partition_name_suffix) @@ -1211,6 +1213,14 @@ bool DynamicPartitionControlAndroid::ListDynamicPartitionsForSlot( uint32_t slot, uint32_t current_slot, std::vector<std::string>* partitions) { + CHECK(slot == source_slot_ || target_slot_ != UINT32_MAX) + << " source slot: " << source_slot_ << " target slot: " << target_slot_ + << " slot: " << slot + << " attempting to query dynamic partition metadata for target slot " + "before PreparePartitionForUpdate() is called. The " + "metadata in target slot isn't valid until " + "PreparePartitionForUpdate() is called, contining execution would " + "likely cause problems."; bool slot_enables_dynamic_partitions = GetDynamicPartitionsFeatureFlag().IsEnabled(); // Check if the target slot has dynamic partitions, this may happen when @@ -1347,16 +1357,22 @@ bool DynamicPartitionControlAndroid::MapAllPartitions() { } bool DynamicPartitionControlAndroid::IsDynamicPartition( - const std::string& partition_name) { - if (dynamic_partition_list_.empty() && + const std::string& partition_name, uint32_t slot) { + if (slot >= dynamic_partition_list_.size()) { + LOG(ERROR) << "Seeing unexpected slot # " << slot << " currently assuming " + << dynamic_partition_list_.size() << " slots"; + return false; + } + auto& dynamic_partition_list = dynamic_partition_list_[slot]; + if (dynamic_partition_list.empty() && GetDynamicPartitionsFeatureFlag().IsEnabled()) { // Use the DAP config of the target slot. CHECK(ListDynamicPartitionsForSlot( - target_slot_, source_slot_, &dynamic_partition_list_)); + slot, source_slot_, &dynamic_partition_list)); } - return std::find(dynamic_partition_list_.begin(), - dynamic_partition_list_.end(), - partition_name) != dynamic_partition_list_.end(); + return std::find(dynamic_partition_list.begin(), + dynamic_partition_list.end(), + partition_name) != dynamic_partition_list.end(); } bool DynamicPartitionControlAndroid::UpdateUsesSnapshotCompression() { diff --git a/aosp/dynamic_partition_control_android.h b/aosp/dynamic_partition_control_android.h index a23827b4..4e75a9b9 100644 --- a/aosp/dynamic_partition_control_android.h +++ b/aosp/dynamic_partition_control_android.h @@ -38,7 +38,7 @@ class DynamicPartitionControlAndroid : public DynamicPartitionControlInterface { // Per earlier discussion with VAB team, this directory is unlikely to change. // So we declare it as a constant here. static constexpr std::string_view VABC_DEVICE_DIR = "/dev/block/mapper/"; - DynamicPartitionControlAndroid(); + explicit DynamicPartitionControlAndroid(uint32_t source_slot); ~DynamicPartitionControlAndroid(); FeatureFlag GetDynamicPartitionsFeatureFlag() override; @@ -110,7 +110,7 @@ class DynamicPartitionControlAndroid : public DynamicPartitionControlInterface { bool UnmapAllPartitions() override; - bool IsDynamicPartition(const std::string& part_name) override; + bool IsDynamicPartition(const std::string& part_name, uint32_t slot) override; bool UpdateUsesSnapshotCompression() override; @@ -329,7 +329,7 @@ class DynamicPartitionControlAndroid : public DynamicPartitionControlInterface { uint32_t source_slot_ = UINT32_MAX; uint32_t target_slot_ = UINT32_MAX; - std::vector<std::string> dynamic_partition_list_; + std::vector<std::vector<std::string>> dynamic_partition_list_{2UL}; DISALLOW_COPY_AND_ASSIGN(DynamicPartitionControlAndroid); }; diff --git a/aosp/dynamic_partition_control_android_unittest.cc b/aosp/dynamic_partition_control_android_unittest.cc index 4a12b830..eb3f60cc 100644 --- a/aosp/dynamic_partition_control_android_unittest.cc +++ b/aosp/dynamic_partition_control_android_unittest.cc @@ -402,7 +402,8 @@ TEST_P(DynamicPartitionControlAndroidTestP, GetMountableDevicePath) { .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::NONE))); ON_CALL(dynamicControl(), UpdateUsesSnapshotCompression()) .WillByDefault(Return(false)); - ON_CALL(dynamicControl(), IsDynamicPartition(_)).WillByDefault(Return(true)); + ON_CALL(dynamicControl(), IsDynamicPartition(_, _)) + .WillByDefault(Return(true)); EXPECT_CALL(dynamicControl(), DeviceExists(AnyOf(GetDevice(S("vendor")), @@ -442,7 +443,7 @@ TEST_P(DynamicPartitionControlAndroidTestP, GetMountableDevicePathVABC) { .WillByDefault(Return(FeatureFlag(FeatureFlag::Value::LAUNCH))); ON_CALL(dynamicControl(), UpdateUsesSnapshotCompression()) .WillByDefault(Return(true)); - EXPECT_CALL(dynamicControl(), IsDynamicPartition(_)) + EXPECT_CALL(dynamicControl(), IsDynamicPartition(_, _)) .Times(AtLeast(1)) .WillRepeatedly(Return(true)); diff --git a/aosp/mock_dynamic_partition_control_android.h b/aosp/mock_dynamic_partition_control_android.h index 682ddfd7..d80dfb52 100644 --- a/aosp/mock_dynamic_partition_control_android.h +++ b/aosp/mock_dynamic_partition_control_android.h @@ -35,6 +35,8 @@ namespace chromeos_update_engine { class MockDynamicPartitionControlAndroid : public DynamicPartitionControlAndroid { public: + MockDynamicPartitionControlAndroid() + : DynamicPartitionControlAndroid(0 /*source slot*/) {} MOCK_METHOD( bool, MapPartitionOnDeviceMapper, @@ -100,7 +102,10 @@ class MockDynamicPartitionControlAndroid (override)); MOCK_METHOD(bool, MapAllPartitions, (), (override)); MOCK_METHOD(bool, UnmapAllPartitions, (), (override)); - MOCK_METHOD(bool, IsDynamicPartition, (const std::string&), (override)); + MOCK_METHOD(bool, + IsDynamicPartition, + (const std::string&, uint32_t slot), + (override)); MOCK_METHOD(bool, UpdateUsesSnapshotCompression, (), (override)); void set_fake_mapped_devices(const std::set<std::string>& fake) override { diff --git a/common/dynamic_partition_control_interface.h b/common/dynamic_partition_control_interface.h index 8b29c3b0..da279329 100644 --- a/common/dynamic_partition_control_interface.h +++ b/common/dynamic_partition_control_interface.h @@ -170,7 +170,8 @@ class DynamicPartitionControlInterface { const std::optional<std::string>&, bool is_append = false) = 0; - virtual bool IsDynamicPartition(const std::string& part_name) = 0; + virtual bool IsDynamicPartition(const std::string& part_name, + uint32_t slot) = 0; // Create virtual block devices for all partitions. virtual bool MapAllPartitions() = 0; diff --git a/common/dynamic_partition_control_stub.cc b/common/dynamic_partition_control_stub.cc index 7d0ef185..05803fe4 100644 --- a/common/dynamic_partition_control_stub.cc +++ b/common/dynamic_partition_control_stub.cc @@ -114,7 +114,7 @@ bool DynamicPartitionControlStub::UnmapAllPartitions() { } bool DynamicPartitionControlStub::IsDynamicPartition( - const std::string& part_name) { + const std::string& part_name, uint32_t slot) { return false; } diff --git a/common/dynamic_partition_control_stub.h b/common/dynamic_partition_control_stub.h index 5ab82f5c..eb7154c1 100644 --- a/common/dynamic_partition_control_stub.h +++ b/common/dynamic_partition_control_stub.h @@ -71,7 +71,7 @@ class DynamicPartitionControlStub : public DynamicPartitionControlInterface { bool MapAllPartitions() override; bool UnmapAllPartitions() override; - bool IsDynamicPartition(const std::string& part_name) override; + bool IsDynamicPartition(const std::string& part_name, uint32_t slot) override; bool UpdateUsesSnapshotCompression() override; }; } // namespace chromeos_update_engine diff --git a/common/mock_dynamic_partition_control.h b/common/mock_dynamic_partition_control.h index 74f4efc0..391d3eb2 100644 --- a/common/mock_dynamic_partition_control.h +++ b/common/mock_dynamic_partition_control.h @@ -79,7 +79,10 @@ class MockDynamicPartitionControl : public DynamicPartitionControlInterface { VerifyExtentsForUntouchedPartitions, (uint32_t, uint32_t, const std::vector<std::string>&), (override)); - MOCK_METHOD(bool, IsDynamicPartition, (const std::string&), (override)); + MOCK_METHOD(bool, + IsDynamicPartition, + (const std::string&, uint32_t slot), + (override)); MOCK_METHOD(bool, UpdateUsesSnapshotCompression, (), (override)); }; diff --git a/payload_consumer/delta_performer.cc b/payload_consumer/delta_performer.cc index f26dd482..82e589ec 100644 --- a/payload_consumer/delta_performer.cc +++ b/payload_consumer/delta_performer.cc @@ -240,13 +240,13 @@ bool DeltaPerformer::OpenCurrentPartition() { const InstallPlan::Partition& install_part = install_plan_->partitions[num_previous_partitions + current_partition_]; auto dynamic_control = boot_control_->GetDynamicPartitionControl(); - partition_writer_ = - CreatePartitionWriter(partition, - install_part, - dynamic_control, - block_size_, - interactive_, - IsDynamicPartition(install_part.name)); + partition_writer_ = CreatePartitionWriter( + partition, + install_part, + dynamic_control, + block_size_, + interactive_, + IsDynamicPartition(install_part.name, install_plan_->target_slot)); // Open source fds if we have a delta payload, or for partitions in the // partial update. bool source_may_exist = manifest_.partial_update() || @@ -1520,9 +1520,10 @@ bool DeltaPerformer::PrimeUpdateState() { return true; } -bool DeltaPerformer::IsDynamicPartition(const std::string& part_name) { +bool DeltaPerformer::IsDynamicPartition(const std::string& part_name, + uint32_t slot) { return boot_control_->GetDynamicPartitionControl()->IsDynamicPartition( - part_name); + part_name, slot); } std::unique_ptr<PartitionWriter> DeltaPerformer::CreatePartitionWriter( @@ -1538,7 +1539,7 @@ std::unique_ptr<PartitionWriter> DeltaPerformer::CreatePartitionWriter( dynamic_control, block_size_, interactive_, - IsDynamicPartition(install_part.name)); + IsDynamicPartition(install_part.name, install_plan_->target_slot)); } } // namespace chromeos_update_engine diff --git a/payload_consumer/delta_performer.h b/payload_consumer/delta_performer.h index 31fa6b22..c54316bd 100644 --- a/payload_consumer/delta_performer.h +++ b/payload_consumer/delta_performer.h @@ -325,7 +325,7 @@ class DeltaPerformer : public FileWriter { ErrorCode CheckTimestampError() const; // Check if partition `part_name` is a dynamic partition. - bool IsDynamicPartition(const std::string& part_name); + bool IsDynamicPartition(const std::string& part_name, uint32_t slot); // Update Engine preference store. PrefsInterface* prefs_; diff --git a/payload_consumer/filesystem_verifier_action.cc b/payload_consumer/filesystem_verifier_action.cc index e3a3e347..9221caa8 100644 --- a/payload_consumer/filesystem_verifier_action.cc +++ b/payload_consumer/filesystem_verifier_action.cc @@ -168,8 +168,9 @@ void FilesystemVerifierAction::StartPartitionHashing() { << partition.name << ") on device " << part_path; auto success = false; if (dynamic_control_->UpdateUsesSnapshotCompression() && - dynamic_control_->IsDynamicPartition(partition.name) && - verifier_step_ == VerifierStep::kVerifyTargetHash) { + verifier_step_ == VerifierStep::kVerifyTargetHash && + dynamic_control_->IsDynamicPartition(partition.name, + install_plan_.target_slot)) { success = InitializeFdVABC(); } else { if (part_path.empty()) { diff --git a/payload_consumer/filesystem_verifier_action_unittest.cc b/payload_consumer/filesystem_verifier_action_unittest.cc index d163ec20..f618626c 100644 --- a/payload_consumer/filesystem_verifier_action_unittest.cc +++ b/payload_consumer/filesystem_verifier_action_unittest.cc @@ -419,7 +419,7 @@ TEST_F(FilesystemVerifierActionTest, RunWithVABC) { .WillByDefault(Return(true)); ON_CALL(dynamic_control, OpenCowReader(_, _, _)) .WillByDefault(Return(nullptr)); - ON_CALL(dynamic_control, IsDynamicPartition(part.name)) + ON_CALL(dynamic_control, IsDynamicPartition(part.name, _)) .WillByDefault(Return(true)); EXPECT_CALL(dynamic_control, UpdateUsesSnapshotCompression()) |