From c08c296025a17b72e9a7ac15df8936080505d17e Mon Sep 17 00:00:00 2001 From: Anna Bauza Date: Thu, 17 Oct 2024 07:50:04 +0000 Subject: Cache getProfileParent to reduce high volume of binder calls. Test: atest UserManagerTest Flag: android.multiuser.cache_profile_parent_read_only Bug: 350417399 Change-Id: I2555d4e7495f0a73734ae22f0d7aa246bf2cc44e --- core/java/android/os/UserManager.java | 31 +++++++++++++++++----- .../com/android/server/pm/UserManagerService.java | 6 +++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index bd3da0d56cbd..f1b65c895699 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -5600,14 +5600,30 @@ public class UserManager { android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS }) + @CachedProperty(api = "user_manager_users") public @Nullable UserHandle getProfileParent(@NonNull UserHandle user) { - UserInfo info = getProfileParent(user.getIdentifier()); - - if (info == null) { - return null; + if (android.multiuser.Flags.cacheProfileParentReadOnly()) { + final UserHandle userHandle = UserManagerCache.getProfileParent( + (UserHandle query) -> { + UserInfo info = getProfileParent(query.getIdentifier()); + // TODO: Remove when b/372923336 is fixed + if (info == null) { + return UserHandle.of(UserHandle.USER_NULL); + } + return UserHandle.of(info.id); + }, + user); + if (userHandle.getIdentifier() == UserHandle.USER_NULL) { + return null; + } + return userHandle; + } else { + UserInfo info = getProfileParent(user.getIdentifier()); + if (info == null) { + return null; + } + return UserHandle.of(info.id); } - - return UserHandle.of(info.id); } /** @@ -6422,6 +6438,9 @@ public class UserManager { */ public static final void invalidateCacheOnUserListChange() { UserManagerCache.invalidateUserSerialNumber(); + if (android.multiuser.Flags.cacheProfileParentReadOnly()) { + UserManagerCache.invalidateProfileParent(); + } } /** diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index daf413bb30b3..bcebfcdcfe08 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -5789,6 +5789,9 @@ public class UserManagerService extends IUserManager.Stub { } userInfo.partial = false; + if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) { + UserManager.invalidateCacheOnUserListChange(); + } synchronized (mPackagesLock) { writeUserLP(userData); } @@ -6367,6 +6370,9 @@ public class UserManagerService extends IUserManager.Stub { // on next startup, in case the runtime stops now before stopping and // removing the user completely. userData.info.partial = true; + if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) { + UserManager.invalidateCacheOnUserListChange(); + } // Mark it as disabled, so that it isn't returned any more when // profiles are queried. userData.info.flags |= UserInfo.FLAG_DISABLED; -- cgit v1.2.3-59-g8ed1b