diff options
3 files changed, 17 insertions, 13 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 34e82b0ce45e..ca002ec992e2 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -3139,7 +3139,9 @@ public class JobSchedulerService extends com.android.server.SystemService } void resetExecutionQuota(@NonNull String pkgName, int userId) { - mQuotaController.clearAppStats(userId, pkgName); + synchronized (mLock) { + mQuotaController.clearAppStatsLocked(userId, pkgName); + } } void resetScheduleQuota() { diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java index b7ace70f0cd4..7d7de3be8249 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java @@ -576,7 +576,7 @@ public final class QuotaController extends StateController { Slog.wtf(TAG, "Told app removed but given null package name."); return; } - clearAppStats(UserHandle.getUserId(uid), packageName); + clearAppStatsLocked(UserHandle.getUserId(uid), packageName); mForegroundUids.delete(uid); mUidToPackageCache.remove(uid); } @@ -592,7 +592,7 @@ public final class QuotaController extends StateController { } /** Drop all historical stats and stop tracking any active sessions for the specified app. */ - public void clearAppStats(int userId, @NonNull String packageName) { + public void clearAppStatsLocked(int userId, @NonNull String packageName) { mTrackedJobs.delete(userId, packageName); Timer timer = mPkgTimers.get(userId, packageName); if (timer != null) { @@ -1008,7 +1008,7 @@ public final class QuotaController extends StateController { } @VisibleForTesting - void incrementJobCount(final int userId, @NonNull final String packageName, int count) { + void incrementJobCountLocked(final int userId, @NonNull final String packageName, int count) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { @@ -1029,7 +1029,8 @@ public final class QuotaController extends StateController { } } - private void incrementTimingSessionCount(final int userId, @NonNull final String packageName) { + private void incrementTimingSessionCountLocked(final int userId, + @NonNull final String packageName) { final long now = sElapsedRealtimeClock.millis(); ExecutionStats[] appStats = mExecutionStatsCache.get(userId, packageName); if (appStats == null) { @@ -1481,7 +1482,7 @@ public final class QuotaController extends StateController { mRunningBgJobs.add(jobStatus); if (shouldTrackLocked()) { mBgJobCount++; - incrementJobCount(mPkg.userId, mPkg.packageName, 1); + incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1); if (mRunningBgJobs.size() == 1) { // Started tracking the first job. mStartTimeElapsed = sElapsedRealtimeClock.millis(); @@ -1534,7 +1535,7 @@ public final class QuotaController extends StateController { // of jobs. // However, cancel the currently scheduled cutoff since it's not currently useful. cancelCutoff(); - incrementTimingSessionCount(mPkg.userId, mPkg.packageName); + incrementTimingSessionCountLocked(mPkg.userId, mPkg.packageName); } /** @@ -1581,7 +1582,7 @@ public final class QuotaController extends StateController { // repeatedly plugged in and unplugged, or an app changes foreground state // very frequently, the job count for a package may be artificially high. mBgJobCount = mRunningBgJobs.size(); - incrementJobCount(mPkg.userId, mPkg.packageName, mBgJobCount); + incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount); // Starting the timer means that all cached execution stats are now // incorrect. invalidateAllExecutionStatsLocked(mPkg.userId, mPkg.packageName); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java index 79542084ac36..77fef1274415 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java @@ -1430,8 +1430,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); - mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { + mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertTrue(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } @@ -1445,8 +1445,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test.spam", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); - mQuotaController.incrementJobCount(0, "com.android.test.spam", jobCount); synchronized (mQuotaController.mLock) { + mQuotaController.incrementJobCountLocked(0, "com.android.test.spam", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked( 0, "com.android.test.spam", WORKING_INDEX)); } @@ -1471,8 +1471,8 @@ public class QuotaControllerTest { createTimingSession(now - (30 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, 5)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 4 * MINUTE_IN_MILLIS, 5)); - mQuotaController.incrementJobCount(0, "com.android.test", 5); synchronized (mQuotaController.mLock) { + mQuotaController.incrementJobCountLocked(0, "com.android.test", 5); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } @@ -1486,8 +1486,8 @@ public class QuotaControllerTest { createTimingSession(now - (HOUR_IN_MILLIS), 15 * MINUTE_IN_MILLIS, 25)); mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - (5 * MINUTE_IN_MILLIS), 3 * MINUTE_IN_MILLIS, jobCount)); - mQuotaController.incrementJobCount(0, "com.android.test", jobCount); synchronized (mQuotaController.mLock) { + mQuotaController.incrementJobCountLocked(0, "com.android.test", jobCount); assertFalse(mQuotaController.isWithinQuotaLocked(0, "com.android.test", WORKING_INDEX)); } } @@ -1637,9 +1637,10 @@ public class QuotaControllerTest { mQuotaController.saveTimingSession(0, "com.android.test", createTimingSession(now - ((10 - i) * MINUTE_IN_MILLIS), 30 * SECOND_IN_MILLIS, 2)); - mQuotaController.incrementJobCount(0, "com.android.test", 2); synchronized (mQuotaController.mLock) { + mQuotaController.incrementJobCountLocked(0, "com.android.test", 2); + assertEquals("Rare has incorrect quota status with " + (i + 1) + " sessions", i < 2, mQuotaController.isWithinQuotaLocked(0, "com.android.test", RARE_INDEX)); |