Correctly check expired jobs against active ones

If a job was run before its deadline, and then the deadline landed
while the job was still running, b/c of the 'deadline trumps all'
it would be considered eligible to run again as soon as the previous
iteration completed.

Fix this by checking against the state of the active queue.

Bug 36253320
Test: CTS: job scheduler TimingConstraintsTest

Change-Id: I4f0c1012091bf88776cfe725d7b59f6dcf602c02
This commit is contained in:
Christopher Tate
2017-03-15 12:01:22 -07:00
parent fe12209334
commit b1d6448ec4

View File

@@ -1106,8 +1106,7 @@ public final class JobSchedulerService extends com.android.server.SystemService
JobStatus runNow = (JobStatus) message.obj;
// runNow can be null, which is a controller's way of indicating that its
// state is such that all ready jobs should be run immediately.
if (runNow != null && !mPendingJobs.contains(runNow)
&& mJobs.containsJob(runNow)) {
if (runNow != null && isReadyToBeExecutedLocked(runNow)) {
mJobPackageTracker.notePending(runNow);
mPendingJobs.add(runNow);
}
@@ -1310,12 +1309,27 @@ public final class JobSchedulerService extends com.android.server.SystemService
* - The component is enabled and runnable.
*/
private boolean isReadyToBeExecutedLocked(JobStatus job) {
final boolean jobExists = mJobs.containsJob(job);
final boolean jobReady = job.isReady();
final boolean jobPending = mPendingJobs.contains(job);
final boolean jobActive = isCurrentlyActiveLocked(job);
final int userId = job.getUserId();
final boolean userStarted = ArrayUtils.contains(mStartedUsers, userId);
if (DEBUG) {
Slog.v(TAG, "isReadyToBeExecutedLocked: " + job.toShortString()
+ " exists=" + jobExists
+ " ready=" + jobReady + " pending=" + jobPending
+ " active=" + jobActive + " userStarted=" + userStarted);
}
// Short circuit: don't do the expensive PM check unless we really think
// we might need to run this job now.
if (!jobExists || !userStarted || !jobReady || jobPending || jobActive) {
return false;
}
final boolean componentPresent;
try {
componentPresent = (AppGlobals.getPackageManager().getServiceInfo(
@@ -1327,11 +1341,11 @@ public final class JobSchedulerService extends com.android.server.SystemService
if (DEBUG) {
Slog.v(TAG, "isReadyToBeExecutedLocked: " + job.toShortString()
+ " ready=" + jobReady + " pending=" + jobPending
+ " active=" + jobActive + " userStarted=" + userStarted
+ " componentPresent=" + componentPresent);
}
return userStarted && componentPresent && jobReady && !jobPending && !jobActive;
// Everything else checked out so far, so this is the final yes/no check
return componentPresent;
}
/**