Merge changes I115b6b98,Iff84c0df,Ice13f58e,I5302a9a2 into main

* changes:
  libsnapshot: set num merge threads
  snapshot_proto add build configuration variables
  update supported compression methods
  libsnapshot: get read_ahead_size from build
This commit is contained in:
Daniel Zheng 2024-05-29 17:29:31 +00:00 committed by Gerrit Code Review
commit 0381ebefc4
5 changed files with 40 additions and 25 deletions

View file

@ -103,7 +103,7 @@ message SnapshotStatus {
// The old partition size (if none existed, this will be zero).
uint64 old_partition_size = 10;
// Compression algorithm (none, gz, lz4, zstd, or brotli).
// Compression algorithm (none, lz4, zstd).
string compression_algorithm = 11;
// Estimated COW size from OTA manifest.
@ -120,6 +120,18 @@ message SnapshotStatus {
// Max bytes to be compressed at once (4k, 8k, 16k, 32k, 64k, 128k)
uint64 compression_factor = 16;
// Default value is 32, can be set lower for low mem devices
uint32 read_ahead_size = 17;
// Enable direct reads on source device
bool o_direct = 18;
// Blocks size to be verified at once
uint64 verify_block_size = 19;
// Default value is 2, configures threads to do verification phase
uint32 num_verify_threads = 20;
}
// Next: 8

View file

@ -60,6 +60,7 @@ struct PartitionCowCreator {
bool using_snapuserd = false;
std::string compression_algorithm;
uint64_t compression_factor;
uint32_t read_ahead_size;
// True if multi-threaded compression should be enabled
bool enable_threading;

View file

@ -101,8 +101,7 @@ static constexpr auto kUpdateStateCheckInterval = 2s;
* time, they could use O_DIRECT functionality wherein the I/O to the source
* block device will be O_DIRECT.
*/
static constexpr auto kCowReadAheadSizeKb = 32;
static constexpr auto kSourceReadAheadSizeKb = 32;
static constexpr auto kReadAheadSizeKb = 32;
// Note: IImageManager is an incomplete type in the header, so the default
// destructor doesn't work.
@ -418,6 +417,7 @@ bool SnapshotManager::CreateSnapshot(LockedFile* lock, PartitionCowCreator* cow_
status->set_using_snapuserd(cow_creator->using_snapuserd);
status->set_compression_algorithm(cow_creator->compression_algorithm);
status->set_compression_factor(cow_creator->compression_factor);
status->set_read_ahead_size(cow_creator->read_ahead_size);
if (cow_creator->enable_threading) {
status->set_enable_threading(cow_creator->enable_threading);
}
@ -1142,8 +1142,8 @@ auto SnapshotManager::CheckMergeState(const std::function<bool()>& before_cancel
return result;
}
auto SnapshotManager::CheckMergeState(LockedFile* lock, const std::function<bool()>& before_cancel)
-> MergeResult {
auto SnapshotManager::CheckMergeState(LockedFile* lock,
const std::function<bool()>& before_cancel) -> MergeResult {
SnapshotUpdateStatus update_status = ReadSnapshotUpdateStatus(lock);
switch (update_status.state()) {
case UpdateState::None:
@ -1765,9 +1765,8 @@ bool SnapshotManager::PerformInitTransition(InitTransition transition,
base_path_merge;
snapuserd_argv->emplace_back(std::move(message));
}
SetReadAheadSize(cow_image_device, kCowReadAheadSizeKb);
SetReadAheadSize(source_device, kSourceReadAheadSizeKb);
SetReadAheadSize(cow_image_device, snapshot_status.read_ahead_size());
SetReadAheadSize(source_device, snapshot_status.read_ahead_size());
// Do not attempt to connect to the new snapuserd yet, it hasn't
// been started. We do however want to wait for the misc device
@ -2852,8 +2851,8 @@ bool SnapshotManager::UnmapAllSnapshots(LockedFile* lock) {
return true;
}
auto SnapshotManager::OpenFile(const std::string& file, int lock_flags)
-> std::unique_ptr<LockedFile> {
auto SnapshotManager::OpenFile(const std::string& file,
int lock_flags) -> std::unique_ptr<LockedFile> {
unique_fd fd(open(file.c_str(), O_RDONLY | O_CLOEXEC | O_NOFOLLOW));
if (fd < 0) {
PLOG(ERROR) << "Open failed: " << file;
@ -3309,19 +3308,19 @@ Return SnapshotManager::CreateUpdateSnapshots(const DeltaArchiveManifest& manife
LOG(INFO) << "using compression algorithm: " << compression_algorithm
<< ", max compressible block size: " << compression_factor;
}
PartitionCowCreator cow_creator{
.target_metadata = target_metadata.get(),
.target_suffix = target_suffix,
.target_partition = nullptr,
.current_metadata = current_metadata.get(),
.current_suffix = current_suffix,
.update = nullptr,
.extra_extents = {},
.using_snapuserd = using_snapuserd,
.compression_algorithm = compression_algorithm,
.compression_factor = compression_factor,
};
auto read_ahead_size =
android::base::GetUintProperty<uint>("ro.virtual_ab.read_ahead_size", kReadAheadSizeKb);
PartitionCowCreator cow_creator{.target_metadata = target_metadata.get(),
.target_suffix = target_suffix,
.target_partition = nullptr,
.current_metadata = current_metadata.get(),
.current_suffix = current_suffix,
.update = nullptr,
.extra_extents = {},
.using_snapuserd = using_snapuserd,
.compression_algorithm = compression_algorithm,
.compression_factor = compression_factor,
.read_ahead_size = read_ahead_size};
if (dap_metadata.vabc_feature_set().has_threaded()) {
cow_creator.enable_threading = dap_metadata.vabc_feature_set().threaded();

View file

@ -19,6 +19,7 @@
#include <android-base/logging.h>
#include "android-base/properties.h"
#include "merge_worker.h"
#include "read_worker.h"
#include "snapuserd_core.h"
@ -235,8 +236,10 @@ void SnapshotHandlerManager::MonitorMerge() {
LOG(INFO) << "MonitorMerge: active-merge-threads: " << active_merge_threads_;
{
auto num_merge_threads = android::base::GetUintProperty<uint>(
"ro.virtual_ab.num_merge_threads", kMaxMergeThreads);
std::lock_guard<std::mutex> lock(lock_);
while (active_merge_threads_ < kMaxMergeThreads && merge_handlers_.size() > 0) {
while (active_merge_threads_ < num_merge_threads && merge_handlers_.size() > 0) {
auto handler = merge_handlers_.front();
merge_handlers_.pop();

View file

@ -39,7 +39,7 @@ namespace android {
namespace snapshot {
static constexpr uint32_t kMaxPacketSize = 512;
static constexpr uint8_t kMaxMergeThreads = 2;
static constexpr char kBootSnapshotsWithoutSlotSwitch[] =
"/metadata/ota/snapshot-boot-without-slot-switch";