diff options
author | Matthew Williams <mjwilliams@google.com> | 2015-10-07 14:29:30 -0700 |
---|---|---|
committer | Matthew Williams <mjwilliams@google.com> | 2015-10-07 23:03:41 +0000 |
commit | d6af66e89dbb28b55181e8b18049cca40d0e355d (patch) | |
tree | 204fdfd3440a8933035bfb2614b418f6888ee0c3 /services | |
parent | 9d68833686e04ff5ff910a9d90fe99bc1347aaca (diff) | |
download | frameworks_base-d6af66e89dbb28b55181e8b18049cca40d0e355d.zip frameworks_base-d6af66e89dbb28b55181e8b18049cca40d0e355d.tar.gz frameworks_base-d6af66e89dbb28b55181e8b18049cca40d0e355d.tar.bz2 |
Correctly reschedule failed periodic
BUG: 24341715
Failed jobs are rescheduled with no override deadline to avoid
running a failed job with unsatisfied constraints.
A periodic job always has an override deadline and the periodic
rescheduling code assumes this.
Hence a periodic that failed until eventual success would be
rescheduled in a bad state.
Change-Id: Id110b3522df2003506a9efdde4e719e1b9932106
(cherry picked from commit 1bde39ad1424008917e1191565f81e0b4617f2fa)
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/job/JobSchedulerService.java | 23 | ||||
-rw-r--r-- | services/core/java/com/android/server/job/JobServiceContext.java | 2 |
2 files changed, 17 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index ecda36a..06bd583 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -443,13 +443,16 @@ public class JobSchedulerService extends com.android.server.SystemService } /** - * A job is rescheduled with exponential back-off if the client requests this from their - * execution logic. - * A caveat is for idle-mode jobs, for which the idle-mode constraint will usurp the - * timeliness of the reschedule. For an idle-mode job, no deadline is given. + * Reschedules the given job based on the job's backoff policy. It doesn't make sense to + * specify an override deadline on a failed job (the failed job will run even though it's not + * ready), so we reschedule it with {@link JobStatus#NO_LATEST_RUNTIME}, but specify that any + * ready job with {@link JobStatus#numFailures} > 0 will be executed. + * * @param failureToReschedule Provided job status that we will reschedule. * @return A newly instantiated JobStatus with the same constraints as the last job except * with adjusted timing constraints. + * + * @see JobHandler#maybeQueueReadyJobsForExecutionLockedH */ private JobStatus getRescheduleJobForFailure(JobStatus failureToReschedule) { final long elapsedNowMillis = SystemClock.elapsedRealtime(); @@ -479,8 +482,9 @@ public class JobSchedulerService extends com.android.server.SystemService } /** - * Called after a periodic has executed so we can to re-add it. We take the last execution time - * of the job to be the time of completion (i.e. the time at which this function is called). + * Called after a periodic has executed so we can reschedule it. We take the last execution + * time of the job to be the time of completion (i.e. the time at which this function is + * called). * This could be inaccurate b/c the job can run for as long as * {@link com.android.server.job.JobServiceContext#EXECUTING_TIMESLICE_MILLIS}, but will lead * to underscheduling at least, rather than if we had taken the last execution time to be the @@ -491,7 +495,12 @@ public class JobSchedulerService extends com.android.server.SystemService private JobStatus getRescheduleJobForPeriodic(JobStatus periodicToReschedule) { final long elapsedNow = SystemClock.elapsedRealtime(); // Compute how much of the period is remaining. - long runEarly = Math.max(periodicToReschedule.getLatestRunTimeElapsed() - elapsedNow, 0); + long runEarly = 0L; + + // If this periodic was rescheduled it won't have a deadline. + if (periodicToReschedule.hasDeadlineConstraint()) { + runEarly = Math.max(periodicToReschedule.getLatestRunTimeElapsed() - elapsedNow, 0L); + } long newEarliestRunTimeElapsed = elapsedNow + runEarly; long period = periodicToReschedule.getJob().getIntervalMillis(); long newLatestRuntimeElapsed = newEarliestRunTimeElapsed + period; diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java index bb4e388..43d5648 100644 --- a/services/core/java/com/android/server/job/JobServiceContext.java +++ b/services/core/java/com/android/server/job/JobServiceContext.java @@ -68,7 +68,7 @@ public class JobServiceContext extends IJobCallback.Stub implements ServiceConne private static final int defaultMaxActiveJobsPerService = ActivityManager.isLowRamDeviceStatic() ? 1 : 3; /** Amount of time a job is allowed to execute for before being considered timed-out. */ - private static final long EXECUTING_TIMESLICE_MILLIS = 10 * 60 * 1000; + private static final long EXECUTING_TIMESLICE_MILLIS = 10 * 60 * 1000; // 10mins. /** Amount of time the JobScheduler will wait for a response from an app for a message. */ private static final long OP_TIMEOUT_MILLIS = 8 * 1000; |