diff options
author | 2024-05-11 03:03:06 +0000 | |
---|---|---|
committer | 2024-05-15 15:21:40 +0000 | |
commit | b240b52bd4b0061e88b2c5baea7a81940f52c285 (patch) | |
tree | add3a115451a148297b6161602cdb3085f98d656 /apex | |
parent | c0672ad468b9bb98078fbe585a9b2c1ea0eec0a2 (diff) |
JobSchedulerService: Add trace for quota tracking.
Bug: 300862949
Test: build/trace
Change-Id: I979322f56d0aee8548292dd380d64b7f6dbb750a
Diffstat (limited to 'apex')
4 files changed, 81 insertions, 23 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 5d1433c815d6..30da1e7c0696 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -80,6 +80,7 @@ import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.SystemClock; +import android.os.Trace; import android.os.UserHandle; import android.os.WorkSource; import android.os.storage.StorageManagerInternal; @@ -179,6 +180,8 @@ public class JobSchedulerService extends com.android.server.SystemService public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final boolean DEBUG_STANDBY = DEBUG || false; + public static final String TRACE_TRACK_NAME = "JobScheduler"; + /** The maximum number of jobs that we allow an app to schedule */ private static final int MAX_JOBS_PER_APP = 150; /** The number of the most recently completed jobs to keep track of for debugging purposes. */ @@ -4348,7 +4351,11 @@ public class JobSchedulerService extends com.android.server.SystemService final boolean wasConsideredCharging = isConsideredCharging(); mChargingPolicy = newPolicy; - + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + "CHARGING POLICY CHANGED#" + mChargingPolicy); + } if (isConsideredCharging() != wasConsideredCharging) { for (int c = mControllers.size() - 1; c >= 0; --c) { mControllers.get(c).onBatteryStateChangedLocked(); diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index 39d50f53d2c4..d65a66c83fcc 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -535,29 +535,17 @@ public final class JobServiceContext implements ServiceConnection { sEnqueuedJwiAtJobStart.logSampleWithUid(job.getUid(), job.getWorkCount()); final String sourcePackage = job.getSourcePackageName(); if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { - final String componentPackage = job.getServiceComponent().getPackageName(); - String traceTag = "*job*<" + job.getSourceUid() + ">" + sourcePackage; - if (!sourcePackage.equals(componentPackage)) { - traceTag += ":" + componentPackage; - } - traceTag += "/" + job.getServiceComponent().getShortClassName(); - if (!componentPackage.equals(job.serviceProcessName)) { - traceTag += "$" + job.serviceProcessName; - } - if (job.getNamespace() != null) { - traceTag += "@" + job.getNamespace(); - } - traceTag += "#" + job.getJobId(); - // Use the context's ID to distinguish traces since there'll only be one job // running per context. - Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "JobScheduler", - traceTag, getId()); + Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, job.computeSystemTraceTag(), + getId()); } if (job.getAppTraceTag() != null) { // Use the job's ID to distinguish traces since the ID will be unique per app. - Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, "JobScheduler", - job.getAppTraceTag(), job.getJobId()); + Trace.asyncTraceForTrackBegin(Trace.TRACE_TAG_APP, + JobSchedulerService.TRACE_TRACK_NAME, job.getAppTraceTag(), + job.getJobId()); } try { mBatteryStats.noteJobStart(job.getBatteryName(), job.getSourceUid()); @@ -1605,12 +1593,12 @@ public final class JobServiceContext implements ServiceConnection { completedJob.getFilteredTraceTag(), completedJob.getFilteredDebugTags()); if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { - Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_SYSTEM_SERVER, "JobScheduler", - getId()); + Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, getId()); } if (completedJob.getAppTraceTag() != null) { - Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, "JobScheduler", - completedJob.getJobId()); + Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, + JobSchedulerService.TRACE_TRACK_NAME, completedJob.getJobId()); } try { mBatteryStats.noteJobFinish(mRunningJob.getBatteryName(), mRunningJob.getSourceUid(), diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index 7fca867356af..e3af1d894762 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -572,6 +572,9 @@ public final class JobStatus { /** The reason a job most recently went from ready to not ready. */ private int mReasonReadyToUnready = JobParameters.STOP_REASON_UNDEFINED; + /** The system trace tag for this job. */ + private String mSystemTraceTag; + /** * Core constructor for JobStatus instances. All other ctors funnel down to this one. * @@ -1058,6 +1061,38 @@ public final class JobStatus { return job.getTraceTag(); } + /** Returns a trace tag using debug information provided by job scheduler service. */ + @NonNull + public String computeSystemTraceTag() { + // Guarded by JobSchedulerService.mLock, no need for synchronization. + if (mSystemTraceTag != null) { + return mSystemTraceTag; + } + + mSystemTraceTag = computeSystemTraceTagInner(); + return mSystemTraceTag; + } + + @NonNull + private String computeSystemTraceTagInner() { + final String componentPackage = getServiceComponent().getPackageName(); + StringBuilder traceTag = new StringBuilder(128); + traceTag.append("*job*<").append(sourceUid).append(">").append(sourcePackageName); + if (!sourcePackageName.equals(componentPackage)) { + traceTag.append(":").append(componentPackage); + } + traceTag.append("/").append(getServiceComponent().getShortClassName()); + if (!componentPackage.equals(serviceProcessName)) { + traceTag.append("$").append(serviceProcessName); + } + if (mNamespace != null && !mNamespace.trim().isEmpty()) { + traceTag.append("@").append(mNamespace); + } + traceTag.append("#").append(getJobId()); + + return traceTag.toString(); + } + /** Returns whether this job was scheduled by one app on behalf of another. */ public boolean isProxyJob() { return mIsProxyJob; diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java index c240b3f423a9..a1c72fb4c06c 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java @@ -50,6 +50,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; +import android.os.Trace; import android.os.UserHandle; import android.provider.DeviceConfig; import android.util.ArraySet; @@ -2181,6 +2182,12 @@ public final class QuotaController extends StateController { } scheduleCutoff(); } + } else { + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + "QC/- " + mPkg); + } } } @@ -2720,6 +2727,11 @@ public final class QuotaController extends StateController { if (timeRemainingMs <= 50) { // Less than 50 milliseconds left. Start process of shutting down jobs. if (DEBUG) Slog.d(TAG, pkg + " has reached its quota."); + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + pkg + "#" + MSG_REACHED_TIME_QUOTA); + } mStateChangedListener.onControllerStateChanged( maybeUpdateConstraintForPkgLocked( sElapsedRealtimeClock.millis(), @@ -2748,6 +2760,11 @@ public final class QuotaController extends StateController { pkg.userId, pkg.packageName); if (timeRemainingMs <= 0) { if (DEBUG) Slog.d(TAG, pkg + " has reached its EJ quota."); + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + pkg + "#" + MSG_REACHED_EJ_TIME_QUOTA); + } mStateChangedListener.onControllerStateChanged( maybeUpdateConstraintForPkgLocked( sElapsedRealtimeClock.millis(), @@ -2772,6 +2789,12 @@ public final class QuotaController extends StateController { Slog.d(TAG, pkg + " has reached its count quota."); } + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + pkg + "#" + MSG_REACHED_COUNT_QUOTA); + } + mStateChangedListener.onControllerStateChanged( maybeUpdateConstraintForPkgLocked( sElapsedRealtimeClock.millis(), @@ -2928,6 +2951,11 @@ public final class QuotaController extends StateController { } mTempAllowlistGraceCache.delete(uid); mTopAppGraceCache.delete(uid); + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.instantForTrack(Trace.TRACE_TAG_SYSTEM_SERVER, + JobSchedulerService.TRACE_TRACK_NAME, + "<" + uid + ">#" + MSG_END_GRACE_PERIOD); + } final ArraySet<String> packages = mService.getPackagesForUidLocked(uid); if (packages != null) { final int userId = UserHandle.getUserId(uid); |