Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d05b7a8 authored by Tianjie's avatar Tianjie
Browse files

Update libsnapshot to handle partial update

For partial update, the payload will not include all dynamic
partitions on the device, update the logic libsnapshot to better
handle such case.

Bug: 157778739
Test: run a partial OTA, unit tests pass

Change-Id: I4339a81ed31161bab3ba9666c1d05fb8bf57dbf9
parent a3ed4653
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2277,6 +2277,10 @@ Return SnapshotManager::CreateUpdateSnapshotsInternal(
        auto operations_it = install_operation_map.find(target_partition->name());
        if (operations_it != install_operation_map.end()) {
            cow_creator->operations = operations_it->second;
        } else {
            LOG(INFO) << target_partition->name()
                      << " isn't included in the payload, skipping the cow creation.";
            continue;
        }

        cow_creator->extra_extents.clear();
+19 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ SnapshotMetadataUpdater::SnapshotMetadataUpdater(MetadataBuilder* builder, uint3
                                               std::string(it->second) + target_suffix_, &p});
        }
    }

    partial_update_ = manifest.partial_update();
}

bool SnapshotMetadataUpdater::ShrinkPartitions() const {
@@ -82,6 +84,18 @@ bool SnapshotMetadataUpdater::ShrinkPartitions() const {
}

bool SnapshotMetadataUpdater::DeletePartitions() const {
    // For partial update, not all dynamic partitions are included in the payload.
    // TODO(xunchang) delete the untouched partitions whose group is in the payload.
    // e.g. Delete vendor in the following scenario
    // On device:
    //   Group A: system, vendor
    // In payload:
    //   Group A: system
    if (partial_update_) {
        LOG(INFO) << "Skip deleting partitions for partial update";
        return true;
    }

    std::vector<std::string> partitions_to_delete;
    // Don't delete partitions in groups where the group name doesn't have target_suffix,
    // e.g. default.
@@ -139,6 +153,11 @@ bool SnapshotMetadataUpdater::ShrinkGroups() const {
}

bool SnapshotMetadataUpdater::DeleteGroups() const {
    if (partial_update_) {
        LOG(INFO) << "Skip deleting groups for partial update";
        return true;
    }

    std::vector<std::string> existing_groups = builder_->ListGroups();
    for (const auto& existing_group_name : existing_groups) {
        // Don't delete groups without target suffix, e.g. default.
+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ class SnapshotMetadataUpdater {
    const std::string target_suffix_;
    std::vector<Group> groups_;
    std::vector<Partition> partitions_;
    bool partial_update_{false};
};

}  // namespace snapshot
+1 −0
Original line number Diff line number Diff line
@@ -77,4 +77,5 @@ message DynamicPartitionMetadata {
message DeltaArchiveManifest {
    repeated PartitionUpdate partitions = 13;
    optional DynamicPartitionMetadata dynamic_partition_metadata = 15;
    optional bool partial_update = 16;
}