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

Commit dfb85538 authored by Kweku Adams's avatar Kweku Adams Committed by Android (Google) Code Review
Browse files

Merge "Dump most recent constraint changes per job." into sc-dev

parents bfe45b77 27e5995e
Loading
Loading
Loading
Loading
+26 −16
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.job.controllers;

import static com.android.server.job.JobSchedulerService.NEVER_INDEX;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;

import android.os.SystemClock;
import android.os.UserHandle;
@@ -59,6 +60,8 @@ public final class BackgroundJobsController extends StateController {

    private final AppStateTrackerImpl mAppStateTracker;

    private final UpdateJobFunctor mUpdateJobFunctor = new UpdateJobFunctor();

    public BackgroundJobsController(JobSchedulerService service) {
        super(service);

@@ -69,7 +72,7 @@ public final class BackgroundJobsController extends StateController {

    @Override
    public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
        updateSingleJobRestrictionLocked(jobStatus, UNKNOWN);
        updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN);
    }

    @Override
@@ -79,7 +82,7 @@ public final class BackgroundJobsController extends StateController {

    @Override
    public void evaluateStateLocked(JobStatus jobStatus) {
        updateSingleJobRestrictionLocked(jobStatus, UNKNOWN);
        updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN);
    }

    @Override
@@ -163,33 +166,34 @@ public final class BackgroundJobsController extends StateController {
    }

    private void updateJobRestrictionsLocked(int filterUid, int newActiveState) {
        final UpdateJobFunctor updateTrackedJobs = new UpdateJobFunctor(newActiveState);
        mUpdateJobFunctor.prepare(newActiveState);

        final long start = DEBUG ? SystemClock.elapsedRealtimeNanos() : 0;

        final JobStore store = mService.getJobStore();
        if (filterUid > 0) {
            store.forEachJobForSourceUid(filterUid, updateTrackedJobs);
            store.forEachJobForSourceUid(filterUid, mUpdateJobFunctor);
        } else {
            store.forEachJob(updateTrackedJobs);
            store.forEachJob(mUpdateJobFunctor);
        }

        final long time = DEBUG ? (SystemClock.elapsedRealtimeNanos() - start) : 0;
        if (DEBUG) {
            Slog.d(TAG, String.format(
                    "Job status updated: %d/%d checked/total jobs, %d us",
                    updateTrackedJobs.mCheckedCount,
                    updateTrackedJobs.mTotalCount,
                    mUpdateJobFunctor.mCheckedCount,
                    mUpdateJobFunctor.mTotalCount,
                    (time / 1000)
            ));
        }

        if (updateTrackedJobs.mChanged) {
        if (mUpdateJobFunctor.mChanged) {
            mStateChangedListener.onControllerStateChanged();
        }
    }

    boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, int activeState) {
    boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, final long nowElapsed,
            int activeState) {
        final int uid = jobStatus.getSourceUid();
        final String packageName = jobStatus.getSourcePackageName();

@@ -205,26 +209,32 @@ public final class BackgroundJobsController extends StateController {
        if (isActive && jobStatus.getStandbyBucket() == NEVER_INDEX) {
            jobStatus.maybeLogBucketMismatch();
        }
        boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun);
        boolean didChange =
                jobStatus.setBackgroundNotRestrictedConstraintSatisfied(nowElapsed, canRun);
        didChange |= jobStatus.setUidActive(isActive);
        return didChange;
    }

    private final class UpdateJobFunctor implements Consumer<JobStatus> {
        final int activeState;
        int mActiveState;
        boolean mChanged = false;
        int mTotalCount = 0;
        int mCheckedCount = 0;

        public UpdateJobFunctor(int newActiveState) {
            activeState = newActiveState;
        long mUpdateTimeElapsed = 0;

        void prepare(int newActiveState) {
            mActiveState = newActiveState;
            mUpdateTimeElapsed = sElapsedRealtimeClock.millis();
            mChanged = false;
            mTotalCount = 0;
            mCheckedCount = 0;
        }

        @Override
        public void accept(JobStatus jobStatus) {
            mTotalCount++;
            mCheckedCount++;
            if (updateSingleJobRestrictionLocked(jobStatus, activeState)) {
            if (updateSingleJobRestrictionLocked(jobStatus, mUpdateTimeElapsed, mActiveState)) {
                mChanged = true;
            }
        }
+7 −4
Original line number Diff line number Diff line
@@ -65,10 +65,12 @@ public final class BatteryController extends RestrictingController {
    @Override
    public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) {
        if (taskStatus.hasPowerConstraint()) {
            final long nowElapsed = sElapsedRealtimeClock.millis();
            mTrackedTasks.add(taskStatus);
            taskStatus.setTrackingController(JobStatus.TRACKING_BATTERY);
            taskStatus.setChargingConstraintSatisfied(mChargeTracker.isOnStablePower());
            taskStatus.setBatteryNotLowConstraintSatisfied(mChargeTracker.isBatteryNotLow());
            taskStatus.setChargingConstraintSatisfied(nowElapsed, mChargeTracker.isOnStablePower());
            taskStatus.setBatteryNotLowConstraintSatisfied(
                    nowElapsed, mChargeTracker.isBatteryNotLow());
        }
    }

@@ -97,14 +99,15 @@ public final class BatteryController extends RestrictingController {
        if (DEBUG) {
            Slog.d(TAG, "maybeReportNewChargingStateLocked: " + stablePower);
        }
        final long nowElapsed = sElapsedRealtimeClock.millis();
        boolean reportChange = false;
        for (int i = mTrackedTasks.size() - 1; i >= 0; i--) {
            final JobStatus ts = mTrackedTasks.valueAt(i);
            boolean previous = ts.setChargingConstraintSatisfied(stablePower);
            boolean previous = ts.setChargingConstraintSatisfied(nowElapsed, stablePower);
            if (previous != stablePower) {
                reportChange = true;
            }
            previous = ts.setBatteryNotLowConstraintSatisfied(batteryNotLow);
            previous = ts.setBatteryNotLowConstraintSatisfied(nowElapsed, batteryNotLow);
            if (previous != batteryNotLow) {
                reportChange = true;
            }
+8 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED;
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;

import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;

import android.annotation.Nullable;
import android.app.job.JobInfo;
@@ -461,11 +462,12 @@ public final class ConnectivityController extends RestrictingController implemen
        final Network network = mConnManager.getActiveNetworkForUid(
                jobStatus.getSourceUid(), jobStatus.shouldIgnoreNetworkBlocking());
        final NetworkCapabilities capabilities = getNetworkCapabilities(network);
        return updateConstraintsSatisfied(jobStatus, network, capabilities);
        return updateConstraintsSatisfied(jobStatus, sElapsedRealtimeClock.millis(),
                network, capabilities);
    }

    private boolean updateConstraintsSatisfied(JobStatus jobStatus, Network network,
            NetworkCapabilities capabilities) {
    private boolean updateConstraintsSatisfied(JobStatus jobStatus, final long nowElapsed,
            Network network, NetworkCapabilities capabilities) {
        // TODO: consider matching against non-active networks

        final boolean ignoreBlocked = jobStatus.shouldIgnoreNetworkBlocking();
@@ -476,7 +478,7 @@ public final class ConnectivityController extends RestrictingController implemen
        final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants);

        final boolean changed = jobStatus
                .setConnectivityConstraintSatisfied(connected && satisfied);
                .setConnectivityConstraintSatisfied(nowElapsed, connected && satisfied);

        // Pass along the evaluated network for job to use; prevents race
        // conditions as default routes change over time, and opens the door to
@@ -530,6 +532,7 @@ public final class ConnectivityController extends RestrictingController implemen
        NetworkCapabilities exemptedNetworkCapabilities = null;
        boolean exemptedNetworkMatch = false;

        final long nowElapsed = sElapsedRealtimeClock.millis();
        boolean changed = false;
        for (int i = jobs.size() - 1; i >= 0; i--) {
            final JobStatus js = jobs.valueAt(i);
@@ -555,7 +558,7 @@ public final class ConnectivityController extends RestrictingController implemen
            // job hasn't yet been evaluated against the currently
            // active network; typically when we just lost a network.
            if (match || !Objects.equals(js.network, net)) {
                changed |= updateConstraintsSatisfied(js, net, netCap);
                changed |= updateConstraintsSatisfied(js, nowElapsed, net, netCap);
            }
        }
        return changed;
+6 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.job.controllers;

import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;

import android.annotation.UserIdInt;
import android.app.job.JobInfo;
import android.database.ContentObserver;
@@ -74,6 +76,7 @@ public final class ContentObserverController extends StateController {
    @Override
    public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) {
        if (taskStatus.hasContentTriggerConstraint()) {
            final long nowElapsed = sElapsedRealtimeClock.millis();
            if (taskStatus.contentObserverJobInstance == null) {
                taskStatus.contentObserverJobInstance = new JobInstance(taskStatus);
            }
@@ -110,7 +113,7 @@ public final class ContentObserverController extends StateController {
            }
            taskStatus.changedAuthorities = null;
            taskStatus.changedUris = null;
            taskStatus.setContentTriggerConstraintSatisfied(havePendingUris);
            taskStatus.setContentTriggerConstraintSatisfied(nowElapsed, havePendingUris);
        }
        if (lastJob != null && lastJob.contentObserverJobInstance != null) {
            // And now we can detach the instance state from the last job.
@@ -295,7 +298,8 @@ public final class ContentObserverController extends StateController {
            boolean reportChange = false;
            synchronized (mLock) {
                if (mTriggerPending) {
                    if (mJobStatus.setContentTriggerConstraintSatisfied(true)) {
                    final long nowElapsed = sElapsedRealtimeClock.millis();
                    if (mJobStatus.setContentTriggerConstraintSatisfied(nowElapsed, true)) {
                        reportChange = true;
                    }
                    unscheduleLocked();
+18 −7
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.server.job.controllers;

import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;

import android.app.job.JobInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -104,8 +106,10 @@ public final class DeviceIdleJobsController extends StateController {
                                    + Arrays.toString(mPowerSaveTempWhitelistAppIds));
                        }
                        boolean changed = false;
                        final long nowElapsed = sElapsedRealtimeClock.millis();
                        for (int i = 0; i < mAllowInIdleJobs.size(); i++) {
                            changed |= updateTaskStateLocked(mAllowInIdleJobs.valueAt(i));
                            changed |=
                                    updateTaskStateLocked(mAllowInIdleJobs.valueAt(i), nowElapsed);
                        }
                        if (changed) {
                            mStateChangedListener.onControllerStateChanged();
@@ -147,6 +151,7 @@ public final class DeviceIdleJobsController extends StateController {
            }
            mDeviceIdleMode = enabled;
            if (DEBUG) Slog.d(TAG, "mDeviceIdleMode=" + mDeviceIdleMode);
            mDeviceIdleUpdateFunctor.prepare();
            if (enabled) {
                mHandler.removeMessages(PROCESS_BACKGROUND_JOBS);
                mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
@@ -180,7 +185,7 @@ public final class DeviceIdleJobsController extends StateController {
            Slog.d(TAG, "uid " + uid + " going " + (active ? "active" : "inactive"));
        }
        mForegroundUids.put(uid, active);
        mDeviceIdleUpdateFunctor.mChanged = false;
        mDeviceIdleUpdateFunctor.prepare();
        mService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor);
        if (mDeviceIdleUpdateFunctor.mChanged) {
            mStateChangedListener.onControllerStateChanged();
@@ -203,12 +208,12 @@ public final class DeviceIdleJobsController extends StateController {
                UserHandle.getAppId(job.getSourceUid()));
    }

    private boolean updateTaskStateLocked(JobStatus task) {
    private boolean updateTaskStateLocked(JobStatus task, final long nowElapsed) {
        final boolean allowInIdle = ((task.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0)
                && (mForegroundUids.get(task.getSourceUid()) || isTempWhitelistedLocked(task));
        final boolean whitelisted = isWhitelistedLocked(task);
        final boolean enableTask = !mDeviceIdleMode || whitelisted || allowInIdle;
        return task.setDeviceNotDozingConstraintSatisfied(enableTask, whitelisted);
        return task.setDeviceNotDozingConstraintSatisfied(nowElapsed, enableTask, whitelisted);
    }

    @Override
@@ -216,7 +221,7 @@ public final class DeviceIdleJobsController extends StateController {
        if ((jobStatus.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0) {
            mAllowInIdleJobs.add(jobStatus);
        }
        updateTaskStateLocked(jobStatus);
        updateTaskStateLocked(jobStatus, sElapsedRealtimeClock.millis());
    }

    @Override
@@ -282,10 +287,16 @@ public final class DeviceIdleJobsController extends StateController {

    final class DeviceIdleUpdateFunctor implements Consumer<JobStatus> {
        boolean mChanged;
        long mUpdateTimeElapsed = 0;

        void prepare() {
            mChanged = false;
            mUpdateTimeElapsed = sElapsedRealtimeClock.millis();
        }

        @Override
        public void accept(JobStatus jobStatus) {
            mChanged |= updateTaskStateLocked(jobStatus);
            mChanged |= updateTaskStateLocked(jobStatus, mUpdateTimeElapsed);
        }
    }

@@ -300,7 +311,7 @@ public final class DeviceIdleJobsController extends StateController {
                case PROCESS_BACKGROUND_JOBS:
                    // Just process all the jobs, the ones in foreground should already be running.
                    synchronized (mLock) {
                        mDeviceIdleUpdateFunctor.mChanged = false;
                        mDeviceIdleUpdateFunctor.prepare();
                        mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
                        if (mDeviceIdleUpdateFunctor.mChanged) {
                            mStateChangedListener.onControllerStateChanged();
Loading