snapuserd: use verification_block_size
verification block size will be read from vabc_features.mk. In order for
snapuserd to have access to this value in first stage init, we will
persist the data to metadata protobuf
Bug: 332255580
Test: full ota on cvd logging the verification block size
Change-Id: I03ef8a6976ced9309efede30c792aef786a0a745
diff --git a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
index 8a8100c..8af8cfc 100644
--- a/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
+++ b/fs_mgr/libsnapshot/include/libsnapshot/snapshot.h
@@ -865,6 +865,9 @@
// Get number of threads to perform post OTA boot verification
uint32_t GetUpdateWorkerCount(LockedFile* lock);
+ // Get the verification block size
+ uint32_t GetVerificationBlockSize(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 adfb16b..ad7a93a 100644
--- a/fs_mgr/libsnapshot/snapshot.cpp
+++ b/fs_mgr/libsnapshot/snapshot.cpp
@@ -1792,6 +1792,10 @@
if (worker_count != 0) {
snapuserd_argv->emplace_back("-worker_count=" + std::to_string(worker_count));
}
+ uint32_t verify_block_size = GetVerificationBlockSize(lock.get());
+ if (verify_block_size != 0) {
+ snapuserd_argv->emplace_back("-verify_block_size=" + std::to_string(verify_block_size));
+ }
}
size_t num_cows = 0;
@@ -2235,6 +2239,11 @@
return update_status.num_worker_threads();
}
+uint32_t SnapshotManager::GetVerificationBlockSize(LockedFile* lock) {
+ SnapshotUpdateStatus update_status = ReadSnapshotUpdateStatus(lock);
+ return update_status.verify_block_size();
+}
+
bool SnapshotManager::MarkSnapuserdFromSystem() {
auto path = GetSnapuserdFromSystemPath();
@@ -3227,6 +3236,7 @@
status.set_o_direct(old_status.o_direct());
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());
}
return WriteSnapshotUpdateStatus(lock, status);
}
@@ -3613,7 +3623,8 @@
android::base::GetUintProperty<uint32_t>("ro.virtual_ab.cow_op_merge_size", 0));
status.set_num_worker_threads(
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));
} else if (legacy_compression) {
LOG(INFO) << "Virtual A/B using legacy snapuserd";
} else {
@@ -4051,6 +4062,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 << "Verify block size: " << update_status.verify_block_size() << std::endl;
ss << "Using XOR compression: " << GetXorCompressionEnabledProperty() << std::endl;
ss << "Current slot: " << device_->GetSlotSuffix() << std::endl;
ss << "Boot indicator: booting from " << GetCurrentSlot() << " slot" << std::endl;
diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
index 32e16cc..4477630 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_daemon.cpp
@@ -20,8 +20,12 @@
#include <gflags/gflags.h>
#include <snapuserd/snapuserd_client.h>
+#include <storage_literals/storage_literals.h>
+
#include "snapuserd_daemon.h"
+using namespace android::storage_literals;
+
DEFINE_string(socket, android::snapshot::kSnapuserdSocket, "Named socket or socket path.");
DEFINE_bool(no_socket, false,
"If true, no socket is used. Each additional argument is an INIT message.");
@@ -32,6 +36,7 @@
DEFINE_bool(o_direct, false, "If true, enable direct reads on source device");
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");
namespace android {
namespace snapshot {
@@ -115,9 +120,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);
+ 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);
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 ef4ba93..ef3b290 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);
+ opener, 1, false, false, false, 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 cf507e3..5ea0aa4 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,10 @@
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) {
+ bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size) {
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);
+ use_iouring, perform_verification_, o_direct, cow_op_merge_size, verify_block_size);
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 89f3461..65a7ebd 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,7 @@
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) = 0;
+ bool o_direct, uint32_t cow_op_merge_size, uint32_t verify_block_size) = 0;
// Start serving requests on a snapshot handler.
virtual bool StartHandler(const std::string& misc_name) = 0;
@@ -97,13 +97,12 @@
class SnapshotHandlerManager final : public ISnapshotHandlerManager {
public:
SnapshotHandlerManager();
- std::shared_ptr<HandlerThread> AddHandler(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) override;
+ std::shared_ptr<HandlerThread> AddHandler(
+ 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 StartHandler(const std::string& misc_name) override;
bool DeleteHandler(const std::string& misc_name) override;
bool InitiateMerge(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 7c9a64e..043cc76 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,7 @@
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 cow_op_merge_size, uint32_t verify_block_size) {
misc_name_ = std::move(misc_name);
cow_device_ = std::move(cow_device);
backing_store_device_ = std::move(backing_device);
@@ -48,6 +48,7 @@
perform_verification_ = perform_verification;
o_direct_ = o_direct;
cow_op_merge_size_ = cow_op_merge_size;
+ verify_block_size_ = verify_block_size;
}
bool SnapshotHandler::InitializeWorkers() {
@@ -68,7 +69,7 @@
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_);
+ update_verify_ = std::make_unique<UpdateVerify>(misc_name_, verify_block_size_);
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 924539f..fe2f9fd 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,7 @@
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 cow_op_merge_size, uint32_t verify_block_sze);
bool InitCowDevice();
bool Start();
@@ -256,6 +256,7 @@
bool merge_complete_ = false;
bool o_direct_ = false;
uint32_t cow_op_merge_size_ = 0;
+ uint32_t verify_block_size_ = 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 372b2f2..cb17daf 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
@@ -351,8 +351,8 @@
std::shared_ptr<HandlerThread> UserSnapshotServer::AddHandler(
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) {
+ std::optional<uint32_t> num_worker_threads, const bool o_direct, uint32_t cow_op_merge_size,
+ uint32_t verify_block_size) {
// 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);
+ cow_op_merge_size, verify_block_size);
}
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 f002e8d..4e10ea1 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
@@ -88,8 +88,8 @@
const std::string& backing_device,
const std::string& base_path_merge,
std::optional<uint32_t> num_worker_threads,
- bool o_direct = false,
- uint32_t cow_op_merge_size = 0);
+ bool o_direct = false, uint32_t cow_op_merge_size = 0,
+ uint32_t verify_block_size = 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 0790a19..368bb3d 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
@@ -68,6 +68,7 @@
int block_size;
int num_threads;
uint32_t cow_op_merge_size;
+ uint32_t verification_block_size;
};
class SnapuserdTestBase : public ::testing::TestWithParam<TestParam> {
@@ -731,9 +732,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);
+ 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);
ASSERT_NE(handler, nullptr);
ASSERT_NE(handler->snapuserd(), nullptr);
#ifdef __ANDROID__
@@ -1275,7 +1277,8 @@
const TestParam params = GetParam();
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);
+ opener_, 1, false, false, params.o_direct, params.cow_op_merge_size,
+ params.verification_block_size);
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 97f8df4..8b31315 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_verify.cpp
@@ -31,8 +31,10 @@
using namespace android::dm;
using android::base::unique_fd;
-UpdateVerify::UpdateVerify(const std::string& misc_name)
- : misc_name_(misc_name), state_(UpdateVerifyState::VERIFY_UNKNOWN) {}
+UpdateVerify::UpdateVerify(const std::string& misc_name, uint32_t verify_block_size)
+ : misc_name_(misc_name),
+ state_(UpdateVerifyState::VERIFY_UNKNOWN),
+ verify_block_size_(verify_block_size) {}
bool UpdateVerify::CheckPartitionVerification() {
auto now = std::chrono::system_clock::now();
@@ -204,9 +206,8 @@
}
}
- SNAP_LOG(DEBUG) << "Verification success with io_uring: "
- << " dev_sz: " << dev_sz << " partition_name: " << partition_name
- << " total_read: " << total_read;
+ SNAP_LOG(DEBUG) << "Verification success with io_uring: " << " dev_sz: " << dev_sz
+ << " partition_name: " << partition_name << " total_read: " << total_read;
return true;
}
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 69a334b..4ab0bc2 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,7 @@
class UpdateVerify {
public:
- UpdateVerify(const std::string& misc_name);
+ UpdateVerify(const std::string& misc_name, uint32_t verify_block_size);
void VerifyUpdatePartition();
bool CheckPartitionVerification();