Merge "Add init.svc_debug.no_fatal.<svc_name> to skip SVC_CRITICAL"

This commit is contained in:
Woody Lin 2021-01-23 00:34:06 +00:00 committed by Gerrit Code Review
commit 81bf17ce0f
2 changed files with 10 additions and 5 deletions

View File

@ -178,6 +178,8 @@ runs the service.
will reboot into _fatal reboot target_. will reboot into _fatal reboot target_.
The default value of _fatal crash window mins_ is 4, and default value The default value of _fatal crash window mins_ is 4, and default value
of _fatal reboot target_ is 'bootloader'. of _fatal reboot target_ is 'bootloader'.
For tests, the fatal reboot can be skipped by setting property
`init.svc_debug.no_fatal.<service-name>` to `true` for specified critical service.
`disabled` `disabled`
> This service will not automatically start with its class. > This service will not automatically start with its class.

View File

@ -52,6 +52,7 @@
#endif #endif
using android::base::boot_clock; using android::base::boot_clock;
using android::base::GetBoolProperty;
using android::base::GetProperty; using android::base::GetProperty;
using android::base::Join; using android::base::Join;
using android::base::make_scope_guard; using android::base::make_scope_guard;
@ -318,17 +319,19 @@ void Service::Reap(const siginfo_t& siginfo) {
// reboot into bootloader or set crashing property // reboot into bootloader or set crashing property
boot_clock::time_point now = boot_clock::now(); boot_clock::time_point now = boot_clock::now();
if (((flags_ & SVC_CRITICAL) || is_process_updatable) && !(flags_ & SVC_RESTART)) { if (((flags_ & SVC_CRITICAL) || is_process_updatable) && !(flags_ & SVC_RESTART)) {
bool boot_completed = android::base::GetBoolProperty("sys.boot_completed", false); bool boot_completed = GetBoolProperty("sys.boot_completed", false);
if (now < time_crashed_ + fatal_crash_window_ || !boot_completed) { if (now < time_crashed_ + fatal_crash_window_ || !boot_completed) {
if (++crash_count_ > 4) { if (++crash_count_ > 4) {
auto exit_reason = boot_completed ? auto exit_reason = boot_completed ?
"in " + std::to_string(fatal_crash_window_.count()) + " minutes" : "in " + std::to_string(fatal_crash_window_.count()) + " minutes" :
"before boot completed"; "before boot completed";
if (flags_ & SVC_CRITICAL) { if (flags_ & SVC_CRITICAL) {
// Aborts into `fatal_reboot_target_'. if (!GetBoolProperty("init.svc_debug.no_fatal." + name_, false)) {
SetFatalRebootTarget(fatal_reboot_target_); // Aborts into `fatal_reboot_target_'.
LOG(FATAL) << "critical process '" << name_ << "' exited 4 times " SetFatalRebootTarget(fatal_reboot_target_);
<< exit_reason; LOG(FATAL) << "critical process '" << name_ << "' exited 4 times "
<< exit_reason;
}
} else { } else {
LOG(ERROR) << "process with updatable components '" << name_ LOG(ERROR) << "process with updatable components '" << name_
<< "' exited 4 times " << exit_reason; << "' exited 4 times " << exit_reason;