Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80cc912e authored by Zimuzo's avatar Zimuzo Committed by Elliott Hughes
Browse files

Attempt native rollback for frequent crashes before boot completed

Before, if updatable processes crash 4 times in 4mins, a native
rollback will be attempted. This behavior does not detect
system_server early boot deadlocks because the system server requires
at least a min to detect a deadlock, and crash itself. The crashes
don't happen frequently enough for init to detect.

After, this cl, the old behavior exists and additionally, init detects
*any* 4 crashes of updatable processes before boot completed,
regardless of if they happen within 4mins or not.

Test: Manually tested by adding artificial sleep in system_server so
deadlock is triggered before boot. system_server crashes 4 times in
over 4mins and the ro.init.updatable_crashing prop is set to 1.
Bug: 129597207
Merged-In: Ie6fb5693ff4be105bcbe139c22850fb076e40260
Change-Id:  Ie6fb5693ff4be105bcbe139c22850fb076e40260
parent 4b7e7d7a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ runs the service.

`critical`
> This is a device-critical service. If it exits more than four times in
  four minutes, the device will reboot into bootloader.
  four minutes or before boot completes, the device will reboot into bootloader.

`disabled`
> This service will not automatically start with its class.
+8 −4
Original line number Diff line number Diff line
@@ -372,16 +372,20 @@ void Service::Reap(const siginfo_t& siginfo) {
        return;
    }

    // If we crash > 4 times in 4 minutes, reboot into bootloader or set crashing property
    // If we crash > 4 times in 4 minutes or before boot_completed,
    // reboot into bootloader or set crashing property
    boot_clock::time_point now = boot_clock::now();
    if (((flags_ & SVC_CRITICAL) || !pre_apexd_) && !(flags_ & SVC_RESTART)) {
        if (now < time_crashed_ + 4min) {
        bool boot_completed = android::base::GetBoolProperty("sys.boot_completed", false);
        if (now < time_crashed_ + 4min || !boot_completed) {
            if (++crash_count_ > 4) {
                if (flags_ & SVC_CRITICAL) {
                    // Aborts into bootloader
                    LOG(FATAL) << "critical process '" << name_ << "' exited 4 times in 4 minutes";
                    LOG(FATAL) << "critical process '" << name_ << "' exited 4 times "
                               << (boot_completed ? "in 4 minutes" : "before boot completed");
                } else {
                    LOG(ERROR) << "updatable process '" << name_ << "' exited 4 times in 4 minutes";
                    LOG(ERROR) << "updatable process '" << name_ << "' exited 4 times "
                               << (boot_completed ? "in 4 minutes" : "before boot completed");
                    // Notifies update_verifier and apexd
                    property_set("ro.init.updatable_crashing", "1");
                }