Merge "If userspace reboot watchdog triggers, don't store reason in persistent property"

This commit is contained in:
Nikita Ioffe 2020-02-27 23:01:53 +00:00 committed by Gerrit Code Review
commit 18a65319fd

View file

@ -96,8 +96,10 @@ static std::vector<Service*> GetDebuggingServices(bool only_post_data) REQUIRES(
return ret;
}
static void PersistRebootReason(const char* reason) {
SetProperty(LAST_REBOOT_REASON_PROPERTY, reason);
static void PersistRebootReason(const char* reason, bool write_to_property) {
if (write_to_property) {
SetProperty(LAST_REBOOT_REASON_PROPERTY, reason);
}
WriteStringToFile(reason, LAST_REBOOT_REASON_FILE);
}
@ -535,14 +537,6 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str
Timer t;
LOG(INFO) << "Reboot start, reason: " << reason << ", reboot_target: " << reboot_target;
// If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to
// worry about unmounting it.
if (!IsDataMounted()) {
sync();
RebootSystem(cmd, reboot_target);
abort();
}
// Ensure last reboot reason is reduced to canonical
// alias reported in bootloader or system boot reason.
size_t skip = 0;
@ -552,9 +546,17 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str
reasons[1] == "hard" || reasons[1] == "warm")) {
skip = strlen("reboot,");
}
PersistRebootReason(reason.c_str() + skip);
PersistRebootReason(reason.c_str() + skip, true);
sync();
// If /data isn't mounted then we can skip the extra reboot steps below, since we don't need to
// worry about unmounting it.
if (!IsDataMounted()) {
sync();
RebootSystem(cmd, reboot_target);
abort();
}
bool is_thermal_shutdown = cmd == ANDROID_RB_THERMOFF;
auto shutdown_timeout = 0ms;
@ -836,7 +838,8 @@ static void UserspaceRebootWatchdogThread() {
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.
PersistRebootReason("userspace_failed,watchdog_triggered");
// Since init might be wedged, don't try to write reboot reason into a persistent property.
PersistRebootReason("userspace_failed,watchdog_triggered", false);
RebootSystem(ANDROID_RB_RESTART2, "userspace_failed,watchdog_triggered");
}
LOG(INFO) << "Device booted, stopping userspace reboot watchdog";