diff options
| author | 2020-07-14 17:40:47 +0000 | |
|---|---|---|
| committer | 2020-07-14 17:40:47 +0000 | |
| commit | 4e7be87fbd169baf01ce8e63a57635870e909d93 (patch) | |
| tree | ae7f29c290dd1cc34dff3cd4eb7b9bfedc12d74c | |
| parent | 530d86123e6bc97457ea83cc662f24d1466df5af (diff) | |
| parent | c3a32b861d6c0f57ad6505db337a33e76d71263f (diff) | |
Merge "Avoid overlapping jobstore disk writes."
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/JobStore.java | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java index f2a55805d70a..7bd51b77a119 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java @@ -335,7 +335,7 @@ public final class JobStore { Slog.v(TAG, "Scheduling persist of jobs to disk."); } mIoHandler.postDelayed(mWriteRunnable, JOB_PERSIST_DELAY); - mWriteScheduled = mWriteInProgress = true; + mWriteScheduled = true; } } } @@ -353,7 +353,7 @@ public final class JobStore { throw new IllegalStateException("An asynchronous write is already scheduled."); } - mWriteScheduled = mWriteInProgress = true; + mWriteScheduled = true; mWriteRunnable.run(); } } @@ -369,7 +369,7 @@ public final class JobStore { final long start = SystemClock.uptimeMillis(); final long end = start + maxWaitMillis; synchronized (mWriteScheduleLock) { - while (mWriteInProgress) { + while (mWriteScheduled || mWriteInProgress) { final long now = SystemClock.uptimeMillis(); if (now >= end) { // still not done and we've hit the end; failure @@ -404,6 +404,12 @@ public final class JobStore { // a bit of lock contention. synchronized (mWriteScheduleLock) { mWriteScheduled = false; + if (mWriteInProgress) { + // Another runnable is currently writing. Postpone this new write task. + maybeWriteStatusToDiskAsync(); + return; + } + mWriteInProgress = true; } synchronized (mLock) { // Clone the jobs so we can release the lock before writing. |