From 03ebd42a09b0aa490711db354f79e8be7d15eed8 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 3 Nov 2023 17:36:41 +0000 Subject: Lower EJ execution limit to 10 minutes. Developers are informed that expedited jobs can be stopped earlier than regular jobs and so shouldn't use them for long pieces of work. The standard timeout is 3 minutes for EJs. There's little reason to let them run longer than the normal 10 minutes, and letting them run up to 30 minutes may give developers the wrong impression and increases the potential for accidental power issues. Lower the maximum execution limit of EJs to 10 minutes (the base execution limit of regular jobs) to be more in line with what EJs should be used for and prevent additional issues. Bug: 284512488 Bug: 297106511 Bug: 299329948 Bug: 299346198 Test: atest FrameworksMockingServicesTests:JobSchedulerServiceTest Change-Id: Ia4950f0801f2881a34976987f735e5ab7f493ee1 --- .../android/server/job/JobSchedulerService.java | 8 ++++- .../server/job/JobSchedulerServiceTest.java | 37 ++++++++++++++-------- 2 files changed, 31 insertions(+), 14 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 23b36e20b174..bff43534ce05 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -3859,10 +3859,16 @@ public class JobSchedulerService extends com.android.server.SystemService // Only let the app use the higher runtime if it hasn't repeatedly timed out. final String timeoutTag = job.shouldTreatAsExpeditedJob() ? QUOTA_TRACKER_TIMEOUT_EJ_TAG : QUOTA_TRACKER_TIMEOUT_REG_TAG; + // Developers are informed that expedited jobs can be stopped earlier than regular jobs + // and so shouldn't use them for long pieces of work. There's little reason to let + // them run longer than the normal 10 minutes. + final long normalUpperLimitMs = job.shouldTreatAsExpeditedJob() + ? mConstants.RUNTIME_MIN_GUARANTEE_MS + : mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS; final long upperLimitMs = mQuotaTracker.isWithinQuota(job.getTimeoutBlameUserId(), job.getTimeoutBlamePackageName(), timeoutTag) - ? mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS + ? normalUpperLimitMs : mConstants.RUNTIME_MIN_GUARANTEE_MS; return Math.min(upperLimitMs, mConstants.USE_TARE_POLICY 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 dd23d9f006e3..e5291d31d524 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -577,8 +577,14 @@ public class JobSchedulerServiceTest { JobStatus jobUIDT = createJobStatus("testGetMaxJobExecutionTimeMs", createJobInfo(10) .setUserInitiated(true).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)); + JobStatus jobEj = createJobStatus("testGetMaxJobExecutionTimeMs", + createJobInfo(2).setExpedited(true)); + JobStatus jobReg = createJobStatus("testGetMaxJobExecutionTimeMs", + createJobInfo(3)); spyOn(jobUIDT); when(jobUIDT.shouldTreatAsUserInitiatedJob()).thenReturn(true); + spyOn(jobEj); + when(jobEj.shouldTreatAsExpeditedJob()).thenReturn(true); QuotaController quotaController = mService.getQuotaController(); spyOn(quotaController); @@ -595,6 +601,11 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUIDT)); + + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, + mService.getMaxJobExecutionTimeMs(jobEj)); + assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + mService.getMaxJobExecutionTimeMs(jobReg)); } @Test @@ -636,7 +647,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -649,7 +660,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -664,7 +675,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -677,7 +688,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -692,7 +703,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -705,7 +716,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -720,7 +731,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -765,7 +776,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -778,7 +789,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -792,7 +803,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -807,7 +818,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -820,7 +831,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); @@ -834,7 +845,7 @@ public class JobSchedulerServiceTest { grantRunUserInitiatedJobsPermission(false); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobUij)); - assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, + assertEquals(mService.mConstants.RUNTIME_MIN_GUARANTEE_MS, mService.getMaxJobExecutionTimeMs(jobEj)); assertEquals(mService.mConstants.RUNTIME_FREE_QUOTA_MAX_LIMIT_MS, mService.getMaxJobExecutionTimeMs(jobReg)); -- cgit v1.2.3-59-g8ed1b