diff --git a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h index fb2251e2e..010beb3f2 100644 --- a/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h +++ b/fs_mgr/libsnapshot/snapuserd/include/snapuserd/snapuserd_client.h @@ -47,6 +47,8 @@ class SnapuserdClient { bool ValidateConnection(); std::string GetDaemonAliveIndicatorPath(); + void WaitForServiceToTerminate(std::chrono::milliseconds timeout_ms); + public: explicit SnapuserdClient(android::base::unique_fd&& sockfd); SnapuserdClient(){}; diff --git a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp index 695b5817f..3bed3a4a4 100644 --- a/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp +++ b/fs_mgr/libsnapshot/snapuserd/snapuserd_client.cpp @@ -94,6 +94,21 @@ std::unique_ptr SnapuserdClient::Connect(const std::string& soc return client; } +void SnapuserdClient::WaitForServiceToTerminate(std::chrono::milliseconds timeout_ms) { + auto start = std::chrono::steady_clock::now(); + while (android::base::GetProperty("init.svc.snapuserd", "") == "running") { + auto now = std::chrono::steady_clock::now(); + auto elapsed = std::chrono::duration_cast(now - start); + if (elapsed >= timeout_ms) { + LOG(ERROR) << "Timed out - Snapuserd service did not stop - Forcefully terminating the " + "service"; + android::base::SetProperty("ctl.stop", "snapuserd"); + return; + } + std::this_thread::sleep_for(100ms); + } +} + bool SnapuserdClient::ValidateConnection() { if (!Sendmsg("query")) { return false; @@ -238,6 +253,8 @@ bool SnapuserdClient::DetachSnapuserd() { LOG(ERROR) << "Failed to detach snapuserd."; return false; } + + WaitForServiceToTerminate(3s); return true; }