Move system server pullers off background thread
The background thread is prone to severe delays in processing time near
boot, which causes pull timeouts and event queue overflow in statsd. The
vast majority of pullers use the DIRECT_EXECUTOR to execute pulls in the
incoming binder thread, so move these pulled atoms to do the same thing.
More context is in the bug and linked docs.
Bug: 298133385
Test: verified via boot traces that the pull durations are shorter and
that the pulls no longer happen in the background thread
Change-Id: I67a3d583cc13d9547dfe7108897e95f4a5238d26
diff --git a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
index 9d363c8..3af36eb 100644
--- a/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
+++ b/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java
@@ -28,6 +28,7 @@
import static android.os.UserHandle.USER_CURRENT;
import static android.os.UserHandle.USER_NULL;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.server.blob.BlobStoreConfig.INVALID_BLOB_ID;
import static com.android.server.blob.BlobStoreConfig.INVALID_BLOB_SIZE;
import static com.android.server.blob.BlobStoreConfig.LOGV;
@@ -1915,7 +1916,7 @@
mStatsManager.setPullAtomCallback(
FrameworkStatsLog.BLOB_INFO,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}
diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java b/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
index 90a6455a..adb4d85 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/MetricsHelper.java
@@ -16,6 +16,7 @@
package com.android.server.alarm;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__ALLOW_LIST;
import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__CHANGE_DISABLED;
import static com.android.internal.util.FrameworkStatsLog.ALARM_SCHEDULED__EXACT_ALARM_ALLOWED_REASON__LISTENER;
@@ -31,7 +32,6 @@
import android.content.Context;
import android.os.SystemClock;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FrameworkStatsLog;
import java.util.function.Supplier;
@@ -51,7 +51,7 @@
void registerPuller(Supplier<AlarmStore> alarmStoreSupplier) {
final StatsManager statsManager = mContext.getSystemService(StatsManager.class);
statsManager.setPullAtomCallback(FrameworkStatsLog.PENDING_ALARM_INFO, null,
- BackgroundThread.getExecutor(), (atomTag, data) -> {
+ DIRECT_EXECUTOR, (atomTag, data) -> {
if (atomTag != FrameworkStatsLog.PENDING_ALARM_INFO) {
throw new UnsupportedOperationException("Unknown tag" + atomTag);
}
diff --git a/services/core/java/com/android/server/LogMteState.java b/services/core/java/com/android/server/LogMteState.java
index 410dd83..ec0492b 100644
--- a/services/core/java/com/android/server/LogMteState.java
+++ b/services/core/java/com/android/server/LogMteState.java
@@ -16,11 +16,12 @@
package com.android.server;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+
import android.app.StatsManager;
import android.content.Context;
import android.util.StatsEvent;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.os.Zygote;
import com.android.internal.util.FrameworkStatsLog;
@@ -32,7 +33,7 @@
.setPullAtomCallback(
FrameworkStatsLog.MTE_STATE,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
new StatsManager.StatsPullAtomCallback() {
@Override
public int onPullAtom(int atomTag, List<StatsEvent> data) {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 610b8af..60d323a 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -27,6 +27,8 @@
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
import static android.os.BatteryStats.POWER_DATA_UNAVAILABLE;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+
import android.annotation.EnforcePermission;
import android.annotation.NonNull;
import android.annotation.RequiresNoPermission;
@@ -94,7 +96,6 @@
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.os.BinderCallsStats;
import com.android.internal.os.CpuScalingPolicies;
import com.android.internal.os.CpuScalingPolicyReader;
@@ -844,15 +845,15 @@
statsManager.setPullAtomCallback(
FrameworkStatsLog.BATTERY_USAGE_STATS_SINCE_RESET,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(), pullAtomCallback);
+ DIRECT_EXECUTOR, pullAtomCallback);
statsManager.setPullAtomCallback(
FrameworkStatsLog.BATTERY_USAGE_STATS_SINCE_RESET_USING_POWER_PROFILE_MODEL,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(), pullAtomCallback);
+ DIRECT_EXECUTOR, pullAtomCallback);
statsManager.setPullAtomCallback(
FrameworkStatsLog.BATTERY_USAGE_STATS_BEFORE_RESET,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(), pullAtomCallback);
+ DIRECT_EXECUTOR, pullAtomCallback);
}
/** StatsPullAtomCallback for pulling BatteryUsageStats data. */
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 81397b4..905589f 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -25,6 +25,7 @@
import static com.android.internal.R.styleable.GameModeConfig_allowGameFpsOverride;
import static com.android.internal.R.styleable.GameModeConfig_supportsBatteryGameMode;
import static com.android.internal.R.styleable.GameModeConfig_supportsPerformanceGameMode;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import android.Manifest;
import android.annotation.NonNull;
@@ -2087,17 +2088,17 @@
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_INFO,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_CONFIGURATION,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
statsManager.setPullAtomCallback(
FrameworkStatsLog.GAME_MODE_LISTENER,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 6f0a4b4..76eb13b 100755
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -2678,7 +2678,7 @@
mStatsManager.setPullAtomCallback(
DND_MODE_RULE,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ ConcurrentUtils.DIRECT_EXECUTOR,
mPullAtomCallback
);
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index f2797eb..4a6c296 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -23,6 +23,7 @@
import static android.os.UserManager.SYSTEM_USER_MODE_EMULATION_PROPERTY;
import static android.os.UserManager.USER_OPERATION_ERROR_UNKNOWN;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_ABORTED;
import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_UNSPECIFIED;
import static com.android.server.pm.UserJourneyLogger.ERROR_CODE_USER_ALREADY_AN_ADMIN;
@@ -5329,12 +5330,12 @@
statsManager.setPullAtomCallback(
FrameworkStatsLog.USER_INFO,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
statsManager.setPullAtomCallback(
FrameworkStatsLog.MULTI_USER_INFO,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
}
diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java
index 33bed3d..88c2e09 100644
--- a/services/core/java/com/android/server/power/hint/HintManagerService.java
+++ b/services/core/java/com/android/server/power/hint/HintManagerService.java
@@ -16,6 +16,8 @@
package com.android.server.power.hint;
+import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR;
+
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
@@ -37,7 +39,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.os.BackgroundThread;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.Preconditions;
@@ -142,7 +143,7 @@
statsManager.setPullAtomCallback(
FrameworkStatsLog.ADPF_SYSTEM_COMPONENT_INFO,
null, // use default PullAtomMetadata values
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
this::onPullAtom);
}
diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 5d04e5d..97420d0 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -1599,7 +1599,7 @@
mStatsManager.setPullAtomCallback(
tagId,
metadata,
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}
@@ -1612,7 +1612,7 @@
mStatsManager.setPullAtomCallback(
tagId,
metadata,
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}
@@ -1625,7 +1625,7 @@
mStatsManager.setPullAtomCallback(
tagId,
metadata,
- BackgroundThread.getExecutor(),
+ DIRECT_EXECUTOR,
mStatsCallbackImpl
);
}