From b5a96072328bbeb3b365b62bd5736908f1a1e72e Mon Sep 17 00:00:00 2001 From: Kelvin Zhang Date: Thu, 23 Feb 2023 13:20:07 -0800 Subject: [PATCH] Initialize COW options using update manifest Update manifest contains feature specifications such as whether to use multi-threading or batched writes, initialize COW options using the manifest allows these features to be enabled/disabled at update install time. Test: th Change-Id: Iff66c43567d4890ae1c88624db49014584b1d96f --- fs_mgr/libsnapshot/android/snapshot/snapshot.proto | 6 ++++++ fs_mgr/libsnapshot/partition_cow_creator.h | 6 ++++++ fs_mgr/libsnapshot/snapshot.cpp | 14 ++++++++++++++ .../update_engine/update_metadata.proto | 7 +++++++ 4 files changed, 33 insertions(+) diff --git a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto index b3763aea4..fa04c437d 100644 --- a/fs_mgr/libsnapshot/android/snapshot/snapshot.proto +++ b/fs_mgr/libsnapshot/android/snapshot/snapshot.proto @@ -108,6 +108,12 @@ message SnapshotStatus { // Estimated COW size from OTA manifest. uint64 estimated_cow_size = 12; + + // Enable multi-threaded compression + bool enable_threading = 13; + + // Enable batching for COW writes + bool batched_writes = 14; } // Next: 8 diff --git a/fs_mgr/libsnapshot/partition_cow_creator.h b/fs_mgr/libsnapshot/partition_cow_creator.h index 949e6c5be..bd5c8cb2e 100644 --- a/fs_mgr/libsnapshot/partition_cow_creator.h +++ b/fs_mgr/libsnapshot/partition_cow_creator.h @@ -60,6 +60,12 @@ struct PartitionCowCreator { bool using_snapuserd = false; std::string compression_algorithm; + // True if multi-threaded compression should be enabled + bool enable_threading; + + // True if COW writes should be batched in memory + bool batched_writes; + struct Return { SnapshotStatus snapshot_status; std::vector cow_partition_usable_regions; diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp index 961db02ef..15f025c9c 100644 --- a/fs_mgr/libsnapshot/snapshot.cpp +++ b/fs_mgr/libsnapshot/snapshot.cpp @@ -400,6 +400,12 @@ bool SnapshotManager::CreateSnapshot(LockedFile* lock, PartitionCowCreator* cow_ status->set_metadata_sectors(0); status->set_using_snapuserd(cow_creator->using_snapuserd); status->set_compression_algorithm(cow_creator->compression_algorithm); + if (cow_creator->enable_threading) { + status->set_enable_threading(cow_creator->enable_threading); + } + if (cow_creator->batched_writes) { + status->set_batched_writes(cow_creator->batched_writes); + } if (!WriteSnapshotStatus(lock, *status)) { PLOG(ERROR) << "Could not write snapshot status: " << status->name(); @@ -3248,6 +3254,12 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife .using_snapuserd = using_snapuserd, .compression_algorithm = compression_algorithm, }; + if (dap_metadata.vabc_feature_set().has_threaded()) { + cow_creator.enable_threading = dap_metadata.vabc_feature_set().threaded(); + } + if (dap_metadata.vabc_feature_set().has_batch_writes()) { + cow_creator.batched_writes = dap_metadata.vabc_feature_set().batch_writes(); + } auto ret = CreateUpdateSnapshotsInternal(lock.get(), manifest, &cow_creator, &created_devices, &all_snapshot_status); @@ -3635,6 +3647,8 @@ std::unique_ptr SnapshotManager::OpenCompressedSnapshotWriter( CowOptions cow_options; cow_options.compression = status.compression_algorithm(); cow_options.max_blocks = {status.device_size() / cow_options.block_size}; + cow_options.batch_write = status.batched_writes(); + cow_options.num_compress_threads = status.enable_threading() ? 2 : 0; // Disable scratch space for vts tests if (device()->IsTestDevice()) { cow_options.scratch_space = false; diff --git a/fs_mgr/libsnapshot/update_engine/update_metadata.proto b/fs_mgr/libsnapshot/update_engine/update_metadata.proto index 69d72e19c..cc12d1db2 100644 --- a/fs_mgr/libsnapshot/update_engine/update_metadata.proto +++ b/fs_mgr/libsnapshot/update_engine/update_metadata.proto @@ -71,11 +71,18 @@ message DynamicPartitionGroup { repeated string partition_names = 3; } +message VABCFeatureSet { + optional bool threaded = 1; + optional bool batch_writes = 2; +} + message DynamicPartitionMetadata { repeated DynamicPartitionGroup groups = 1; optional bool vabc_enabled = 3; optional string vabc_compression_param = 4; optional uint32 cow_version = 5; + // A collection of knobs to tune Virtual AB Compression + optional VABCFeatureSet vabc_feature_set = 6; } message DeltaArchiveManifest {