diff options
| author | 2023-05-15 21:24:59 +0000 | |
|---|---|---|
| committer | 2023-05-15 21:38:04 +0000 | |
| commit | 9e653088c4ce19dd1cd8a056bfe782ea8c6f2655 (patch) | |
| tree | bf6f091d74e9f911d32ba53b3818948b98a4e290 | |
| parent | 11cd46966d0bc500c72b11c2e5700ac1dd75fcd3 (diff) | |
Don't back off for first few system stops.
System requested stops theoretically have no reason to trigger an
immediate backoff because there's no indication the backoff will help
improve success rate, so don't back off a job for the first few system
stops.
Bug: 282784507
Test: atest FrameworksMockingServicesTests:JobSchedulerServiceTest
Change-Id: If30edd312e17a6baba05654075e7ed21ace6338b
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java | 57 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java | 4 |
2 files changed, 36 insertions, 25 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 3f552b6906d0..ea7460dd2d71 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -2600,34 +2600,43 @@ public class JobSchedulerService extends com.android.server.SystemService } else { numSystemStops++; } - final int backoffAttempts = Math.max(1, - numFailures + numSystemStops / mConstants.SYSTEM_STOP_TO_FAILURE_RATIO); - long delayMillis; - - switch (job.getBackoffPolicy()) { - case JobInfo.BACKOFF_POLICY_LINEAR: { - long backoff = initialBackoffMillis; - if (backoff < mConstants.MIN_LINEAR_BACKOFF_TIME_MS) { - backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; - } - delayMillis = backoff * backoffAttempts; - } break; - default: - if (DEBUG) { - Slog.v(TAG, "Unrecognised back-off policy, defaulting to exponential."); + final int backoffAttempts = + numFailures + numSystemStops / mConstants.SYSTEM_STOP_TO_FAILURE_RATIO; + final long earliestRuntimeMs; + + if (backoffAttempts == 0) { + earliestRuntimeMs = JobStatus.NO_EARLIEST_RUNTIME; + } else { + long delayMillis; + switch (job.getBackoffPolicy()) { + case JobInfo.BACKOFF_POLICY_LINEAR: { + long backoff = initialBackoffMillis; + if (backoff < mConstants.MIN_LINEAR_BACKOFF_TIME_MS) { + backoff = mConstants.MIN_LINEAR_BACKOFF_TIME_MS; + } + delayMillis = backoff * backoffAttempts; } - case JobInfo.BACKOFF_POLICY_EXPONENTIAL: { - long backoff = initialBackoffMillis; - if (backoff < mConstants.MIN_EXP_BACKOFF_TIME_MS) { - backoff = mConstants.MIN_EXP_BACKOFF_TIME_MS; + break; + default: + if (DEBUG) { + Slog.v(TAG, "Unrecognised back-off policy, defaulting to exponential."); + } + // Intentional fallthrough. + case JobInfo.BACKOFF_POLICY_EXPONENTIAL: { + long backoff = initialBackoffMillis; + if (backoff < mConstants.MIN_EXP_BACKOFF_TIME_MS) { + backoff = mConstants.MIN_EXP_BACKOFF_TIME_MS; + } + delayMillis = (long) Math.scalb(backoff, backoffAttempts - 1); } - delayMillis = (long) Math.scalb(backoff, backoffAttempts - 1); - } break; + break; + } + delayMillis = + Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); + earliestRuntimeMs = elapsedNowMillis + delayMillis; } - delayMillis = - Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS); JobStatus newJob = new JobStatus(failureToReschedule, - elapsedNowMillis + delayMillis, + earliestRuntimeMs, JobStatus.NO_LATEST_RUNTIME, numFailures, numSystemStops, failureToReschedule.getLastSuccessfulRunTime(), sSystemClock.millis(), failureToReschedule.getCumulativeExecutionTimeMs()); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index 9cd22dd292a5..b19a13c30e89 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -402,13 +402,15 @@ public class JobSchedulerServiceTest { JobStatus rescheduledJob = mService.getRescheduleJobForFailureLocked(originalJob, JobParameters.STOP_REASON_DEVICE_STATE, JobParameters.INTERNAL_STOP_REASON_DEVICE_THERMAL); - assertEquals(nowElapsed + initialBackoffMs, rescheduledJob.getEarliestRunTime()); + assertEquals(JobStatus.NO_EARLIEST_RUNTIME, rescheduledJob.getEarliestRunTime()); assertEquals(JobStatus.NO_LATEST_RUNTIME, rescheduledJob.getLatestRunTimeElapsed()); // failure = 0, systemStop = 2 rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, JobParameters.STOP_REASON_DEVICE_STATE, JobParameters.INTERNAL_STOP_REASON_PREEMPT); + assertEquals(JobStatus.NO_EARLIEST_RUNTIME, rescheduledJob.getEarliestRunTime()); + assertEquals(JobStatus.NO_LATEST_RUNTIME, rescheduledJob.getLatestRunTimeElapsed()); // failure = 0, systemStop = 3 rescheduledJob = mService.getRescheduleJobForFailureLocked(rescheduledJob, JobParameters.STOP_REASON_CONSTRAINT_CHARGING, |