snapuserd: Add an IBlockServerFactory abstraction.
To avoid SnapshotHandler hardcoding specifics about dm-user, this patch
adds a factory interface, responsible for providing IBlockServerOpener
objects.
The test harness will use this to facilitate dm-user-less testing on
host devices.
Bug: 288273605
Test: snapuserd_test
Change-Id: Ifd33c28ee7076f30a8a90f745353893188f97a08
diff --git a/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp b/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp
index b5fef47..e988335 100644
--- a/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/dm_user_block_server.cpp
@@ -142,5 +142,11 @@
return std::make_unique<DmUserBlockServer>(misc_name_, std::move(fd), delegate, buffer_size);
}
+std::shared_ptr<IBlockServerOpener> DmUserBlockServerFactory::CreateOpener(
+ const std::string& misc_name) {
+ auto dm_path = "/dev/dm-user/" + misc_name;
+ return std::make_shared<DmUserBlockServerOpener>(misc_name, dm_path);
+}
+
} // namespace snapshot
} // namespace android
diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/block_server.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/block_server.h
index 72b73fc..406bf11 100644
--- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/block_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/block_server.h
@@ -83,5 +83,13 @@
size_t buffer_size) = 0;
};
+class IBlockServerFactory {
+ public:
+ virtual ~IBlockServerFactory() {}
+
+ // Return a new IBlockServerOpener given a unique device name.
+ virtual std::shared_ptr<IBlockServerOpener> CreateOpener(const std::string& misc_name) = 0;
+};
+
} // namespace snapshot
} // namespace android
diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h
index 6aecf50..f1f8da1 100644
--- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/dm_user_block_server.h
@@ -59,5 +59,10 @@
std::string dm_user_path_;
};
+class DmUserBlockServerFactory : public IBlockServerFactory {
+ public:
+ std::shared_ptr<IBlockServerOpener> CreateOpener(const std::string& misc_name) override;
+};
+
} // namespace snapshot
} // namespace android
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 041e516..fd41cd4 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp
@@ -50,9 +50,10 @@
std::shared_ptr<HandlerThread> SnapshotHandlerManager::AddHandler(
const std::string& misc_name, const std::string& cow_device_path,
const std::string& backing_device, const std::string& base_path_merge,
- int num_worker_threads, bool use_iouring, bool perform_verification) {
+ std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads, bool use_iouring,
+ bool perform_verification) {
auto snapuserd = std::make_shared<SnapshotHandler>(misc_name, cow_device_path, backing_device,
- base_path_merge, num_worker_threads,
+ base_path_merge, opener, num_worker_threads,
use_iouring, perform_verification);
if (!snapuserd->InitCowDevice()) {
LOG(ERROR) << "Failed to initialize Snapuserd";
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 b7ddac1..2a6da96 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.h
@@ -21,6 +21,7 @@
#include <vector>
#include <android-base/unique_fd.h>
+#include <snapuserd/block_server.h>
namespace android {
namespace snapshot {
@@ -55,6 +56,7 @@
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 perform_verification) = 0;
@@ -91,6 +93,7 @@
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 perform_verification) override;
bool StartHandler(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 6d3d5c7..5a82ca1 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp
@@ -36,12 +36,12 @@
SnapshotHandler::SnapshotHandler(std::string misc_name, std::string cow_device,
std::string backing_device, std::string base_path_merge,
- int num_worker_threads, bool use_iouring,
- bool perform_verification) {
+ std::shared_ptr<IBlockServerOpener> opener, int num_worker_threads,
+ bool use_iouring, bool perform_verification) {
misc_name_ = std::move(misc_name);
cow_device_ = std::move(cow_device);
backing_store_device_ = std::move(backing_device);
- control_device_ = "/dev/dm-user/" + misc_name_;
+ block_server_opener_ = std::move(opener);
base_path_merge_ = std::move(base_path_merge);
num_worker_threads_ = num_worker_threads;
is_io_uring_enabled_ = use_iouring;
@@ -49,10 +49,10 @@
}
bool SnapshotHandler::InitializeWorkers() {
- auto opener = std::make_shared<DmUserBlockServerOpener>(misc_name_, control_device_);
for (int i = 0; i < num_worker_threads_; i++) {
auto wt = std::make_unique<ReadWorker>(cow_device_, backing_store_device_, misc_name_,
- base_path_merge_, GetSharedPtr(), opener);
+ base_path_merge_, GetSharedPtr(),
+ block_server_opener_);
if (!wt->Init()) {
SNAP_LOG(ERROR) << "Thread initialization failed";
return false;
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 5fe0a70..a45e0bc 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.h
@@ -43,6 +43,7 @@
#include <libsnapshot/cow_reader.h>
#include <libsnapshot/cow_writer.h>
#include <liburing.h>
+#include <snapuserd/block_server.h>
#include <snapuserd/snapuserd_buffer.h>
#include <snapuserd/snapuserd_kernel.h>
#include <storage_literals/storage_literals.h>
@@ -102,8 +103,8 @@
class SnapshotHandler : public std::enable_shared_from_this<SnapshotHandler> {
public:
SnapshotHandler(std::string misc_name, std::string cow_device, std::string backing_device,
- std::string base_path_merge, int num_workers, bool use_iouring,
- bool perform_verification);
+ std::string base_path_merge, std::shared_ptr<IBlockServerOpener> opener,
+ int num_workers, bool use_iouring, bool perform_verification);
bool InitCowDevice();
bool Start();
@@ -242,6 +243,7 @@
std::unique_ptr<struct io_uring> ring_;
std::unique_ptr<UpdateVerify> update_verify_;
+ std::shared_ptr<IBlockServerOpener> block_server_opener_;
};
} // namespace snapshot
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 f2585ea..13b9a00 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp
@@ -31,6 +31,7 @@
#include <android-base/scopeguard.h>
#include <android-base/strings.h>
#include <fs_mgr/file_wait.h>
+#include <snapuserd/dm_user_block_server.h>
#include <snapuserd/snapuserd_client.h>
#include "snapuserd_server.h"
@@ -48,6 +49,7 @@
UserSnapshotServer::UserSnapshotServer() {
terminating_ = false;
handlers_ = std::make_unique<SnapshotHandlerManager>();
+ block_server_factory_ = std::make_unique<DmUserBlockServerFactory>();
}
UserSnapshotServer::~UserSnapshotServer() {
@@ -363,8 +365,11 @@
perform_verification = false;
}
+ auto opener = block_server_factory_->CreateOpener(misc_name);
+
return handlers_->AddHandler(misc_name, cow_device_path, backing_device, base_path_merge,
- num_worker_threads, io_uring_enabled_, perform_verification);
+ opener, num_worker_threads, io_uring_enabled_,
+ perform_verification);
}
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 988c01a..be28541 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.h
@@ -31,6 +31,7 @@
#include <vector>
#include <android-base/unique_fd.h>
+#include <snapuserd/block_server.h>
#include "handler_manager.h"
#include "snapuserd_core.h"
@@ -50,6 +51,7 @@
bool is_server_running_ = false;
bool io_uring_enabled_ = false;
std::unique_ptr<ISnapshotHandlerManager> handlers_;
+ std::unique_ptr<IBlockServerFactory> block_server_factory_;
std::mutex lock_;
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 16f9ed8..157925d 100644
--- a/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp
@@ -37,8 +37,8 @@
#include <libdm/dm.h>
#include <libdm/loop_control.h>
#include <libsnapshot/cow_writer.h>
+#include <snapuserd/dm_user_block_server.h>
#include <storage_literals/storage_literals.h>
-
#include "handler_manager.h"
#include "snapuserd_core.h"
#include "testing/temp_device.h"
@@ -535,9 +535,12 @@
use_iouring = false;
}
+ DmUserBlockServerFactory factory;
+
+ auto opener = factory.CreateOpener(system_device_ctrl_name_);
auto handler =
handlers_.AddHandler(system_device_ctrl_name_, cow_system_->path, base_loop_->device(),
- base_loop_->device(), 1, use_iouring, false);
+ base_loop_->device(), opener, 1, use_iouring, false);
ASSERT_NE(handler, nullptr);
ASSERT_NE(handler->snapuserd(), nullptr);
#ifdef __ANDROID__