Loading fs_mgr/libsnapshot/snapuserd/Android.bp +8 −7 Original line number Diff line number Diff line Loading @@ -164,7 +164,7 @@ cc_binary { } cc_test { name: "cow_snapuserd_test", name: "snapuserd_test_legacy", defaults: [ "fs_mgr_defaults", "libsnapshot_cow_defaults", Loading Loading @@ -216,16 +216,17 @@ cc_test { ], static_libs: [ "libbrotli", "libgtest", "libsnapshot_cow", "libsnapshot_snapuserd", "libcutils_sockets", "libz", "libfs_mgr", "libdm", "libext4_utils", "liburing", "libfs_mgr", "libgflags", "libgtest", "libsnapshot_cow", "libsnapshot_snapuserd", "libsnapuserd", "liburing", "libz", ], include_dirs: ["bionic/libc/kernel"], header_libs: [ Loading fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,9 @@ namespace snapshot { static constexpr uint8_t kMaxMergeThreads = 2; HandlerThread::HandlerThread(std::shared_ptr<SnapshotHandler> snapuserd) : snapuserd_(snapuserd), misc_name_(snapuserd_->GetMiscName()) {} void HandlerThread::FreeResources() { // Each worker thread holds a reference to snapuserd. // Clear them so that all the resources Loading fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -433,11 +433,6 @@ bool SnapshotHandler::IsIouringSupported() { struct utsname uts; unsigned int major, minor; if (android::base::GetBoolProperty("snapuserd.test.io_uring.force_disable", false)) { SNAP_LOG(INFO) << "io_uring disabled for testing"; return false; } if ((uname(&uts) != 0) || (sscanf(uts.release, "%u.%u", &major, &minor) != 2)) { SNAP_LOG(ERROR) << "Could not parse the kernel version from uname. " << " io_uring not supported"; Loading fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp +0 −3 Original line number Diff line number Diff line Loading @@ -83,9 +83,6 @@ void UserSnapshotServer::ShutdownThreads() { handlers_->JoinAllThreads(); } HandlerThread::HandlerThread(std::shared_ptr<SnapshotHandler> snapuserd) : snapuserd_(snapuserd), misc_name_(snapuserd_->GetMiscName()) {} bool UserSnapshotServer::Sendmsg(android::base::borrowed_fd fd, const std::string& msg) { ssize_t ret = TEMP_FAILURE_RETRY(send(fd.get(), msg.data(), msg.size(), MSG_NOSIGNAL)); if (ret < 0) { Loading fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp +22 −53 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ #include <libdm/dm.h> #include <libdm/loop_control.h> #include <libsnapshot/cow_writer.h> #include <snapuserd/snapuserd_client.h> #include <storage_literals/storage_literals.h> #include "handler_manager.h" #include "snapuserd_core.h" DEFINE_string(force_config, "", "Force testing mode with iouring disabled"); Loading @@ -54,8 +54,6 @@ using namespace std::chrono_literals; using namespace android::dm; using namespace std; static constexpr char kSnapuserdSocketTest[] = "snapuserdTest"; class Tempdevice { public: Tempdevice(const std::string& name, const DmTable& table) Loading @@ -68,15 +66,15 @@ class Tempdevice { } ~Tempdevice() { if (valid_) { dm_.DeleteDevice(name_); dm_.DeleteDeviceIfExists(name_); } } bool Destroy() { if (!valid_) { return false; return true; } valid_ = false; return dm_.DeleteDevice(name_); return dm_.DeleteDeviceIfExists(name_); } const std::string& path() const { return path_; } const std::string& name() const { return name_; } Loading Loading @@ -138,7 +136,6 @@ class SnapuserdTest : public ::testing::Test { void SetDeviceControlName(); void InitDaemon(); void CreateDmUserDevice(); void StartSnapuserdDaemon(); unique_ptr<LoopDevice> base_loop_; unique_ptr<Tempdevice> dmuser_dev_; Loading @@ -148,9 +145,9 @@ class SnapuserdTest : public ::testing::Test { unique_fd base_fd_; std::unique_ptr<TemporaryFile> cow_system_; std::unique_ptr<SnapuserdClient> client_; std::unique_ptr<uint8_t[]> orig_buffer_; std::unique_ptr<uint8_t[]> merged_buffer_; SnapshotHandlerManager handlers_; bool setup_ok_ = false; bool merge_ok_ = false; size_t size_ = 100_MiB; Loading Loading @@ -180,9 +177,9 @@ void SnapuserdTest::Shutdown() { ASSERT_TRUE(dmuser_dev_->Destroy()); auto misc_device = "/dev/dm-user/" + system_device_ctrl_name_; ASSERT_TRUE(client_->WaitForDeviceDelete(system_device_ctrl_name_)); ASSERT_TRUE(handlers_.DeleteHandler(system_device_ctrl_name_)); ASSERT_TRUE(android::fs_mgr::WaitForFileDeleted(misc_device, 10s)); ASSERT_TRUE(client_->DetachSnapuserd()); handlers_.TerminateMergeThreads(); } bool SnapuserdTest::SetupDefault() { Loading Loading @@ -217,8 +214,6 @@ bool SnapuserdTest::SetupCopyOverlap_2() { bool SnapuserdTest::SetupDaemon() { SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading @@ -228,20 +223,6 @@ bool SnapuserdTest::SetupDaemon() { return setup_ok_; } void SnapuserdTest::StartSnapuserdDaemon() { pid_t pid = fork(); ASSERT_GE(pid, 0); if (pid == 0) { std::string arg0 = "/system/bin/snapuserd"; std::string arg1 = "-socket="s + kSnapuserdSocketTest; char* const argv[] = {arg0.data(), arg1.data(), nullptr}; ASSERT_GE(execv(arg0.c_str(), argv), 0); } else { client_ = SnapuserdClient::Connect(kSnapuserdSocketTest, 10s); ASSERT_NE(client_, nullptr); } } void SnapuserdTest::CreateBaseDevice() { unique_fd rnd_fd; Loading Loading @@ -606,9 +587,17 @@ void SnapuserdTest::CreateCowDevice() { } void SnapuserdTest::InitCowDevice() { uint64_t num_sectors = client_->InitDmUserCow(system_device_ctrl_name_, cow_system_->path, base_loop_->device(), base_loop_->device()); ASSERT_NE(num_sectors, 0); bool use_iouring = true; if (FLAGS_force_config == "iouring_disabled") { use_iouring = false; } auto handler = handlers_.AddHandler(system_device_ctrl_name_, cow_system_->path, base_loop_->device(), base_loop_->device(), 1, use_iouring, false); ASSERT_NE(handler, nullptr); ASSERT_NE(handler->snapuserd(), nullptr); ASSERT_NE(handler->snapuserd()->GetNumSectors(), 0); } void SnapuserdTest::SetDeviceControlName() { Loading Loading @@ -646,13 +635,12 @@ void SnapuserdTest::CreateDmUserDevice() { } void SnapuserdTest::InitDaemon() { bool ok = client_->AttachDmUser(system_device_ctrl_name_); ASSERT_TRUE(ok); ASSERT_TRUE(handlers_.StartHandler(system_device_ctrl_name_)); } void SnapuserdTest::CheckMergeCompletion() { while (true) { double percentage = client_->GetMergePercent(); double percentage = handlers_.GetMergePercentage(); if ((int)percentage == 100) { break; } Loading @@ -667,8 +655,6 @@ void SnapuserdTest::SetupImpl() { SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading @@ -684,8 +670,7 @@ bool SnapuserdTest::Merge() { } void SnapuserdTest::StartMerge() { bool ok = client_->InitiateMerge(system_device_ctrl_name_); ASSERT_TRUE(ok); ASSERT_TRUE(handlers_.InitiateMerge(system_device_ctrl_name_)); } void SnapuserdTest::ValidateMerge() { Loading @@ -699,7 +684,6 @@ void SnapuserdTest::SimulateDaemonRestart() { Shutdown(); std::this_thread::sleep_for(500ms); SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading Loading @@ -859,20 +843,5 @@ int main(int argc, char** argv) { gflags::ParseCommandLineFlags(&argc, &argv, false); android::base::SetProperty("ctl.stop", "snapuserd"); if (FLAGS_force_config == "iouring_disabled") { if (!android::base::SetProperty("snapuserd.test.io_uring.force_disable", "1")) { return testing::AssertionFailure() << "Failed to disable property: snapuserd.test.io_uring.disabled"; } } int ret = RUN_ALL_TESTS(); if (FLAGS_force_config == "iouring_disabled") { android::base::SetProperty("snapuserd.test.io_uring.force_disable", "0"); } return ret; return RUN_ALL_TESTS(); } Loading
fs_mgr/libsnapshot/snapuserd/Android.bp +8 −7 Original line number Diff line number Diff line Loading @@ -164,7 +164,7 @@ cc_binary { } cc_test { name: "cow_snapuserd_test", name: "snapuserd_test_legacy", defaults: [ "fs_mgr_defaults", "libsnapshot_cow_defaults", Loading Loading @@ -216,16 +216,17 @@ cc_test { ], static_libs: [ "libbrotli", "libgtest", "libsnapshot_cow", "libsnapshot_snapuserd", "libcutils_sockets", "libz", "libfs_mgr", "libdm", "libext4_utils", "liburing", "libfs_mgr", "libgflags", "libgtest", "libsnapshot_cow", "libsnapshot_snapuserd", "libsnapuserd", "liburing", "libz", ], include_dirs: ["bionic/libc/kernel"], header_libs: [ Loading
fs_mgr/libsnapshot/snapuserd/user-space-merge/handler_manager.cpp +3 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,9 @@ namespace snapshot { static constexpr uint8_t kMaxMergeThreads = 2; HandlerThread::HandlerThread(std::shared_ptr<SnapshotHandler> snapuserd) : snapuserd_(snapuserd), misc_name_(snapuserd_->GetMiscName()) {} void HandlerThread::FreeResources() { // Each worker thread holds a reference to snapuserd. // Clear them so that all the resources Loading
fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_core.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -433,11 +433,6 @@ bool SnapshotHandler::IsIouringSupported() { struct utsname uts; unsigned int major, minor; if (android::base::GetBoolProperty("snapuserd.test.io_uring.force_disable", false)) { SNAP_LOG(INFO) << "io_uring disabled for testing"; return false; } if ((uname(&uts) != 0) || (sscanf(uts.release, "%u.%u", &major, &minor) != 2)) { SNAP_LOG(ERROR) << "Could not parse the kernel version from uname. " << " io_uring not supported"; Loading
fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_server.cpp +0 −3 Original line number Diff line number Diff line Loading @@ -83,9 +83,6 @@ void UserSnapshotServer::ShutdownThreads() { handlers_->JoinAllThreads(); } HandlerThread::HandlerThread(std::shared_ptr<SnapshotHandler> snapuserd) : snapuserd_(snapuserd), misc_name_(snapuserd_->GetMiscName()) {} bool UserSnapshotServer::Sendmsg(android::base::borrowed_fd fd, const std::string& msg) { ssize_t ret = TEMP_FAILURE_RETRY(send(fd.get(), msg.data(), msg.size(), MSG_NOSIGNAL)); if (ret < 0) { Loading
fs_mgr/libsnapshot/snapuserd/user-space-merge/snapuserd_test.cpp +22 −53 Original line number Diff line number Diff line Loading @@ -37,9 +37,9 @@ #include <libdm/dm.h> #include <libdm/loop_control.h> #include <libsnapshot/cow_writer.h> #include <snapuserd/snapuserd_client.h> #include <storage_literals/storage_literals.h> #include "handler_manager.h" #include "snapuserd_core.h" DEFINE_string(force_config, "", "Force testing mode with iouring disabled"); Loading @@ -54,8 +54,6 @@ using namespace std::chrono_literals; using namespace android::dm; using namespace std; static constexpr char kSnapuserdSocketTest[] = "snapuserdTest"; class Tempdevice { public: Tempdevice(const std::string& name, const DmTable& table) Loading @@ -68,15 +66,15 @@ class Tempdevice { } ~Tempdevice() { if (valid_) { dm_.DeleteDevice(name_); dm_.DeleteDeviceIfExists(name_); } } bool Destroy() { if (!valid_) { return false; return true; } valid_ = false; return dm_.DeleteDevice(name_); return dm_.DeleteDeviceIfExists(name_); } const std::string& path() const { return path_; } const std::string& name() const { return name_; } Loading Loading @@ -138,7 +136,6 @@ class SnapuserdTest : public ::testing::Test { void SetDeviceControlName(); void InitDaemon(); void CreateDmUserDevice(); void StartSnapuserdDaemon(); unique_ptr<LoopDevice> base_loop_; unique_ptr<Tempdevice> dmuser_dev_; Loading @@ -148,9 +145,9 @@ class SnapuserdTest : public ::testing::Test { unique_fd base_fd_; std::unique_ptr<TemporaryFile> cow_system_; std::unique_ptr<SnapuserdClient> client_; std::unique_ptr<uint8_t[]> orig_buffer_; std::unique_ptr<uint8_t[]> merged_buffer_; SnapshotHandlerManager handlers_; bool setup_ok_ = false; bool merge_ok_ = false; size_t size_ = 100_MiB; Loading Loading @@ -180,9 +177,9 @@ void SnapuserdTest::Shutdown() { ASSERT_TRUE(dmuser_dev_->Destroy()); auto misc_device = "/dev/dm-user/" + system_device_ctrl_name_; ASSERT_TRUE(client_->WaitForDeviceDelete(system_device_ctrl_name_)); ASSERT_TRUE(handlers_.DeleteHandler(system_device_ctrl_name_)); ASSERT_TRUE(android::fs_mgr::WaitForFileDeleted(misc_device, 10s)); ASSERT_TRUE(client_->DetachSnapuserd()); handlers_.TerminateMergeThreads(); } bool SnapuserdTest::SetupDefault() { Loading Loading @@ -217,8 +214,6 @@ bool SnapuserdTest::SetupCopyOverlap_2() { bool SnapuserdTest::SetupDaemon() { SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading @@ -228,20 +223,6 @@ bool SnapuserdTest::SetupDaemon() { return setup_ok_; } void SnapuserdTest::StartSnapuserdDaemon() { pid_t pid = fork(); ASSERT_GE(pid, 0); if (pid == 0) { std::string arg0 = "/system/bin/snapuserd"; std::string arg1 = "-socket="s + kSnapuserdSocketTest; char* const argv[] = {arg0.data(), arg1.data(), nullptr}; ASSERT_GE(execv(arg0.c_str(), argv), 0); } else { client_ = SnapuserdClient::Connect(kSnapuserdSocketTest, 10s); ASSERT_NE(client_, nullptr); } } void SnapuserdTest::CreateBaseDevice() { unique_fd rnd_fd; Loading Loading @@ -606,9 +587,17 @@ void SnapuserdTest::CreateCowDevice() { } void SnapuserdTest::InitCowDevice() { uint64_t num_sectors = client_->InitDmUserCow(system_device_ctrl_name_, cow_system_->path, base_loop_->device(), base_loop_->device()); ASSERT_NE(num_sectors, 0); bool use_iouring = true; if (FLAGS_force_config == "iouring_disabled") { use_iouring = false; } auto handler = handlers_.AddHandler(system_device_ctrl_name_, cow_system_->path, base_loop_->device(), base_loop_->device(), 1, use_iouring, false); ASSERT_NE(handler, nullptr); ASSERT_NE(handler->snapuserd(), nullptr); ASSERT_NE(handler->snapuserd()->GetNumSectors(), 0); } void SnapuserdTest::SetDeviceControlName() { Loading Loading @@ -646,13 +635,12 @@ void SnapuserdTest::CreateDmUserDevice() { } void SnapuserdTest::InitDaemon() { bool ok = client_->AttachDmUser(system_device_ctrl_name_); ASSERT_TRUE(ok); ASSERT_TRUE(handlers_.StartHandler(system_device_ctrl_name_)); } void SnapuserdTest::CheckMergeCompletion() { while (true) { double percentage = client_->GetMergePercent(); double percentage = handlers_.GetMergePercentage(); if ((int)percentage == 100) { break; } Loading @@ -667,8 +655,6 @@ void SnapuserdTest::SetupImpl() { SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading @@ -684,8 +670,7 @@ bool SnapuserdTest::Merge() { } void SnapuserdTest::StartMerge() { bool ok = client_->InitiateMerge(system_device_ctrl_name_); ASSERT_TRUE(ok); ASSERT_TRUE(handlers_.InitiateMerge(system_device_ctrl_name_)); } void SnapuserdTest::ValidateMerge() { Loading @@ -699,7 +684,6 @@ void SnapuserdTest::SimulateDaemonRestart() { Shutdown(); std::this_thread::sleep_for(500ms); SetDeviceControlName(); StartSnapuserdDaemon(); CreateDmUserDevice(); InitCowDevice(); InitDaemon(); Loading Loading @@ -859,20 +843,5 @@ int main(int argc, char** argv) { gflags::ParseCommandLineFlags(&argc, &argv, false); android::base::SetProperty("ctl.stop", "snapuserd"); if (FLAGS_force_config == "iouring_disabled") { if (!android::base::SetProperty("snapuserd.test.io_uring.force_disable", "1")) { return testing::AssertionFailure() << "Failed to disable property: snapuserd.test.io_uring.disabled"; } } int ret = RUN_ALL_TESTS(); if (FLAGS_force_config == "iouring_disabled") { android::base::SetProperty("snapuserd.test.io_uring.force_disable", "0"); } return ret; return RUN_ALL_TESTS(); }