snapuserd: use .ro num_verification_threads
We want snapuserd to use the .ro prop to configure number of threads
used during the verification phase. This has to be propogated through
metadata as early stage init doesn't have access to .ro props.
Bug: 332255580
Test: ota on cvd and look for logs
Change-Id: I3a1329fa4fd919e373a85039d6d6c8f7b4f6f483
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
index 8af8cfc..02e5f66 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
@@ -868,6 +868,9 @@
// Get the verification block size
uint32_t GetVerificationBlockSize(LockedFile* lock);
+ // Get the number of verification threads
+ uint32_t GetNumVerificationThreads(LockedFile* lock);
+
// Wrapper around libdm, with diagnostics.
bool DeleteDeviceIfExists(const std::string& name,
const std::chrono::milliseconds& timeout_ms = {});
diff --git a/fs_mgr/libsnapshot/snapshot.cpp b/fs_mgr/libsnapshot/snapshot.cpp
index ad7a93a..8c11800 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -1796,6 +1796,11 @@
if (verify_block_size != 0) {
snapuserd_argv->emplace_back("-verify_block_size=" + std::to_string(verify_block_size));
}
+ uint32_t num_verify_threads = GetNumVerificationThreads(lock.get());
+ if (num_verify_threads != 0) {
+ snapuserd_argv->emplace_back("-num_verify_threads=" +
+ std::to_string(num_verify_threads));
+ }
}
size_t num_cows = 0;
@@ -2244,6 +2249,11 @@
return update_status.verify_block_size();
}
+uint32_t SnapshotManager::GetNumVerificationThreads(LockedFile* lock) {
+ SnapshotUpdateStatus update_status = ReadSnapshotUpdateStatus(lock);
+ return update_status.num_verification_threads();
+}
+
bool SnapshotManager::MarkSnapuserdFromSystem() {
auto path = GetSnapuserdFromSystemPath();
@@ -3237,6 +3247,7 @@
status.set_cow_op_merge_size(old_status.cow_op_merge_size());
status.set_num_worker_threads(old_status.num_worker_threads());
status.set_verify_block_size(old_status.verify_block_size());
+ status.set_num_verification_threads(old_status.num_verification_threads());
}
return WriteSnapshotUpdateStatus(lock, status);
}
@@ -3625,6 +3636,8 @@
android::base::GetUintProperty<uint32_t>("ro.virtual_ab.num_worker_threads", 0));
status.set_verify_block_size(
android::base::GetUintProperty<uint32_t>("ro.virtual_ab.verify_block_size", 0));
+ status.set_num_verification_threads(
+ android::base::GetUintProperty<uint32_t>("ro.virtual_ab.num_verify_threads", 0));
} else if (legacy_compression) {
LOG(INFO) << "Virtual A/B using legacy snapuserd";
} else {
@@ -4062,6 +4075,7 @@
ss << "Using o_direct: " << update_status.o_direct() << std::endl;
ss << "Cow op merge size (0 for uncapped): " << update_status.cow_op_merge_size() << std::endl;
ss << "Worker thread count: " << update_status.num_worker_threads() << std::endl;
+ ss << "Num verification threads: " << update_status.num_verification_threads() << std::endl;
ss << "Verify block size: " << update_status.verify_block_size() << std::endl;
ss << "Using XOR compression: " << GetXorCompressionEnabledProperty() << std::endl;
ss << "Current slot: " << device_->GetSlotSuffix() << std::endl;
diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
index 4477630..caef022 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
@@ -37,6 +37,7 @@
DEFINE_int32(cow_op_merge_size, 0, "number of operations to be processed at once");
DEFINE_int32(worker_count, 4, "number of worker threads used to serve I/O requests to dm-user");
DEFINE_int32(verify_block_size, 1_MiB, "block sized used during verification of snapshots");
+DEFINE_int32(num_verify_threads, 3, "number of threads used during verification phase");
namespace android {
namespace snapshot {
@@ -120,9 +121,9 @@
LOG(ERROR) << "Malformed message, expected at least four sub-arguments.";
return false;
}
- auto handler = user_server_.AddHandler(parts[0], parts[1], parts[2], parts[3],
- FLAGS_worker_count, FLAGS_o_direct,
- FLAGS_cow_op_merge_size, FLAGS_verify_block_size);
+ auto handler = user_server_.AddHandler(
+ parts[0], parts[1], parts[2], parts[3], FLAGS_worker_count, FLAGS_o_direct,
+ FLAGS_cow_op_merge_size, FLAGS_verify_block_size, FLAGS_num_verify_threads);
if (!handler || !user_server_.StartHandler(parts[0])) {
return false;
}
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
index ef3b290..6e5eed8 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/extractor.cpp
@@ -41,7 +41,7 @@
bool Extractor::Init() {
auto opener = factory_.CreateTestOpener(control_name_);
handler_ = std::make_shared<SnapshotHandler>(control_name_, cow_path_, base_path_, base_path_,
- opener, 1, false, false, false, 0, 0);
+ opener, 1, false, false, false, 0, 0, 0);
if (!handler_->InitCowDevice()) {
return false;
}
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
index 5ea0aa4..4e96d09 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
@@ -53,10 +53,12 @@
const std::string& misc_name, const std::string& cow_device_path,
const std::string& backing_device, const std::string& base_path_merge,
std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring,
- bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size) {
+ bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size,
+ uint32_t num_verification_threads) {
auto snapuserd = std::make_shared<SnapshotHandler>(
misc_name, cow_device_path, backing_device, base_path_merge, opener, num_worker_threads,
- use_iouring, perform_verification_, o_direct, cow_op_merge_size, verify_block_size);
+ use_iouring, perform_verification_, o_direct, cow_op_merge_size, verify_block_size,
+ num_verification_threads);
if (!snapuserd->InitCowDevice()) {
LOG(ERROR) << "Failed to initialize Snapuserd";
return nullptr;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
index 65a7ebd..410dca1 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
@@ -57,7 +57,8 @@
const std::string& misc_name, const std::string& cow_device_path,
const std::string& backing_device, const std::string& base_path_merge,
std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring,
- bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size) = 0;
+ bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size,
+ uint32_t num_verification_threads) = 0;
// Start serving requests on a snapshot handler.
virtual bool StartHandler(const std::string& misc_name) = 0;
@@ -101,7 +102,8 @@
const std::string& misc_name, const std::string& cow_device_path,
const std::string& backing_device, const std::string& base_path_merge,
std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring,
- bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size) override;
+ bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size,
+ uint32_t num_verification_threads) override;
bool StartHandler(const std::string& misc_name) override;
bool DeleteHandler(const std::string& misc_name) override;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
index 043cc76..c8e40fb 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
@@ -37,7 +37,8 @@
std::string backing_device, std::string base_path_merge,
std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads,
bool use_iouring, bool perform_verification, bool o_direct,
- uint32_t cow_op_merge_size, uint32_t verify_block_size) {
+ uint32_t cow_op_merge_size, uint32_t verify_block_size,
+ uint32_t num_verification_threads) {
misc_name_ = std::move(misc_name);
cow_device_ = std::move(cow_device);
backing_store_device_ = std::move(backing_device);
@@ -49,6 +50,7 @@
o_direct_ = o_direct;
cow_op_merge_size_ = cow_op_merge_size;
verify_block_size_ = verify_block_size;
+ num_verification_threads_ = num_verification_threads;
}
bool SnapshotHandler::InitializeWorkers() {
@@ -69,7 +71,8 @@
read_ahead_thread_ = std::make_unique<ReadAhead>(cow_device_, backing_store_device_, misc_name_,
GetSharedPtr(), cow_op_merge_size_);
- update_verify_ = std::make_unique<UpdateVerify>(misc_name_, verify_block_size_);
+ update_verify_ = std::make_unique<UpdateVerify>(misc_name_, verify_block_size_,
+ num_verification_threads_);
return true;
}
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
index fe2f9fd..80b85b4 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
@@ -105,7 +105,8 @@
SnapshotHandler(std::string misc_name, std::string cow_device, std::string backing_device,
std::string base_path_merge, std::shared_ptr<IBlockServerOpener> opener,
int num_workers, bool use_iouring, bool perform_verification, bool o_direct,
- uint32_t cow_op_merge_size, uint32_t verify_block_sze);
+ uint32_t cow_op_merge_size, uint32_t verify_block_sze,
+ uint32_t num_verification_threads);
bool InitCowDevice();
bool Start();
@@ -257,6 +258,7 @@
bool o_direct_ = false;
uint32_t cow_op_merge_size_ = 0;
uint32_t verify_block_size_ = 0;
+ uint32_t num_verification_threads_ = 0;
std::unique_ptr<UpdateVerify> update_verify_;
std::shared_ptr<IBlockServerOpener> block_server_opener_;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
index cb17daf..1f6729c 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
@@ -352,7 +352,7 @@
const std::string& misc_name, const std::string& cow_device_path,
const std::string& backing_device, const std::string& base_path_merge,
std::optional<uint32_t> num_worker_threads, const bool o_direct, uint32_t cow_op_merge_size,
- uint32_t verify_block_size) {
+ uint32_t verify_block_size, uint32_t num_verification_threads) {
// We will need multiple worker threads only during
// device boot after OTA. For all other purposes,
// one thread is sufficient. We don't want to consume
@@ -377,7 +377,7 @@
return handlers_->AddHandler(misc_name, cow_device_path, backing_device, base_path_merge,
opener, num_worker_threads.value(), io_uring_enabled_, o_direct,
- cow_op_merge_size, verify_block_size);
+ cow_op_merge_size, verify_block_size, num_verification_threads);
}
bool UserSnapshotServer::WaitForSocket() {
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
index 4e10ea1..c3e5a82 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
@@ -89,7 +89,8 @@
const std::string& base_path_merge,
std::optional<uint32_t> num_worker_threads,
bool o_direct = false, uint32_t cow_op_merge_size = 0,
- uint32_t verify_block_size = 0);
+ uint32_t verify_block_size = 0,
+ uint32_t num_verification_threads = 0);
bool StartHandler(const std::string& misc_name);
void SetTerminating() { terminating_ = true; }
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
index 368bb3d..48f9ffd 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
@@ -69,6 +69,7 @@
int num_threads;
uint32_t cow_op_merge_size;
uint32_t verification_block_size;
+ uint32_t num_verification_threads;
};
class SnapuserdTestBase : public ::testing::TestWithParam<TestParam> {
@@ -732,10 +733,10 @@
auto opener = factory->CreateOpener(system_device_ctrl_name_);
handlers_->DisableVerification();
const TestParam params = GetParam();
- auto handler =
- handlers_->AddHandler(system_device_ctrl_name_, cow_system_->path, base_dev_->GetPath(),
- base_dev_->GetPath(), opener, 1, params.io_uring, params.o_direct,
- params.cow_op_merge_size, params.verification_block_size);
+ auto handler = handlers_->AddHandler(
+ system_device_ctrl_name_, cow_system_->path, base_dev_->GetPath(), base_dev_->GetPath(),
+ opener, 1, params.io_uring, params.o_direct, params.cow_op_merge_size,
+ params.verification_block_size, params.num_verification_threads);
ASSERT_NE(handler, nullptr);
ASSERT_NE(handler->snapuserd(), nullptr);
#ifdef __ANDROID__
@@ -1278,7 +1279,7 @@
handler_ = std::make_shared<SnapshotHandler>(
system_device_ctrl_name_, cow_system_->path, base_dev_->GetPath(), base_dev_->GetPath(),
opener_, 1, false, false, params.o_direct, params.cow_op_merge_size,
- params.verification_block_size);
+ params.verification_block_size, params.num_verification_threads);
ASSERT_TRUE(handler_->InitCowDevice());
ASSERT_TRUE(handler_->InitializeWorkers());
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp
index 8b31315..5306209 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp
@@ -31,10 +31,12 @@
using namespace android::dm;
using android::base::unique_fd;
-UpdateVerify::UpdateVerify(const std::string& misc_name, uint32_t verify_block_size)
+UpdateVerify::UpdateVerify(const std::string& misc_name, uint32_t verify_block_size,
+ uint32_t num_verification_threads)
: misc_name_(misc_name),
state_(UpdateVerifyState::VERIFY_UNKNOWN),
- verify_block_size_(verify_block_size) {}
+ verify_block_size_(verify_block_size),
+ num_verification_threads_(num_verification_threads) {}
bool UpdateVerify::CheckPartitionVerification() {
auto now = std::chrono::system_clock::now();
@@ -251,6 +253,9 @@
int num_threads = kMinThreadsToVerify;
if (dev_sz > threshold_size_) {
num_threads = kMaxThreadsToVerify;
+ if (num_verification_threads_ != 0) {
+ num_threads = num_verification_threads_;
+ }
}
std::vector<std::future<bool>> threads;
diff --git a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
index 4ab0bc2..f995c7f 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.h
@@ -34,7 +34,8 @@
class UpdateVerify {
public:
- UpdateVerify(const std::string& misc_name, uint32_t verify_block_size);
+ UpdateVerify(const std::string& misc_name, uint32_t verify_block_size,
+ uint32_t num_verification_threads);
void VerifyUpdatePartition();
bool CheckPartitionVerification();
@@ -66,6 +67,7 @@
*/
uint64_t verify_block_size_ = 1_MiB;
uint64_t threshold_size_ = 2_GiB;
+ uint32_t num_verification_threads_;
int queue_depth_ = 4;
bool IsBlockAligned(uint64_t read_size) { return ((read_size & (BLOCK_SZ - 1)) == 0); }