From 9233ddb49172677be6e2687a0eaed2592658f848 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Thu, 1 Dec 2022 11:42:22 -0800 Subject: [PATCH 1/2] Further async settings write optimizations. Bug: 252726591 Test: presubmit Change-Id: Ie08130539adefa71f95bebab65c60ff30eb83d26 --- .../java/com/android/server/pm/Settings.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 4aba01637abf2..f9d0108c862a7 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -5613,8 +5613,7 @@ public final class Settings implements Watchable, Snappable { // Low-priority handlers running on SystemBg thread. private final Handler mAsyncHandler = new MyHandler(); - private final Handler mPersistenceHandler = new Handler( - BackgroundThread.getHandler().getLooper()); + private final Handler mPersistenceHandler = new PersistenceHandler(); private final Object mLock = new Object(); @@ -5761,20 +5760,22 @@ public final class Settings implements Watchable, Snappable { @NonNull WatchedArrayMap sharedUsers, @Nullable Handler pmHandler, @NonNull Object pmLock, boolean sync) { - final int version; - final String fingerprint; - final boolean isLegacyPermissionStateStale; synchronized (mLock) { mAsyncHandler.removeMessages(userId); mWriteScheduled.delete(userId); - - version = mVersions.get(userId, INITIAL_VERSION); - fingerprint = mFingerprints.get(userId); - isLegacyPermissionStateStale = mIsLegacyPermissionStateStale; - mIsLegacyPermissionStateStale = false; } Runnable writer = () -> { + final int version; + final String fingerprint; + final boolean isLegacyPermissionStateStale; + synchronized (mLock) { + version = mVersions.get(userId, INITIAL_VERSION); + fingerprint = mFingerprints.get(userId); + isLegacyPermissionStateStale = mIsLegacyPermissionStateStale; + mIsLegacyPermissionStateStale = false; + } + final RuntimePermissionsState runtimePermissions; synchronized (pmLock) { if (sync || isLegacyPermissionStateStale) { @@ -5823,7 +5824,7 @@ public final class Settings implements Watchable, Snappable { } if (pmHandler != null) { // Async version. - mPersistenceHandler.post(() -> writePendingStates()); + mPersistenceHandler.obtainMessage(userId).sendToTarget(); } else { // Sync version. writePendingStates(); @@ -6099,6 +6100,17 @@ public final class Settings implements Watchable, Snappable { } } } + + private final class PersistenceHandler extends Handler { + PersistenceHandler() { + super(BackgroundThread.getHandler().getLooper()); + } + + @Override + public void handleMessage(Message message) { + writePendingStates(); + } + } } /** From f0bbf0d66807bac62f9ee491b653c9be4b914481 Mon Sep 17 00:00:00 2001 From: Alex Buynytskyy Date: Fri, 2 Dec 2022 16:17:56 -0800 Subject: [PATCH 2/2] Increase the default period to allow for more async writes. Bug: 252726591 Test: presubmit Change-Id: I652a101fac05dfc588b0cb02e77c6ddba8c593d4 --- services/core/java/com/android/server/pm/Settings.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index f9d0108c862a7..ef67676ce4aed 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -5594,8 +5594,8 @@ public final class Settings implements Watchable, Snappable { } private static final class RuntimePermissionPersistence { - // 200-400ms delay to avoid monopolizing PMS lock when written for multiple users. - private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 300; + // 700-1300ms delay to avoid monopolizing PMS lock when written for multiple users. + private static final long WRITE_PERMISSIONS_DELAY_MILLIS = 1000; private static final double WRITE_PERMISSIONS_DELAY_JITTER = 0.3; private static final long MAX_WRITE_PERMISSIONS_DELAY_MILLIS = 2000;