Loading apex/appsearch/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ apex { key: "com.android.appsearch.key", certificate: ":com.android.appsearch.certificate", updatable: false, generate_hashtree: false, } apex_key { Loading apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +58 −66 Original line number Diff line number Diff line Loading @@ -348,19 +348,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_SET_SCHEMA) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -480,19 +480,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_PUT_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -563,19 +563,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_GET_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -631,19 +631,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -697,20 +697,18 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); // TODO(b/173532925) database would be nulluable once we remove generalStats CallStats.Builder cBuilder = new CallStats.Builder(packageName, /*database=*/ "") logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_GLOBAL_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -965,19 +963,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_ID) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1033,19 +1031,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1110,19 +1108,17 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(/*packageName=*/ "", /*databaseName=*/ "") logger.logStats(new CallStats.Builder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_FLUSH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1162,21 +1158,17 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); // TODO(b/173532925) make packageName and database nullable after // removing generalStats CallStats.Builder cBuilder = new CallStats.Builder(/*packageName=*/"", /*database=*/ "") logger.logStats(new CallStats.Builder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_INITIALIZE) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +16 −4 Original line number Diff line number Diff line Loading @@ -24,10 +24,12 @@ import android.content.Context; import android.os.Environment; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.server.appsearch.external.localstorage.AppSearchImpl; import com.android.server.appsearch.external.localstorage.AppSearchLogger; import com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy; import java.io.File; import java.util.Map; Loading @@ -37,9 +39,10 @@ import java.util.Objects; * Manages the lifecycle of instances of {@link AppSearchImpl}. * * <p>These instances are managed per unique device-user. * @hide */ public final class ImplInstanceManager { private static final String APP_SEARCH_DIR = "appSearch"; private static final String TAG = "AppSearchImplInstanceMa"; private static ImplInstanceManager sImplInstanceManager; Loading Loading @@ -70,8 +73,11 @@ public final class ImplInstanceManager { * <p>This folder should only be accessed after unlock. */ public static File getAppSearchDir(@NonNull UserHandle userHandle) { return new File( Environment.getDataSystemCeDirectory(userHandle.getIdentifier()), APP_SEARCH_DIR); // Duplicates the implementation of Environment#getDataSystemCeDirectory // TODO(b/191059409): Unhide Environment#getDataSystemCeDirectory and switch to it. File systemCeDir = new File(Environment.getDataDirectory(), "system_ce"); File systemCeUserDir = new File(systemCeDir, String.valueOf(userHandle.getIdentifier())); return new File(systemCeUserDir, "appSearch"); } /** Loading Loading @@ -153,6 +159,12 @@ public final class ImplInstanceManager { @Nullable AppSearchLogger logger) throws AppSearchException { File appSearchDir = getAppSearchDir(userHandle); return AppSearchImpl.create(appSearchDir, userContext, /*logger=*/ null); File icingDir = new File(appSearchDir, "icing"); Log.i(TAG, "Creating new AppSearch instance at: " + icingDir); return AppSearchImpl.create( icingDir, userContext, /*logger=*/ null, new FrameworkOptimizeStrategy()); } } apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java +19 −21 Original line number Diff line number Diff line Loading @@ -145,14 +145,14 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; public final class AppSearchImpl implements Closeable { private static final String TAG = "AppSearchImpl"; @VisibleForTesting static final int OPTIMIZE_THRESHOLD_DOC_COUNT = 1000; @VisibleForTesting static final int OPTIMIZE_THRESHOLD_BYTES = 1_000_000; // 1MB @VisibleForTesting static final int CHECK_OPTIMIZE_INTERVAL = 100; private final ReadWriteLock mReadWriteLock = new ReentrantReadWriteLock(); private final LogUtil mLogUtil = new LogUtil(TAG); private final OptimizeStrategy mOptimizeStrategy; @GuardedBy("mReadWriteLock") @VisibleForTesting final IcingSearchEngine mIcingSearchEngineLocked; Loading Loading @@ -201,10 +201,12 @@ public final class AppSearchImpl implements Closeable { public static AppSearchImpl create( @NonNull File icingDir, @NonNull Context userContext, @Nullable AppSearchLogger logger) @Nullable AppSearchLogger logger, @NonNull OptimizeStrategy optimizeStrategy) throws AppSearchException { Objects.requireNonNull(icingDir); Objects.requireNonNull(userContext); Objects.requireNonNull(optimizeStrategy); long totalLatencyStartMillis = SystemClock.elapsedRealtime(); InitializeStats.Builder initStatsBuilder = null; Loading @@ -212,7 +214,9 @@ public final class AppSearchImpl implements Closeable { initStatsBuilder = new InitializeStats.Builder(); } AppSearchImpl appSearchImpl = new AppSearchImpl(icingDir, userContext, initStatsBuilder); AppSearchImpl appSearchImpl = new AppSearchImpl( icingDir, userContext, initStatsBuilder, optimizeStrategy); long prepareVisibilityStoreLatencyStartMillis = SystemClock.elapsedRealtime(); appSearchImpl.initializeVisibilityStore(); Loading @@ -236,7 +240,8 @@ public final class AppSearchImpl implements Closeable { private AppSearchImpl( @NonNull File icingDir, @NonNull Context userContext, @Nullable InitializeStats.Builder initStatsBuilder) @Nullable InitializeStats.Builder initStatsBuilder, @NonNull OptimizeStrategy optimizeStrategy) throws AppSearchException { mReadWriteLock.writeLock().lock(); Loading @@ -254,6 +259,7 @@ public final class AppSearchImpl implements Closeable { Objects.hashCode(mIcingSearchEngineLocked)); mVisibilityStoreLocked = new VisibilityStore(this, userContext); mOptimizeStrategy = optimizeStrategy; // The core initialization procedure. If any part of this fails, we bail into // resetLocked(), deleting all data (but hopefully allowing AppSearchImpl to come up). Loading Loading @@ -646,9 +652,7 @@ public final class AppSearchImpl implements Closeable { // Logging stats if (pStatsBuilder != null) { pStatsBuilder .getGeneralStatsBuilder() .setStatusCode(statusProtoToResultCode(putResultProto.getStatus())); pStatsBuilder .setStatusCode(statusProtoToResultCode(putResultProto.getStatus())) .setGenerateDocumentProtoLatencyMillis( (int) (generateDocumentProtoEndTimeMillis Loading @@ -667,9 +671,8 @@ public final class AppSearchImpl implements Closeable { if (logger != null) { long totalEndTimeMillis = SystemClock.elapsedRealtime(); pStatsBuilder .getGeneralStatsBuilder() .setTotalLatencyMillis((int) (totalEndTimeMillis - totalStartTimeMillis)); pStatsBuilder.setTotalLatencyMillis( (int) (totalEndTimeMillis - totalStartTimeMillis)); logger.logStats(pStatsBuilder.build()); } } Loading Loading @@ -812,7 +815,8 @@ public final class AppSearchImpl implements Closeable { * * @param queryExpression Query String to search. * @param searchSpec Spec for setting filters, raw query etc. * @param callerPackageName Package name of the caller, should belong to the {@code callerUid}. * @param callerPackageName Package name of the caller, should belong to the {@code * userContext}. * @param callerUid UID of the client making the globalQuery call. * @param logger logger to collect globalQuery stats * @return The results of performing this search. It may contain an empty list of results if no Loading Loading @@ -2001,7 +2005,7 @@ public final class AppSearchImpl implements Closeable { * resources that could be released. * * <p>{@link IcingSearchEngine#optimize()} should be called only if {@link * GetOptimizeInfoResultProto} shows there is enough resources could be released. * OptimizeStrategy#shouldOptimize(GetOptimizeInfoResultProto)} return true. */ public void checkForOptimize() throws AppSearchException { mReadWriteLock.writeLock().lock(); Loading @@ -2009,9 +2013,7 @@ public final class AppSearchImpl implements Closeable { GetOptimizeInfoResultProto optimizeInfo = getOptimizeInfoResultLocked(); checkSuccess(optimizeInfo.getStatus()); mOptimizeIntervalCountLocked = 0; // Second threshold, decide when to call optimize(). if (optimizeInfo.getOptimizableDocs() >= OPTIMIZE_THRESHOLD_DOC_COUNT || optimizeInfo.getEstimatedOptimizableBytes() >= OPTIMIZE_THRESHOLD_BYTES) { if (mOptimizeStrategy.shouldOptimize(optimizeInfo)) { optimize(); } } finally { Loading @@ -2022,11 +2024,7 @@ public final class AppSearchImpl implements Closeable { // go/icing-library-apis. } /** * Triggers {@link IcingSearchEngine#optimize()} directly. * * <p>This method should be only called as a scheduled task in AppSearch Platform backend. */ /** Triggers {@link IcingSearchEngine#optimize()} directly. */ public void optimize() throws AppSearchException { mReadWriteLock.writeLock().lock(); try { Loading apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java 0 → 100644 +44 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.appsearch.external.localstorage; import android.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.google.android.icing.proto.GetOptimizeInfoResultProto; /** * An implementation of {@link OptimizeStrategy} will determine when to trigger {@link * AppSearchImpl#optimize()} in Jetpack environment. * * @hide */ public class FrameworkOptimizeStrategy implements OptimizeStrategy { @VisibleForTesting static final int DOC_COUNT_OPTIMIZE_THRESHOLD = 100_000; @VisibleForTesting static final int BYTES_OPTIMIZE_THRESHOLD = 1 * 1024 * 1024 * 1024; // 1GB @VisibleForTesting static final long TIME_OPTIMIZE_THRESHOLD_MILLIS = 7 * 24 * 60 * 60 * 1000; // 1 week @Override public boolean shouldOptimize(@NonNull GetOptimizeInfoResultProto optimizeInfo) { return optimizeInfo.getOptimizableDocs() >= DOC_COUNT_OPTIMIZE_THRESHOLD || optimizeInfo.getEstimatedOptimizableBytes() >= BYTES_OPTIMIZE_THRESHOLD || optimizeInfo.getTimeSinceLastOptimizeMs() >= TIME_OPTIMIZE_THRESHOLD_MILLIS; } } Loading
apex/appsearch/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ apex { key: "com.android.appsearch.key", certificate: ":com.android.appsearch.certificate", updatable: false, generate_hashtree: false, } apex_key { Loading
apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +58 −66 Original line number Diff line number Diff line Loading @@ -348,19 +348,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_SET_SCHEMA) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -480,19 +480,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_PUT_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -563,19 +563,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_GET_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -631,19 +631,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -697,20 +697,18 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); // TODO(b/173532925) database would be nulluable once we remove generalStats CallStats.Builder cBuilder = new CallStats.Builder(packageName, /*database=*/ "") logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_GLOBAL_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -965,19 +963,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_ID) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1033,19 +1031,19 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) logger.logStats(new CallStats.Builder() .setPackageName(packageName) .setDatabase(databaseName) .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_REMOVE_DOCUMENTS_BY_SEARCH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1110,19 +1108,17 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); CallStats.Builder cBuilder = new CallStats.Builder(/*packageName=*/ "", /*databaseName=*/ "") logger.logStats(new CallStats.Builder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_FLUSH) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading Loading @@ -1162,21 +1158,17 @@ public class AppSearchManagerService extends SystemService { 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis); int totalLatencyMillis = (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis); // TODO(b/173532925) make packageName and database nullable after // removing generalStats CallStats.Builder cBuilder = new CallStats.Builder(/*packageName=*/"", /*database=*/ "") logger.logStats(new CallStats.Builder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis) .setCallType(CallStats.CALL_TYPE_INITIALIZE) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis(estimatedBinderLatencyMillis) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis(totalLatencyMillis); logger.logStats(cBuilder.build()); .setNumOperationsFailed(operationFailureCount) .build()); } } }); Loading
apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +16 −4 Original line number Diff line number Diff line Loading @@ -24,10 +24,12 @@ import android.content.Context; import android.os.Environment; import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.server.appsearch.external.localstorage.AppSearchImpl; import com.android.server.appsearch.external.localstorage.AppSearchLogger; import com.android.server.appsearch.external.localstorage.FrameworkOptimizeStrategy; import java.io.File; import java.util.Map; Loading @@ -37,9 +39,10 @@ import java.util.Objects; * Manages the lifecycle of instances of {@link AppSearchImpl}. * * <p>These instances are managed per unique device-user. * @hide */ public final class ImplInstanceManager { private static final String APP_SEARCH_DIR = "appSearch"; private static final String TAG = "AppSearchImplInstanceMa"; private static ImplInstanceManager sImplInstanceManager; Loading Loading @@ -70,8 +73,11 @@ public final class ImplInstanceManager { * <p>This folder should only be accessed after unlock. */ public static File getAppSearchDir(@NonNull UserHandle userHandle) { return new File( Environment.getDataSystemCeDirectory(userHandle.getIdentifier()), APP_SEARCH_DIR); // Duplicates the implementation of Environment#getDataSystemCeDirectory // TODO(b/191059409): Unhide Environment#getDataSystemCeDirectory and switch to it. File systemCeDir = new File(Environment.getDataDirectory(), "system_ce"); File systemCeUserDir = new File(systemCeDir, String.valueOf(userHandle.getIdentifier())); return new File(systemCeUserDir, "appSearch"); } /** Loading Loading @@ -153,6 +159,12 @@ public final class ImplInstanceManager { @Nullable AppSearchLogger logger) throws AppSearchException { File appSearchDir = getAppSearchDir(userHandle); return AppSearchImpl.create(appSearchDir, userContext, /*logger=*/ null); File icingDir = new File(appSearchDir, "icing"); Log.i(TAG, "Creating new AppSearch instance at: " + icingDir); return AppSearchImpl.create( icingDir, userContext, /*logger=*/ null, new FrameworkOptimizeStrategy()); } }
apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/AppSearchImpl.java +19 −21 Original line number Diff line number Diff line Loading @@ -145,14 +145,14 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; public final class AppSearchImpl implements Closeable { private static final String TAG = "AppSearchImpl"; @VisibleForTesting static final int OPTIMIZE_THRESHOLD_DOC_COUNT = 1000; @VisibleForTesting static final int OPTIMIZE_THRESHOLD_BYTES = 1_000_000; // 1MB @VisibleForTesting static final int CHECK_OPTIMIZE_INTERVAL = 100; private final ReadWriteLock mReadWriteLock = new ReentrantReadWriteLock(); private final LogUtil mLogUtil = new LogUtil(TAG); private final OptimizeStrategy mOptimizeStrategy; @GuardedBy("mReadWriteLock") @VisibleForTesting final IcingSearchEngine mIcingSearchEngineLocked; Loading Loading @@ -201,10 +201,12 @@ public final class AppSearchImpl implements Closeable { public static AppSearchImpl create( @NonNull File icingDir, @NonNull Context userContext, @Nullable AppSearchLogger logger) @Nullable AppSearchLogger logger, @NonNull OptimizeStrategy optimizeStrategy) throws AppSearchException { Objects.requireNonNull(icingDir); Objects.requireNonNull(userContext); Objects.requireNonNull(optimizeStrategy); long totalLatencyStartMillis = SystemClock.elapsedRealtime(); InitializeStats.Builder initStatsBuilder = null; Loading @@ -212,7 +214,9 @@ public final class AppSearchImpl implements Closeable { initStatsBuilder = new InitializeStats.Builder(); } AppSearchImpl appSearchImpl = new AppSearchImpl(icingDir, userContext, initStatsBuilder); AppSearchImpl appSearchImpl = new AppSearchImpl( icingDir, userContext, initStatsBuilder, optimizeStrategy); long prepareVisibilityStoreLatencyStartMillis = SystemClock.elapsedRealtime(); appSearchImpl.initializeVisibilityStore(); Loading @@ -236,7 +240,8 @@ public final class AppSearchImpl implements Closeable { private AppSearchImpl( @NonNull File icingDir, @NonNull Context userContext, @Nullable InitializeStats.Builder initStatsBuilder) @Nullable InitializeStats.Builder initStatsBuilder, @NonNull OptimizeStrategy optimizeStrategy) throws AppSearchException { mReadWriteLock.writeLock().lock(); Loading @@ -254,6 +259,7 @@ public final class AppSearchImpl implements Closeable { Objects.hashCode(mIcingSearchEngineLocked)); mVisibilityStoreLocked = new VisibilityStore(this, userContext); mOptimizeStrategy = optimizeStrategy; // The core initialization procedure. If any part of this fails, we bail into // resetLocked(), deleting all data (but hopefully allowing AppSearchImpl to come up). Loading Loading @@ -646,9 +652,7 @@ public final class AppSearchImpl implements Closeable { // Logging stats if (pStatsBuilder != null) { pStatsBuilder .getGeneralStatsBuilder() .setStatusCode(statusProtoToResultCode(putResultProto.getStatus())); pStatsBuilder .setStatusCode(statusProtoToResultCode(putResultProto.getStatus())) .setGenerateDocumentProtoLatencyMillis( (int) (generateDocumentProtoEndTimeMillis Loading @@ -667,9 +671,8 @@ public final class AppSearchImpl implements Closeable { if (logger != null) { long totalEndTimeMillis = SystemClock.elapsedRealtime(); pStatsBuilder .getGeneralStatsBuilder() .setTotalLatencyMillis((int) (totalEndTimeMillis - totalStartTimeMillis)); pStatsBuilder.setTotalLatencyMillis( (int) (totalEndTimeMillis - totalStartTimeMillis)); logger.logStats(pStatsBuilder.build()); } } Loading Loading @@ -812,7 +815,8 @@ public final class AppSearchImpl implements Closeable { * * @param queryExpression Query String to search. * @param searchSpec Spec for setting filters, raw query etc. * @param callerPackageName Package name of the caller, should belong to the {@code callerUid}. * @param callerPackageName Package name of the caller, should belong to the {@code * userContext}. * @param callerUid UID of the client making the globalQuery call. * @param logger logger to collect globalQuery stats * @return The results of performing this search. It may contain an empty list of results if no Loading Loading @@ -2001,7 +2005,7 @@ public final class AppSearchImpl implements Closeable { * resources that could be released. * * <p>{@link IcingSearchEngine#optimize()} should be called only if {@link * GetOptimizeInfoResultProto} shows there is enough resources could be released. * OptimizeStrategy#shouldOptimize(GetOptimizeInfoResultProto)} return true. */ public void checkForOptimize() throws AppSearchException { mReadWriteLock.writeLock().lock(); Loading @@ -2009,9 +2013,7 @@ public final class AppSearchImpl implements Closeable { GetOptimizeInfoResultProto optimizeInfo = getOptimizeInfoResultLocked(); checkSuccess(optimizeInfo.getStatus()); mOptimizeIntervalCountLocked = 0; // Second threshold, decide when to call optimize(). if (optimizeInfo.getOptimizableDocs() >= OPTIMIZE_THRESHOLD_DOC_COUNT || optimizeInfo.getEstimatedOptimizableBytes() >= OPTIMIZE_THRESHOLD_BYTES) { if (mOptimizeStrategy.shouldOptimize(optimizeInfo)) { optimize(); } } finally { Loading @@ -2022,11 +2024,7 @@ public final class AppSearchImpl implements Closeable { // go/icing-library-apis. } /** * Triggers {@link IcingSearchEngine#optimize()} directly. * * <p>This method should be only called as a scheduled task in AppSearch Platform backend. */ /** Triggers {@link IcingSearchEngine#optimize()} directly. */ public void optimize() throws AppSearchException { mReadWriteLock.writeLock().lock(); try { Loading
apex/appsearch/service/java/com/android/server/appsearch/external/localstorage/FrameworkOptimizeStrategy.java 0 → 100644 +44 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.appsearch.external.localstorage; import android.annotation.NonNull; import com.android.internal.annotations.VisibleForTesting; import com.google.android.icing.proto.GetOptimizeInfoResultProto; /** * An implementation of {@link OptimizeStrategy} will determine when to trigger {@link * AppSearchImpl#optimize()} in Jetpack environment. * * @hide */ public class FrameworkOptimizeStrategy implements OptimizeStrategy { @VisibleForTesting static final int DOC_COUNT_OPTIMIZE_THRESHOLD = 100_000; @VisibleForTesting static final int BYTES_OPTIMIZE_THRESHOLD = 1 * 1024 * 1024 * 1024; // 1GB @VisibleForTesting static final long TIME_OPTIMIZE_THRESHOLD_MILLIS = 7 * 24 * 60 * 60 * 1000; // 1 week @Override public boolean shouldOptimize(@NonNull GetOptimizeInfoResultProto optimizeInfo) { return optimizeInfo.getOptimizableDocs() >= DOC_COUNT_OPTIMIZE_THRESHOLD || optimizeInfo.getEstimatedOptimizableBytes() >= BYTES_OPTIMIZE_THRESHOLD || optimizeInfo.getTimeSinceLastOptimizeMs() >= TIME_OPTIMIZE_THRESHOLD_MILLIS; } }