From e94fffbacd4fd9ed25cc96d60ea98167131586a6 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 27 Jul 2021 18:58:42 -0700 Subject: [PATCH] snapuserd: Improve EnsureSnapuserdConnected logic. This uses a property to communicate when snapuserd is ready to accept connections, to eliminate some non-determinism from the connect loop. Bug: 193833730 Test: update_engine connects to snapuserd Change-Id: I2fc0063486c3df542db1e60d12564a5bc1581a37 --- fs_mgr/libsnapshot/snapuserd/snapuserd.rc | 3 +++ fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp | 14 ++++++++------ fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp | 8 ++++++++ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc index 02fda8d3d..275009603 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc @@ -14,3 +14,6 @@ service snapuserd_proxy /system/bin/snapuserd -socket-handoff user root group root system seclabel u:r:snapuserd:s0 + +on property:init.svc.snapuserd=stopped + setprop snapuserd.ready false diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp index 81e922845..1ea05a3b0 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp @@ -42,13 +42,15 @@ using namespace std::chrono_literals; using android::base::unique_fd; bool EnsureSnapuserdStarted() { - if (android::base::GetProperty("init.svc.snapuserd", "") == "running") { - return true; + if (android::base::GetProperty("init.svc.snapuserd", "") != "running") { + android::base::SetProperty("ctl.start", "snapuserd"); + if (!android::base::WaitForProperty("init.svc.snapuserd", "running", 10s)) { + LOG(ERROR) << "Timed out waiting for snapuserd to start."; + return false; + } } - - android::base::SetProperty("ctl.start", "snapuserd"); - if (!android::base::WaitForProperty("init.svc.snapuserd", "running", 10s)) { - LOG(ERROR) << "Timed out waiting for snapuserd to start."; + if (!android::base::WaitForProperty("snapuserd.ready", "true", 10s)) { + LOG(ERROR) << "Timed out waiting for snapuserd to be ready."; return false; } return true; diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp index a29b19b5a..672c13c5f 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp @@ -291,6 +291,14 @@ bool SnapuserdServer::StartWithSocket(bool start_listening) { AddWatchedFd(sockfd_, POLLIN); + // If started in first-stage init, the property service won't be online. + if (access("/dev/socket/property_service", F_OK) == 0) { + if (!android::base::SetProperty("snapuserd.ready", "true")) { + LOG(ERROR) << "Failed to set snapuserd.ready property"; + return false; + } + } + LOG(DEBUG) << "Snapuserd server now accepting connections"; return true; }