summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-07-14 17:40:47 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-07-14 17:40:47 +0000
commit4e7be87fbd169baf01ce8e63a57635870e909d93 (patch)
treeae7f29c290dd1cc34dff3cd4eb7b9bfedc12d74c
parent530d86123e6bc97457ea83cc662f24d1466df5af (diff)
parentc3a32b861d6c0f57ad6505db337a33e76d71263f (diff)
Merge "Avoid overlapping jobstore disk writes."
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobStore.java12
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.