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

Commit 255fac42 authored by Akilesh Kailash's avatar Akilesh Kailash Committed by Automerger Merge Worker
Browse files

Merge "Revert "init: Add diagnostics for snapuserd hangs"" am: d3f26720 am: 0ad04b07

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1960300

Change-Id: I3a54b30f4ddfcd31107011f7065cfb7fbdbf97d5
parents 522182df 0ad04b07
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -223,8 +223,6 @@ void Daemon::SignalHandler(int signal) {
int main(int argc, char** argv) {
    android::base::InitLogging(argv, &android::base::KernelLogger);

    LOG(INFO) << "snapuserd daemon about to start";

    android::snapshot::Daemon& daemon = android::snapshot::Daemon::Instance();

    if (!daemon.StartDaemon(argc, argv)) {
+0 −83
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <sys/_system_properties.h>

#include <filesystem>
#include <functional>
#include <map>
#include <memory>
@@ -47,7 +46,6 @@
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include <android-base/properties.h>
#include <android-base/scopeguard.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <backtrace/Backtrace.h>
@@ -776,82 +774,6 @@ static Result<void> ConnectEarlyStageSnapuserdAction(const BuiltinArguments& arg
    return {};
}

static bool SystemReadSmokeTest() {
    std::string dev = "/dev/block/mapper/system"s + fs_mgr_get_slot_suffix();
    android::base::unique_fd fd(open(dev.c_str(), O_RDONLY));
    if (fd < 0) {
        PLOG(ERROR) << "open " << dev << " failed, will not diangose snapuserd hangs";
        return false;
    }

    for (size_t i = 1; i <= 100; i++) {
        // Skip around the partition a bit.
        size_t offset = i * 4096 * 512;

        char b;
        ssize_t n = TEMP_FAILURE_RETRY(pread(fd.get(), &b, 1, offset));
        if (n < 0) {
            PLOG(ERROR) << "snapuserd smoke test read failed";
            return false;
        }
    }
    return true;
}

static void DiagnoseSnapuserdHang(pid_t pid) {
    bool succeeded = false;

    std::mutex m;
    std::condition_variable cv;

    // Enforce an ordering between this and the thread startup, by taking the
    // lock before we lanuch the thread.
    std::unique_lock<std::mutex> cv_lock(m);

    std::thread t([&]() -> void {
        std::lock_guard<std::mutex> lock(m);
        succeeded = SystemReadSmokeTest();
        cv.notify_all();
    });

    auto join = android::base::make_scope_guard([&]() -> void {
        // If the smoke test is hung, then this will too. We expect the device to
        // automatically reboot once the watchdog kicks in.
        t.join();
    });

    auto now = std::chrono::system_clock::now();
    auto deadline = now + 10s;
    auto status = cv.wait_until(cv_lock, deadline);
    if (status == std::cv_status::timeout) {
        LOG(ERROR) << "snapuserd smoke test timed out";
    } else if (!succeeded) {
        LOG(ERROR) << "snapuserd smoke test failed";
    }

    if (succeeded) {
        LOG(INFO) << "snapuserd smoke test succeeded";
        return;
    }

    while (true) {
        LOG(ERROR) << "snapuserd problem detected, printing open fds";

        std::error_code ec;
        std::string proc_dir = "/proc/" + std::to_string(pid) + "/fd";
        for (const auto& entry : std::filesystem::directory_iterator(proc_dir)) {
            std::string target;
            if (android::base::Readlink(entry.path(), &target)) {
                LOG(ERROR) << "snapuserd opened: " << target;
            } else {
                LOG(ERROR) << "snapuserd opened: " << entry.path();
            }
        }

        std::this_thread::sleep_for(10s);
    }
}

int SecondStageMain(int argc, char** argv) {
    if (REBOOT_BOOTLOADER_ON_PANIC) {
        InstallRebootSignalHandlers();
@@ -865,11 +787,6 @@ int SecondStageMain(int argc, char** argv) {
    InitKernelLogging(argv);
    LOG(INFO) << "init second stage started!";

    if (auto pid = GetSnapuserdFirstStagePid()) {
        std::thread t(DiagnoseSnapuserdHang, *pid);
        t.detach();
    }

    // Update $PATH in the case the second stage init is newer than first stage init, where it is
    // first set.
    if (setenv("PATH", _PATH_DEFPATH, 1) != 0) {