Merge "Use properties for various userspace reboot timeouts"
This commit is contained in:
commit
fc51af215b
2 changed files with 26 additions and 10 deletions
|
@ -96,6 +96,7 @@
|
|||
|
||||
using android::base::Basename;
|
||||
using android::base::GetBoolProperty;
|
||||
using android::base::GetUintProperty;
|
||||
using android::base::Readlink;
|
||||
using android::base::Realpath;
|
||||
using android::base::SetProperty;
|
||||
|
@ -1545,11 +1546,16 @@ int fs_mgr_umount_all(android::fs_mgr::Fstab* fstab) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static std::chrono::milliseconds GetMillisProperty(const std::string& name,
|
||||
std::chrono::milliseconds default_value) {
|
||||
auto value = GetUintProperty(name, static_cast<uint64_t>(default_value.count()));
|
||||
return std::chrono::milliseconds(std::move(value));
|
||||
}
|
||||
|
||||
static bool fs_mgr_unmount_all_data_mounts(const std::string& block_device) {
|
||||
LINFO << __FUNCTION__ << "(): about to umount everything on top of " << block_device;
|
||||
Timer t;
|
||||
// TODO(b/135984674): should be configured via a read-only property.
|
||||
std::chrono::milliseconds timeout = 5s;
|
||||
auto timeout = GetMillisProperty("init.userspace_reboot.userdata_remount.timeoutmillis", 5s);
|
||||
while (true) {
|
||||
bool umount_done = true;
|
||||
Fstab proc_mounts;
|
||||
|
|
|
@ -72,6 +72,7 @@ using namespace std::literals;
|
|||
|
||||
using android::base::boot_clock;
|
||||
using android::base::GetBoolProperty;
|
||||
using android::base::GetUintProperty;
|
||||
using android::base::SetProperty;
|
||||
using android::base::Split;
|
||||
using android::base::Timer;
|
||||
|
@ -732,6 +733,12 @@ static Result<void> UnmountAllApexes() {
|
|||
return Error() << "'/system/bin/apexd --unmount-all' failed : " << status;
|
||||
}
|
||||
|
||||
static std::chrono::milliseconds GetMillisProperty(const std::string& name,
|
||||
std::chrono::milliseconds default_value) {
|
||||
auto value = GetUintProperty(name, static_cast<uint64_t>(default_value.count()));
|
||||
return std::chrono::milliseconds(std::move(value));
|
||||
}
|
||||
|
||||
static Result<void> DoUserspaceReboot() {
|
||||
LOG(INFO) << "Userspace reboot initiated";
|
||||
auto guard = android::base::make_scope_guard([] {
|
||||
|
@ -769,10 +776,13 @@ static Result<void> DoUserspaceReboot() {
|
|||
sync();
|
||||
LOG(INFO) << "sync() took " << sync_timer;
|
||||
}
|
||||
// TODO(b/135984674): do we need shutdown animation for userspace reboot?
|
||||
// TODO(b/135984674): control userspace timeout via read-only property?
|
||||
StopServicesAndLogViolations(stop_first, 10s, true /* SIGTERM */);
|
||||
if (int r = StopServicesAndLogViolations(stop_first, 20s, false /* SIGKILL */); r > 0) {
|
||||
auto sigterm_timeout = GetMillisProperty("init.userspace_reboot.sigterm.timeoutmillis", 5s);
|
||||
auto sigkill_timeout = GetMillisProperty("init.userspace_reboot.sigkill.timeoutmillis", 10s);
|
||||
LOG(INFO) << "Timeout to terminate services : " << sigterm_timeout.count() << "ms"
|
||||
<< "Timeout to kill services: " << sigkill_timeout.count() << "ms";
|
||||
StopServicesAndLogViolations(stop_first, sigterm_timeout, true /* SIGTERM */);
|
||||
if (int r = StopServicesAndLogViolations(stop_first, sigkill_timeout, false /* SIGKILL */);
|
||||
r > 0) {
|
||||
// TODO(b/135984674): store information about offending services for debugging.
|
||||
return Error() << r << " post-data services are still running";
|
||||
}
|
||||
|
@ -782,8 +792,8 @@ static Result<void> DoUserspaceReboot() {
|
|||
if (auto result = CallVdc("volume", "reset"); !result.ok()) {
|
||||
return result;
|
||||
}
|
||||
if (int r = StopServicesAndLogViolations(GetDebuggingServices(true /* only_post_data */), 5s,
|
||||
false /* SIGKILL */);
|
||||
if (int r = StopServicesAndLogViolations(GetDebuggingServices(true /* only_post_data */),
|
||||
sigkill_timeout, false /* SIGKILL */);
|
||||
r > 0) {
|
||||
// TODO(b/135984674): store information about offending services for debugging.
|
||||
return Error() << r << " debugging services are still running";
|
||||
|
@ -827,8 +837,8 @@ static void UserspaceRebootWatchdogThread() {
|
|||
return;
|
||||
}
|
||||
LOG(INFO) << "Starting userspace reboot watchdog";
|
||||
// TODO(b/135984674): this should be configured via a read-only sysprop.
|
||||
std::chrono::milliseconds timeout = 60s;
|
||||
auto timeout = GetMillisProperty("init.userspace_reboot.watchdog.timeoutmillis", 5min);
|
||||
LOG(INFO) << "UserspaceRebootWatchdog timeout: " << timeout.count() << "ms";
|
||||
if (!WaitForProperty("sys.boot_completed", "1", timeout)) {
|
||||
LOG(ERROR) << "Failed to boot in " << timeout.count() << "ms. Switching to full reboot";
|
||||
// In this case device is in a boot loop. Only way to recover is to do dirty reboot.
|
||||
|
|
Loading…
Reference in a new issue