From d7f3452d9d1fe282d54dec189ca59cfb1a70f654 Mon Sep 17 00:00:00 2001 From: Nikolas Havrikov Date: Fri, 14 Jan 2022 13:29:26 +0100 Subject: [PATCH] Add clear-association-memory-cache shell command Test: atest CtsCompanionDeviceManagerCoreTestCases Test: atest CtsCompanionDeviceManagerUiAutomationTestCases Change-Id: I8643eb318ed4e4bdd0bafe80eca02141c0f10aa4 --- .../companion/AssociationStoreImpl.java | 57 ++++++++++++------- .../CompanionDeviceManagerService.java | 24 ++++---- .../CompanionDeviceShellCommand.java | 8 ++- 3 files changed, 58 insertions(+), 31 deletions(-) diff --git a/services/companion/java/com/android/server/companion/AssociationStoreImpl.java b/services/companion/java/com/android/server/companion/AssociationStoreImpl.java index 5b318d319ebee..dbcdd0f877a1d 100644 --- a/services/companion/java/com/android/server/companion/AssociationStoreImpl.java +++ b/services/companion/java/com/android/server/companion/AssociationStoreImpl.java @@ -37,6 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.StringJoiner; /** * Implementation of the {@link AssociationStore}, with addition of the methods for modification. @@ -58,33 +59,15 @@ class AssociationStoreImpl implements AssociationStore { private final Object mLock = new Object(); @GuardedBy("mLock") - private final Map mIdMap; + private final Map mIdMap = new HashMap<>(); @GuardedBy("mLock") - private final Map> mAddressMap; + private final Map> mAddressMap = new HashMap<>(); @GuardedBy("mLock") private final SparseArray> mCachedPerUser = new SparseArray<>(); @GuardedBy("mListeners") private final Set mListeners = new LinkedHashSet<>(); - AssociationStoreImpl(Collection associations) { - synchronized (mLock) { - final int size = associations.size(); - mIdMap = new HashMap<>(size); - mAddressMap = new HashMap<>(size); - - for (AssociationInfo association : associations) { - final int id = association.getId(); - mIdMap.put(id, association); - - final MacAddress address = association.getDeviceMacAddress(); - if (address != null) { - mAddressMap.computeIfAbsent(address, it -> new HashSet<>()).add(id); - } - } - } - } - void addAssociation(@NonNull AssociationInfo association) { final int id = association.getId(); @@ -301,4 +284,38 @@ class AssociationStoreImpl implements AssociationStore { } } } + + void setAssociations(Collection allAssociations) { + if (DEBUG) { + Log.i(TAG, "setAssociations() n=" + allAssociations.size()); + final StringJoiner stringJoiner = new StringJoiner(", "); + allAssociations.forEach(assoc -> stringJoiner.add(assoc.toShortString())); + Log.v(TAG, " associations=" + stringJoiner); + } + synchronized (mLock) { + setAssociationsLocked(allAssociations); + } + } + + @GuardedBy("mLock") + private void setAssociationsLocked(Collection associations) { + clearLocked(); + + for (AssociationInfo association : associations) { + final int id = association.getId(); + mIdMap.put(id, association); + + final MacAddress address = association.getDeviceMacAddress(); + if (address != null) { + mAddressMap.computeIfAbsent(address, it -> new HashSet<>()).add(id); + } + } + } + + @GuardedBy("mLock") + private void clearLocked() { + mIdMap.clear(); + mAddressMap.clear(); + mCachedPerUser.clear(); + } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 1c983477a2ab7..1e50c80f0e719 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -159,7 +159,7 @@ public class CompanionDeviceManagerService extends SystemService // Persistent data store for all Associations. private PersistentDataStore mPersistentStore; - private AssociationStoreImpl mAssociationStore; + private final AssociationStoreImpl mAssociationStore = new AssociationStoreImpl(); private AssociationRequestsProcessor mAssociationRequestsProcessor; private PowerWhitelistManager mPowerWhitelistManager; @@ -219,16 +219,8 @@ public class CompanionDeviceManagerService extends SystemService @Override public void onStart() { mPersistentStore = new PersistentDataStore(); - final Set allAssociations = new ArraySet<>(); - synchronized (mPreviouslyUsedIds) { - // The data is stored in DE directories, so we can read the data for all users now - // (which would not be possible if the data was stored to CE directories). - mPersistentStore.readStateForUsers( - mUserManager.getAliveUsers(), allAssociations, mPreviouslyUsedIds); - } - - mAssociationStore = new AssociationStoreImpl(allAssociations); + loadAssociationsFromDisk(); mAssociationStore.registerListener(this); mCompanionDevicePresenceController = new CompanionDevicePresenceController(this); @@ -239,6 +231,18 @@ public class CompanionDeviceManagerService extends SystemService publishBinderService(Context.COMPANION_DEVICE_SERVICE, impl); } + void loadAssociationsFromDisk() { + final Set allAssociations = new ArraySet<>(); + synchronized (mPreviouslyUsedIds) { + // The data is stored in DE directories, so we can read the data for all users now + // (which would not be possible if the data was stored to CE directories). + mPersistentStore.readStateForUsers( + mUserManager.getAliveUsers(), allAssociations, mPreviouslyUsedIds); + } + + mAssociationStore.setAssociations(allAssociations); + } + @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java index 5c0571d801aa9..5f46d5c4c4bf5 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java @@ -82,7 +82,10 @@ class CompanionDeviceShellCommand extends android.os.ShellCommand { mService.onDeviceDisconnected(getNextArgRequired()); } break; - + case "clear-association-memory-cache": { + mService.loadAssociationsFromDisk(); + } + break; default: return handleDefaultCommands(cmd); } @@ -110,5 +113,8 @@ class CompanionDeviceShellCommand extends android.os.ShellCommand { pw.println(" Create a new Association."); pw.println(" disassociate USER_ID PACKAGE MAC_ADDRESS"); pw.println(" Remove an existing Association."); + pw.println(" clear-association-memory-cache"); + pw.println(" Clear the in-memory association cache and reload all association " + + "information from persistent storage. USE FOR DEBUGGING PURPOSES ONLY."); } }