diff options
author | 2024-09-20 14:22:16 +0000 | |
---|---|---|
committer | 2024-09-20 14:22:16 +0000 | |
commit | a85c68a527f02ce70132dcd8af2d2d36900c8a23 (patch) | |
tree | d07a364d5c64e05dc3906deb8dc4e0a40065ebd7 /services/appfunctions/java | |
parent | 3c39767a6a814d3cf145355d6c2f4671f28608a0 (diff) |
Revert "Batch calls to the Metadata Syncer"
This reverts commit 3c39767a6a814d3cf145355d6c2f4671f28608a0.
Reason for revert: DroidMonitor created revert due to b/368463140.
Change-Id: I53a650af5f90b5f6da82dd086cfdb67a931448f3
Diffstat (limited to 'services/appfunctions/java')
4 files changed, 72 insertions, 42 deletions
diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java index c3b7087a44c3..1f98334bb8ce 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionExecutors.java @@ -16,7 +16,15 @@ package com.android.server.appfunctions; +import android.annotation.NonNull; +import android.os.UserHandle; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; + import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -33,5 +41,50 @@ public final class AppFunctionExecutors { /* unit= */ TimeUnit.SECONDS, /* workQueue= */ new LinkedBlockingQueue<>()); + /** A map of per-user executors for queued work. */ + @GuardedBy("sLock") + private static final SparseArray<ExecutorService> mPerUserExecutorsLocked = new SparseArray<>(); + + private static final Object sLock = new Object(); + + /** + * Returns a per-user executor for queued metadata sync request. + * + * <p>The work submitted to these executor (Sync request) needs to be synchronous per user hence + * the use of a single thread. + * + * <p>Note: Use a different executor if not calling {@code submitSyncRequest} on a {@code + * MetadataSyncAdapter}. + */ + // TODO(b/357551503): Restrict the scope of this executor to the MetadataSyncAdapter itself. + public static ExecutorService getPerUserSyncExecutor(@NonNull UserHandle user) { + synchronized (sLock) { + ExecutorService executor = mPerUserExecutorsLocked.get(user.getIdentifier(), null); + if (executor == null) { + executor = Executors.newSingleThreadExecutor(); + mPerUserExecutorsLocked.put(user.getIdentifier(), executor); + } + return executor; + } + } + + /** + * Shuts down and removes the per-user executor for queued work. + * + * <p>This should be called when the user is removed. + */ + public static void shutDownAndRemoveUserExecutor(@NonNull UserHandle user) + throws InterruptedException { + ExecutorService executor; + synchronized (sLock) { + executor = mPerUserExecutorsLocked.get(user.getIdentifier()); + mPerUserExecutorsLocked.remove(user.getIdentifier()); + } + if (executor != null) { + executor.shutdown(); + var unused = executor.awaitTermination(30, TimeUnit.SECONDS); + } + } + private AppFunctionExecutors() {} } diff --git a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java index 165a9452fb0a..469a1a2251e8 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java +++ b/services/appfunctions/java/com/android/server/appfunctions/AppFunctionManagerServiceImpl.java @@ -95,7 +95,12 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub { public void onUserStopping(@NonNull TargetUser user) { Objects.requireNonNull(user); - MetadataSyncPerUser.removeUserSyncAdapter(user.getUserHandle()); + try { + AppFunctionExecutors.shutDownAndRemoveUserExecutor(user.getUserHandle()); + MetadataSyncPerUser.removeUserSyncAdapter(user.getUserHandle()); + } catch (InterruptedException e) { + Slog.e(TAG, "Unable to remove data for: " + user.getUserHandle(), e); + } } @Override diff --git a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java index 759f02eb138a..e29b6e403f2a 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java +++ b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java @@ -42,7 +42,6 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; -import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.infra.AndroidFuture; import com.android.server.appfunctions.FutureAppSearchSession.FutureSearchResults; @@ -53,12 +52,8 @@ import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.Executor; /** * This class implements helper methods for synchronously interacting with AppSearch while @@ -68,14 +63,9 @@ import java.util.concurrent.TimeUnit; */ public class MetadataSyncAdapter { private static final String TAG = MetadataSyncAdapter.class.getSimpleName(); - - private final ExecutorService mExecutor; - + private final Executor mSyncExecutor; private final AppSearchManager mAppSearchManager; private final PackageManager mPackageManager; - private final Object mLock = new Object(); - @GuardedBy("mLock") - private Future<AndroidFuture<Boolean>> mCurrentSyncTask; // Hidden constants in {@link SetSchemaRequest} that restricts runtime metadata visibility // by permissions. @@ -83,10 +73,12 @@ public class MetadataSyncAdapter { public static final int EXECUTE_APP_FUNCTIONS_TRUSTED = 10; public MetadataSyncAdapter( - @NonNull PackageManager packageManager, @NonNull AppSearchManager appSearchManager) { + @NonNull Executor syncExecutor, + @NonNull PackageManager packageManager, + @NonNull AppSearchManager appSearchManager) { + mSyncExecutor = Objects.requireNonNull(syncExecutor); mPackageManager = Objects.requireNonNull(packageManager); mAppSearchManager = Objects.requireNonNull(appSearchManager); - mExecutor = Executors.newSingleThreadExecutor(); } /** @@ -105,7 +97,7 @@ public class MetadataSyncAdapter { AppFunctionRuntimeMetadata.APP_FUNCTION_RUNTIME_METADATA_DB) .build(); AndroidFuture<Boolean> settableSyncStatus = new AndroidFuture<>(); - Callable<AndroidFuture<Boolean>> callableTask = + mSyncExecutor.execute( () -> { try (FutureAppSearchSession staticMetadataSearchSession = new FutureAppSearchSessionImpl( @@ -125,28 +117,10 @@ public class MetadataSyncAdapter { } catch (Exception ex) { settableSyncStatus.completeExceptionally(ex); } - return settableSyncStatus; - }; - - synchronized (mLock) { - if (mCurrentSyncTask != null && !mCurrentSyncTask.isDone()) { - boolean cancel = mCurrentSyncTask.cancel(false); - } - mCurrentSyncTask = mExecutor.submit(callableTask); - } - + }); return settableSyncStatus; } - /** This method shuts down the {@link MetadataSyncAdapter} scheduler. */ - public void shutDown() { - try { - var unused = mExecutor.awaitTermination(30, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Slog.e(TAG, "Error shutting down MetadataSyncAdapter scheduler", e); - } - } - @WorkerThread @VisibleForTesting void trySyncAppFunctionMetadataBlocking( diff --git a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncPerUser.java b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncPerUser.java index e933ec1ba4b1..f421527e72d0 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncPerUser.java +++ b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncPerUser.java @@ -55,7 +55,10 @@ public final class MetadataSyncPerUser { PackageManager perUserPackageManager = userContext.getPackageManager(); if (perUserAppSearchManager != null) { metadataSyncAdapter = - new MetadataSyncAdapter(perUserPackageManager, perUserAppSearchManager); + new MetadataSyncAdapter( + AppFunctionExecutors.getPerUserSyncExecutor(user), + perUserPackageManager, + perUserAppSearchManager); sPerUserMetadataSyncAdapter.put(user.getIdentifier(), metadataSyncAdapter); return metadataSyncAdapter; } @@ -71,12 +74,7 @@ public final class MetadataSyncPerUser { */ public static void removeUserSyncAdapter(UserHandle user) { synchronized (sLock) { - MetadataSyncAdapter metadataSyncAdapter = - sPerUserMetadataSyncAdapter.get(user.getIdentifier(), null); - if (metadataSyncAdapter != null) { - metadataSyncAdapter.shutDown(); - sPerUserMetadataSyncAdapter.remove(user.getIdentifier()); - } + sPerUserMetadataSyncAdapter.remove(user.getIdentifier()); } } } |