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

Commit f71cb5ac authored by Varun Shah's avatar Varun Shah Committed by Android (Google) Code Review
Browse files

Merge "Revert "Optimize service restart logic.""

parents 7a4c67ec 4311f21b
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -11244,8 +11244,6 @@ public final class Settings {
         * service_max_inactivity               (long)
         * service_max_inactivity               (long)
         * service_bg_start_timeout             (long)
         * service_bg_start_timeout             (long)
         * process_start_async                  (boolean)
         * process_start_async                  (boolean)
         * use_mem_aware_service_restarts       (boolean)
         * service_restart_delay_duration       (long)
         * </pre>
         * </pre>
         *
         *
         * <p>
         * <p>
+26 −85
Original line number Original line Diff line number Diff line
@@ -82,7 +82,6 @@ import android.util.proto.ProtoOutputStream;
import android.webkit.WebViewZygote;
import android.webkit.WebViewZygote;


import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.app.procstats.ProcessStats;
import com.android.internal.app.procstats.ServiceState;
import com.android.internal.app.procstats.ServiceState;
import com.android.internal.messages.nano.SystemMessageProto;
import com.android.internal.messages.nano.SystemMessageProto;
import com.android.internal.notification.SystemNotificationChannels;
import com.android.internal.notification.SystemNotificationChannels;
@@ -169,8 +168,6 @@ public final class ActiveServices {
    /** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */
    /** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */
    private ArrayList<ServiceRecord> mTmpCollectionResults = null;
    private ArrayList<ServiceRecord> mTmpCollectionResults = null;


    private int mNumServiceRestarts = 0;

    /**
    /**
     * For keeping ActiveForegroundApps retaining state while the screen is off.
     * For keeping ActiveForegroundApps retaining state while the screen is off.
     */
     */
@@ -2330,8 +2327,6 @@ public final class ActiveServices {
                r.restartDelay = mAm.mConstants.BOUND_SERVICE_CRASH_RESTART_DURATION
                r.restartDelay = mAm.mConstants.BOUND_SERVICE_CRASH_RESTART_DURATION
                        * (r.crashCount - 1);
                        * (r.crashCount - 1);
            } else {
            } else {
                mNumServiceRestarts++;
                if (!mAm.mConstants.FLAG_USE_MEM_AWARE_SERVICE_RESTARTS) {
                // If it has been a "reasonably long time" since the service
                // If it has been a "reasonably long time" since the service
                // was started, then reset our restart duration back to
                // was started, then reset our restart duration back to
                // the beginning, so we don't infinitely increase the duration
                // the beginning, so we don't infinitely increase the duration
@@ -2346,42 +2341,27 @@ public final class ActiveServices {
                        r.restartDelay = minDuration;
                        r.restartDelay = minDuration;
                    }
                    }
                }
                }
                } else {
                    // The service will be restarted based on the last known oom_adj value
                    // for the process when it was destroyed. A higher oom_adj value
                    // means that the service will be restarted quicker.
                    // If the service seems to keep crashing, the service restart counter will be
                    // incremented and the restart delay will have an exponential backoff.
                    final int lastOomAdj = r.app == null ? r.lastKnownOomAdj : r.app.setAdj;
                    if (r.restartCount > 1) {
                        r.restartDelay *= mAm.mConstants.SERVICE_RESTART_DURATION_FACTOR;
                        if (r.restartDelay < minDuration) {
                            r.restartDelay = minDuration;
                        }
                    } else {
                        if (lastOomAdj <= ProcessList.VISIBLE_APP_ADJ) {
                            r.restartDelay = 1 * 1000; // 1 second
                        } else if (lastOomAdj <= ProcessList.PERCEPTIBLE_APP_ADJ) {
                            r.restartDelay = 2 * 1000; // 2 seconds
                        } else if (lastOomAdj <= ProcessList.SERVICE_ADJ) {
                            r.restartDelay = 5 * 1000; // 5 seconds
                        } else if (lastOomAdj <= ProcessList.PREVIOUS_APP_ADJ) {
                            r.restartDelay = 10 * 1000; // 10 seconds
                        } else {
                            r.restartDelay = 20 * 1000; // 20 seconds
                        }
                    }
                    // If the last time the service restarted was more than a minute ago,
                    // reset the service restart count, otherwise increment by one.
                    r.restartCount = (now > (r.restartTime + resetTime)) ? 1 : (r.restartCount + 1);
                }
            }
            }


            r.nextRestartTime = now + r.restartDelay;
            r.nextRestartTime = now + r.restartDelay;


            // Make sure that we don't end up restarting a bunch of services
            // Make sure that we don't end up restarting a bunch of services
            // all at the same time.
            // all at the same time.
            ensureSpacedServiceRestarts(r, now);
            boolean repeat;
            do {
                repeat = false;
                final long restartTimeBetween = mAm.mConstants.SERVICE_MIN_RESTART_TIME_BETWEEN;
                for (int i=mRestartingServices.size()-1; i>=0; i--) {
                    ServiceRecord r2 = mRestartingServices.get(i);
                    if (r2 != r && r.nextRestartTime >= (r2.nextRestartTime-restartTimeBetween)
                            && r.nextRestartTime < (r2.nextRestartTime+restartTimeBetween)) {
                        r.nextRestartTime = r2.nextRestartTime + restartTimeBetween;
                        r.restartDelay = r.nextRestartTime - now;
                        repeat = true;
                        break;
                    }
                }
            } while (repeat);


        } else {
        } else {
            // Persistent processes are immediately restarted, so there is no
            // Persistent processes are immediately restarted, so there is no
@@ -2411,24 +2391,6 @@ public final class ActiveServices {
        return canceled;
        return canceled;
    }
    }


    private void ensureSpacedServiceRestarts(ServiceRecord r, long now) {
        boolean repeat;
        do {
            repeat = false;
            final long restartTimeBetween = mAm.mConstants.SERVICE_MIN_RESTART_TIME_BETWEEN;
            for (int i = mRestartingServices.size() - 1; i >= 0; i--) {
                ServiceRecord r2 = mRestartingServices.get(i);
                if (r2 != r && r.nextRestartTime >= (r2.nextRestartTime - restartTimeBetween)
                        && r.nextRestartTime < (r2.nextRestartTime + restartTimeBetween)) {
                    r.nextRestartTime = r2.nextRestartTime + restartTimeBetween;
                    r.restartDelay = r.nextRestartTime - now;
                    repeat = true;
                    break;
                }
            }
        } while (repeat);
    }

    final void performServiceRestartLocked(ServiceRecord r) {
    final void performServiceRestartLocked(ServiceRecord r) {
        if (!mRestartingServices.contains(r)) {
        if (!mRestartingServices.contains(r)) {
            return;
            return;
@@ -2503,26 +2465,6 @@ public final class ActiveServices {
            return null;
            return null;
        }
        }


        // If the service is restarting, check the memory pressure - if it's low or critical, then
        // further delay the restart because it will most likely get killed again; if the pressure
        // is not low or critical, continue restarting.
        if (mAm.mConstants.FLAG_USE_MEM_AWARE_SERVICE_RESTARTS && whileRestarting) {
            final int memLevel = mAm.getMemoryTrimLevel();
            if (memLevel >= ProcessStats.ADJ_MEM_FACTOR_LOW) {
                final long now = SystemClock.uptimeMillis();
                // Delay the restart based on the current memory pressure
                // Default delay duration is 5 seconds
                r.restartDelay = memLevel * mAm.mConstants.SERVICE_RESTART_DELAY_DURATION;
                r.nextRestartTime = now + r.restartDelay;
                ensureSpacedServiceRestarts(r, now);
                mAm.mHandler.removeCallbacks(r.restarter);
                mAm.mHandler.postAtTime(r.restarter, r.nextRestartTime);
                Slog.w(TAG, "Delaying restart of crashed service " + r.shortInstanceName
                        + " in " + r.restartDelay + "ms due to continued memory pressure");
                return null;
            }
        }

        if (DEBUG_SERVICE) {
        if (DEBUG_SERVICE) {
            Slog.v(TAG_SERVICE, "Bringing up " + r + " " + r.intent + " fg=" + r.fgRequired);
            Slog.v(TAG_SERVICE, "Bringing up " + r + " " + r.intent + " fg=" + r.fgRequired);
        }
        }
@@ -3637,7 +3579,6 @@ public final class ActiveServices {
                    || !mAm.mUserController.isUserRunning(sr.userId, 0)) {
                    || !mAm.mUserController.isUserRunning(sr.userId, 0)) {
                bringDownServiceLocked(sr);
                bringDownServiceLocked(sr);
            } else {
            } else {
                sr.lastKnownOomAdj = app.setAdj;
                boolean canceled = scheduleServiceRestartLocked(sr, true);
                boolean canceled = scheduleServiceRestartLocked(sr, true);


                // Should the service remain running?  Note that in the
                // Should the service remain running?  Note that in the
+0 −18
Original line number Original line Diff line number Diff line
@@ -76,8 +76,6 @@ final class ActivityManagerConstants extends ContentObserver {
    static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
    static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2";
    static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
    static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3";
    static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
    static final String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4";
    static final String KEY_USE_MEM_AWARE_SERVICE_RESTARTS = "use_mem_aware_service_restarts";
    static final String KEY_SERVICE_RESTART_DELAY_DURATION = "service_restart_delay_duration";


    private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
    private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
    private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
    private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
@@ -115,8 +113,6 @@ final class ActivityManagerConstants extends ContentObserver {
    public static final long DEFAULT_COMPACT_THROTTLE_2 = 10000;
    public static final long DEFAULT_COMPACT_THROTTLE_2 = 10000;
    public static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
    public static final long DEFAULT_COMPACT_THROTTLE_3 = 500;
    public static final long DEFAULT_COMPACT_THROTTLE_4 = 10000;
    public static final long DEFAULT_COMPACT_THROTTLE_4 = 10000;
    private static final boolean DEFAULT_USE_MEM_AWARE_SERVICE_RESTARTS = true;
    private static final long DEFAULT_SERVICE_RESTART_DELAY_DURATION = 5 * 1000;


    // Maximum number of cached processes we will allow.
    // Maximum number of cached processes we will allow.
    public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
    public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
@@ -253,12 +249,6 @@ final class ActivityManagerConstants extends ContentObserver {
    // How long we'll skip second compactAppFull after first compactAppFull
    // How long we'll skip second compactAppFull after first compactAppFull
    public long COMPACT_THROTTLE_4 = DEFAULT_COMPACT_THROTTLE_4;
    public long COMPACT_THROTTLE_4 = DEFAULT_COMPACT_THROTTLE_4;


    // Use memory aware optimized logic to restart services
    public boolean FLAG_USE_MEM_AWARE_SERVICE_RESTARTS = DEFAULT_USE_MEM_AWARE_SERVICE_RESTARTS;

    // How long a service restart will be delayed by if there is memory pressure
    public long SERVICE_RESTART_DELAY_DURATION = DEFAULT_SERVICE_RESTART_DELAY_DURATION;

    // Indicates whether the activity starts logging is enabled.
    // Indicates whether the activity starts logging is enabled.
    // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED
    // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED
    volatile boolean mFlagActivityStartsLoggingEnabled;
    volatile boolean mFlagActivityStartsLoggingEnabled;
@@ -423,10 +413,6 @@ final class ActivityManagerConstants extends ContentObserver {
            COMPACT_THROTTLE_2 = mParser.getLong(KEY_COMPACT_THROTTLE_2, DEFAULT_COMPACT_THROTTLE_2);
            COMPACT_THROTTLE_2 = mParser.getLong(KEY_COMPACT_THROTTLE_2, DEFAULT_COMPACT_THROTTLE_2);
            COMPACT_THROTTLE_3 = mParser.getLong(KEY_COMPACT_THROTTLE_3, DEFAULT_COMPACT_THROTTLE_3);
            COMPACT_THROTTLE_3 = mParser.getLong(KEY_COMPACT_THROTTLE_3, DEFAULT_COMPACT_THROTTLE_3);
            COMPACT_THROTTLE_4 = mParser.getLong(KEY_COMPACT_THROTTLE_4, DEFAULT_COMPACT_THROTTLE_4);
            COMPACT_THROTTLE_4 = mParser.getLong(KEY_COMPACT_THROTTLE_4, DEFAULT_COMPACT_THROTTLE_4);
            FLAG_USE_MEM_AWARE_SERVICE_RESTARTS = mParser.getBoolean(
                    KEY_USE_MEM_AWARE_SERVICE_RESTARTS, DEFAULT_USE_MEM_AWARE_SERVICE_RESTARTS);
            SERVICE_RESTART_DELAY_DURATION = mParser.getLong(
                    KEY_SERVICE_RESTART_DELAY_DURATION, DEFAULT_SERVICE_RESTART_DELAY_DURATION);


            updateMaxCachedProcesses();
            updateMaxCachedProcesses();
        }
        }
@@ -519,10 +505,6 @@ final class ActivityManagerConstants extends ContentObserver {
        pw.println(TOP_TO_FGS_GRACE_DURATION);
        pw.println(TOP_TO_FGS_GRACE_DURATION);
        pw.print("  "); pw.print(KEY_USE_COMPACTION); pw.print("=");
        pw.print("  "); pw.print(KEY_USE_COMPACTION); pw.print("=");
        pw.println(USE_COMPACTION);
        pw.println(USE_COMPACTION);
        pw.print("  "); pw.print(KEY_USE_MEM_AWARE_SERVICE_RESTARTS); pw.print("=");
        pw.println(FLAG_USE_MEM_AWARE_SERVICE_RESTARTS);
        pw.print("  "); pw.print(KEY_SERVICE_RESTART_DELAY_DURATION); pw.print("=");
        pw.println(SERVICE_RESTART_DELAY_DURATION);


        pw.println();
        pw.println();
        if (mOverrideMaxCachedProcesses >= 0) {
        if (mOverrideMaxCachedProcesses >= 0) {
+7 −8
Original line number Original line Diff line number Diff line
@@ -16,8 +16,10 @@


package com.android.server.am;
package com.android.server.am;


import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import com.android.internal.app.procstats.ServiceState;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.LocalServices;
import com.android.server.notification.NotificationManagerInternal;


import android.app.INotificationManager;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.Notification;
@@ -42,11 +44,6 @@ import android.util.Slog;
import android.util.TimeUtils;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
import android.util.proto.ProtoUtils;

import com.android.internal.app.procstats.ServiceState;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.LocalServices;
import com.android.server.notification.NotificationManagerInternal;
import com.android.server.uri.NeededUriGrants;
import com.android.server.uri.NeededUriGrants;
import com.android.server.uri.UriPermissionOwner;
import com.android.server.uri.UriPermissionOwner;


@@ -55,6 +52,9 @@ import java.util.ArrayList;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.Objects;


import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;

/**
/**
 * A running application service.
 * A running application service.
 */
 */
@@ -114,7 +114,6 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN
    long executingStart;    // start time of last execute request.
    long executingStart;    // start time of last execute request.
    boolean createdFromFg;  // was this service last created due to a foreground process call?
    boolean createdFromFg;  // was this service last created due to a foreground process call?
    int crashCount;         // number of times proc has crashed with service running
    int crashCount;         // number of times proc has crashed with service running
    int lastKnownOomAdj;    // last known OOM adjustment for process (used if ProcessRecord is null)
    int totalRestartCount;  // number of times we have had to restart.
    int totalRestartCount;  // number of times we have had to restart.
    int restartCount;       // number of restarts performed in a row.
    int restartCount;       // number of restarts performed in a row.
    long restartDelay;      // delay until next restart attempt.
    long restartDelay;      // delay until next restart attempt.