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
diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc
index 02fda8d..2750096 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd.rc
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd.rc
@@ -14,3 +14,6 @@
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 81e9228..1ea05a3 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp
@@ -42,13 +42,15 @@
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 a29b19b..672c13c 100644
--- a/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp
+++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_server.cpp
@@ -291,6 +291,14 @@
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;
}