Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54d326c5 authored by David Anderson's avatar David Anderson Committed by Cherrypicker Worker
Browse files

snapuserd: Run snapuserd threads in-process.

This removes the temporary daemon and socket and instead directly embeds
SnapshotHandlerManager. We can also remove the test flags for io_uring
as with this they're no longer necessary.

Bug: 269361087
Test: snapuserd_test
Ignore-AOSP-First: cherry-pick from aosp
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:269e99f9558ae332e10329451fc51dc6698375a0)
Merged-In: I728186d9bc90c98fabd76d3f86569840488ada96
Change-Id: I728186d9bc90c98fabd76d3f86569840488ada96
parent 7445be51
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ cc_binary {
}

cc_test {
    name: "cow_snapuserd_test",
    name: "snapuserd_test_legacy",
    defaults: [
        "fs_mgr_defaults",
        "libsnapshot_cow_defaults",
@@ -217,16 +217,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: [
+3 −0
Original line number Diff line number Diff line
@@ -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
+0 −5
Original line number Diff line number Diff line
@@ -421,11 +421,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";
+0 −3
Original line number Diff line number Diff line
@@ -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) {
+22 −53
Original line number Diff line number Diff line
@@ -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");
@@ -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)
@@ -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_; }
@@ -139,7 +137,6 @@ class SnapuserdTest : public ::testing::Test {
    void SetDeviceControlName();
    void InitDaemon();
    void CreateDmUserDevice();
    void StartSnapuserdDaemon();

    unique_ptr<LoopDevice> base_loop_;
    unique_ptr<Tempdevice> dmuser_dev_;
@@ -149,9 +146,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;
@@ -181,9 +178,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() {
@@ -218,8 +215,6 @@ bool SnapuserdTest::SetupCopyOverlap_2() {
bool SnapuserdTest::SetupDaemon() {
    SetDeviceControlName();

    StartSnapuserdDaemon();

    CreateDmUserDevice();
    InitCowDevice();
    InitDaemon();
@@ -229,20 +224,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;

@@ -591,9 +572,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() {
@@ -631,13 +620,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;
        }
@@ -652,8 +640,6 @@ void SnapuserdTest::SetupImpl() {

    SetDeviceControlName();

    StartSnapuserdDaemon();

    CreateDmUserDevice();
    InitCowDevice();
    InitDaemon();
@@ -669,8 +655,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() {
@@ -684,7 +669,6 @@ void SnapuserdTest::SimulateDaemonRestart() {
    Shutdown();
    std::this_thread::sleep_for(500ms);
    SetDeviceControlName();
    StartSnapuserdDaemon();
    CreateDmUserDevice();
    InitCowDevice();
    InitDaemon();
@@ -844,20 +828,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();
}