Loading services/core/java/com/android/server/content/SyncManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ import com.android.server.backup.AccountSyncSettingsBackupHelper; import com.android.server.content.SyncStorageEngine.AuthorityInfo; import com.android.server.content.SyncStorageEngine.EndPoint; import com.android.server.content.SyncStorageEngine.OnSyncRequestListener; import com.android.server.job.JobSchedulerInternal.JobStorePersistStats; import java.io.FileDescriptor; import java.io.PrintWriter; Loading Loading @@ -403,12 +404,21 @@ public class SyncManager { return (networkInfo != null) && networkInfo.isConnected(); } private String getJobStats() { JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class); return "JobStats: " + ((js == null) ? "(JobSchedulerInternal==null)" : js.getPersistStats().toString()); } private BroadcastReceiver mShutdownIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.w(TAG, "Writing sync state before shutdown..."); getSyncStorageEngine().writeAllState(); mLogger.log(getJobStats()); mLogger.log("Shutting down."); } }; Loading Loading @@ -504,13 +514,11 @@ public class SyncManager { } } } final int totalJobs = (mJobSchedulerInternal == null) ? -1 : mJobSchedulerInternal.countJobs(); final String summary = "Loaded persisted syncs: " + numPersistedPeriodicSyncs + " periodic syncs, " + numPersistedOneshotSyncs + " oneshot syncs, " + (pendingJobs.size()) + " total system server jobs, " + totalJobs + " total jobs."; + getJobStats(); Slog.i(TAG, summary); mLogger.log(summary); Loading Loading @@ -720,7 +728,7 @@ public class SyncManager { // the account (they run before) which is the genie is out of the bottle. whiteListExistingSyncAdaptersIfNeeded(); mLogger.log("Sync manager initialized."); mLogger.log("Sync manager initialized: " + Build.FINGERPRINT); } public void onStartUser(int userHandle) { Loading services/core/java/com/android/server/job/JobSchedulerInternal.java +38 −2 Original line number Diff line number Diff line Loading @@ -38,8 +38,44 @@ public interface JobSchedulerInternal { void removeBackingUpUid(int uid); void clearAllBackingUpUids(); JobStorePersistStats getPersistStats(); /** * @return the total number of jobs across all UIDs. * Stats about the first load after boot and the most recent save. * STOPSHIP Remove it and the relevant code once b/64536115 is fixed. */ int countJobs(); public class JobStorePersistStats { public int countAllJobsLoaded = -1; public int countSystemServerJobsLoaded = -1; public int countSystemSyncManagerJobsLoaded = -1; public int countAllJobsSaved = -1; public int countSystemServerJobsSaved = -1; public int countSystemSyncManagerJobsSaved = -1; public JobStorePersistStats() { } public JobStorePersistStats(JobStorePersistStats source) { countAllJobsLoaded = source.countAllJobsLoaded; countSystemServerJobsLoaded = source.countSystemServerJobsLoaded; countSystemSyncManagerJobsLoaded = source.countSystemSyncManagerJobsLoaded; countAllJobsSaved = source.countAllJobsSaved; countSystemServerJobsSaved = source.countSystemServerJobsSaved; countSystemSyncManagerJobsSaved = source.countSystemSyncManagerJobsSaved; } @Override public String toString() { return "FirstLoad: " + countAllJobsLoaded + "/" + countSystemServerJobsLoaded + "/" + countSystemSyncManagerJobsLoaded + " LastSave: " + countAllJobsSaved + "/" + countSystemServerJobsSaved + "/" + countSystemSyncManagerJobsSaved; } } } services/core/java/com/android/server/job/JobSchedulerService.java +10 −9 Original line number Diff line number Diff line Loading @@ -782,6 +782,11 @@ public final class JobSchedulerService extends com.android.server.SystemService * */ public void cancelJobsForUid(int uid, String reason) { if (uid == Process.SYSTEM_UID) { // This really shouldn't happen. Slog.wtfStack(TAG, "cancelJobsForUid() called for system uid"); return; } synchronized (mLock) { final List<JobStatus> jobsForUid = mJobs.getJobsByUid(uid); for (int i=0; i<jobsForUid.size(); i++) { Loading Loading @@ -1837,9 +1842,9 @@ public final class JobSchedulerService extends com.android.server.SystemService } @Override public int countJobs() { public JobStorePersistStats getPersistStats() { synchronized (mLock) { return mJobs.size(); return new JobStorePersistStats(mJobs.getPersistStats()); } } } Loading Loading @@ -2022,13 +2027,6 @@ public final class JobSchedulerService extends com.android.server.SystemService @Override public void cancelAll() throws RemoteException { final int uid = Binder.getCallingUid(); switch (uid) { case Process.SYSTEM_UID: // This really shouldn't happen. Slog.wtf(TAG, "JobScheduler.cancelAll() called for uid=" + uid); return; } long ident = Binder.clearCallingIdentity(); try { JobSchedulerService.this.cancelJobsForUid(uid, "cancelAll() called by app"); Loading Loading @@ -2470,6 +2468,9 @@ public final class JobSchedulerService extends com.android.server.SystemService pw.print("mReportedActive="); pw.println(mReportedActive); pw.print("mMaxActiveJobs="); pw.println(mMaxActiveJobs); } pw.println(); pw.print("PersistStats: "); pw.println(mJobs.getPersistStats()); } pw.println(); } Loading services/core/java/com/android/server/job/JobStore.java +43 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.Context; import android.os.Environment; import android.os.Handler; import android.os.PersistableBundle; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.text.format.DateUtils; Loading @@ -38,6 +39,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.server.IoThread; import com.android.server.job.JobSchedulerInternal.JobStorePersistStats; import com.android.server.job.controllers.JobStatus; import java.io.ByteArrayOutputStream; Loading Loading @@ -89,6 +91,8 @@ public final class JobStore { private final Handler mIoHandler = IoThread.getHandler(); private static JobStore sSingleton; private JobStorePersistStats mPersistInfo = new JobStorePersistStats(); /** Used by the {@link JobSchedulerService} to instantiate the JobStore. */ static JobStore initAndGet(JobSchedulerService jobManagerService) { synchronized (sSingletonLock) { Loading Loading @@ -199,6 +203,10 @@ public final class JobStore { return mJobSet.size(); } public JobStorePersistStats getPersistStats() { return mPersistInfo; } public int countJobsForUid(int uid) { return mJobSet.countJobsForUid(uid); } Loading Loading @@ -336,6 +344,9 @@ public final class JobStore { } private void writeJobsMapImpl(List<JobStatus> jobList) { int numJobs = 0; int numSystemJobs = 0; int numSyncJobs = 0; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); XmlSerializer out = new FastXmlSerializer(); Loading @@ -356,6 +367,14 @@ public final class JobStore { writeExecutionCriteriaToXml(out, jobStatus); writeBundleToXml(jobStatus.getJob().getExtras(), out); out.endTag(null, "job"); numJobs++; if (jobStatus.getUid() == Process.SYSTEM_UID) { numSystemJobs++; if (isSyncJob(jobStatus)) { numSyncJobs++; } } } out.endTag(null, "job-info"); out.endDocument(); Loading @@ -373,6 +392,10 @@ public final class JobStore { if (DEBUG) { Slog.d(TAG, "Error persisting bundle.", e); } } finally { mPersistInfo.countAllJobsSaved = numJobs; mPersistInfo.countSystemServerJobsSaved = numSystemJobs; mPersistInfo.countSystemSyncManagerJobsSaved = numSyncJobs; } } Loading Loading @@ -525,6 +548,11 @@ public final class JobStore { return Pair.create(earliest, latest); } private static boolean isSyncJob(JobStatus status) { return com.android.server.content.SyncJobService.class.getName() .equals(status.getServiceComponent().getClassName()); } /** * Runnable that reads list of persisted job from xml. This is run once at start up, so doesn't * need to go through {@link JobStore#add(com.android.server.job.controllers.JobStatus)}. Loading @@ -545,6 +573,8 @@ public final class JobStore { @Override public void run() { int numJobs = 0; int numSystemJobs = 0; int numSyncJobs = 0; try { List<JobStatus> jobs; FileInputStream fis = mJobsFile.openRead(); Loading @@ -558,7 +588,14 @@ public final class JobStore { js.prepareLocked(am); js.enqueueTime = now; this.jobSet.add(js); numJobs++; if (js.getUid() == Process.SYSTEM_UID) { numSystemJobs++; if (isSyncJob(js)) { numSyncJobs++; } } } } } Loading @@ -569,6 +606,12 @@ public final class JobStore { } } catch (XmlPullParserException | IOException e) { Slog.wtf(TAG, "Error jobstore xml.", e); } finally { if (mPersistInfo.countAllJobsLoaded < 0) { // Only set them once. mPersistInfo.countAllJobsLoaded = numJobs; mPersistInfo.countSystemServerJobsLoaded = numSystemJobs; mPersistInfo.countSystemSyncManagerJobsLoaded = numSyncJobs; } } Slog.i(TAG, "Read " + numJobs + " jobs"); } Loading Loading
services/core/java/com/android/server/content/SyncManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ import com.android.server.backup.AccountSyncSettingsBackupHelper; import com.android.server.content.SyncStorageEngine.AuthorityInfo; import com.android.server.content.SyncStorageEngine.EndPoint; import com.android.server.content.SyncStorageEngine.OnSyncRequestListener; import com.android.server.job.JobSchedulerInternal.JobStorePersistStats; import java.io.FileDescriptor; import java.io.PrintWriter; Loading Loading @@ -403,12 +404,21 @@ public class SyncManager { return (networkInfo != null) && networkInfo.isConnected(); } private String getJobStats() { JobSchedulerInternal js = LocalServices.getService(JobSchedulerInternal.class); return "JobStats: " + ((js == null) ? "(JobSchedulerInternal==null)" : js.getPersistStats().toString()); } private BroadcastReceiver mShutdownIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.w(TAG, "Writing sync state before shutdown..."); getSyncStorageEngine().writeAllState(); mLogger.log(getJobStats()); mLogger.log("Shutting down."); } }; Loading Loading @@ -504,13 +514,11 @@ public class SyncManager { } } } final int totalJobs = (mJobSchedulerInternal == null) ? -1 : mJobSchedulerInternal.countJobs(); final String summary = "Loaded persisted syncs: " + numPersistedPeriodicSyncs + " periodic syncs, " + numPersistedOneshotSyncs + " oneshot syncs, " + (pendingJobs.size()) + " total system server jobs, " + totalJobs + " total jobs."; + getJobStats(); Slog.i(TAG, summary); mLogger.log(summary); Loading Loading @@ -720,7 +728,7 @@ public class SyncManager { // the account (they run before) which is the genie is out of the bottle. whiteListExistingSyncAdaptersIfNeeded(); mLogger.log("Sync manager initialized."); mLogger.log("Sync manager initialized: " + Build.FINGERPRINT); } public void onStartUser(int userHandle) { Loading
services/core/java/com/android/server/job/JobSchedulerInternal.java +38 −2 Original line number Diff line number Diff line Loading @@ -38,8 +38,44 @@ public interface JobSchedulerInternal { void removeBackingUpUid(int uid); void clearAllBackingUpUids(); JobStorePersistStats getPersistStats(); /** * @return the total number of jobs across all UIDs. * Stats about the first load after boot and the most recent save. * STOPSHIP Remove it and the relevant code once b/64536115 is fixed. */ int countJobs(); public class JobStorePersistStats { public int countAllJobsLoaded = -1; public int countSystemServerJobsLoaded = -1; public int countSystemSyncManagerJobsLoaded = -1; public int countAllJobsSaved = -1; public int countSystemServerJobsSaved = -1; public int countSystemSyncManagerJobsSaved = -1; public JobStorePersistStats() { } public JobStorePersistStats(JobStorePersistStats source) { countAllJobsLoaded = source.countAllJobsLoaded; countSystemServerJobsLoaded = source.countSystemServerJobsLoaded; countSystemSyncManagerJobsLoaded = source.countSystemSyncManagerJobsLoaded; countAllJobsSaved = source.countAllJobsSaved; countSystemServerJobsSaved = source.countSystemServerJobsSaved; countSystemSyncManagerJobsSaved = source.countSystemSyncManagerJobsSaved; } @Override public String toString() { return "FirstLoad: " + countAllJobsLoaded + "/" + countSystemServerJobsLoaded + "/" + countSystemSyncManagerJobsLoaded + " LastSave: " + countAllJobsSaved + "/" + countSystemServerJobsSaved + "/" + countSystemSyncManagerJobsSaved; } } }
services/core/java/com/android/server/job/JobSchedulerService.java +10 −9 Original line number Diff line number Diff line Loading @@ -782,6 +782,11 @@ public final class JobSchedulerService extends com.android.server.SystemService * */ public void cancelJobsForUid(int uid, String reason) { if (uid == Process.SYSTEM_UID) { // This really shouldn't happen. Slog.wtfStack(TAG, "cancelJobsForUid() called for system uid"); return; } synchronized (mLock) { final List<JobStatus> jobsForUid = mJobs.getJobsByUid(uid); for (int i=0; i<jobsForUid.size(); i++) { Loading Loading @@ -1837,9 +1842,9 @@ public final class JobSchedulerService extends com.android.server.SystemService } @Override public int countJobs() { public JobStorePersistStats getPersistStats() { synchronized (mLock) { return mJobs.size(); return new JobStorePersistStats(mJobs.getPersistStats()); } } } Loading Loading @@ -2022,13 +2027,6 @@ public final class JobSchedulerService extends com.android.server.SystemService @Override public void cancelAll() throws RemoteException { final int uid = Binder.getCallingUid(); switch (uid) { case Process.SYSTEM_UID: // This really shouldn't happen. Slog.wtf(TAG, "JobScheduler.cancelAll() called for uid=" + uid); return; } long ident = Binder.clearCallingIdentity(); try { JobSchedulerService.this.cancelJobsForUid(uid, "cancelAll() called by app"); Loading Loading @@ -2470,6 +2468,9 @@ public final class JobSchedulerService extends com.android.server.SystemService pw.print("mReportedActive="); pw.println(mReportedActive); pw.print("mMaxActiveJobs="); pw.println(mMaxActiveJobs); } pw.println(); pw.print("PersistStats: "); pw.println(mJobs.getPersistStats()); } pw.println(); } Loading
services/core/java/com/android/server/job/JobStore.java +43 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.content.Context; import android.os.Environment; import android.os.Handler; import android.os.PersistableBundle; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.text.format.DateUtils; Loading @@ -38,6 +39,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.server.IoThread; import com.android.server.job.JobSchedulerInternal.JobStorePersistStats; import com.android.server.job.controllers.JobStatus; import java.io.ByteArrayOutputStream; Loading Loading @@ -89,6 +91,8 @@ public final class JobStore { private final Handler mIoHandler = IoThread.getHandler(); private static JobStore sSingleton; private JobStorePersistStats mPersistInfo = new JobStorePersistStats(); /** Used by the {@link JobSchedulerService} to instantiate the JobStore. */ static JobStore initAndGet(JobSchedulerService jobManagerService) { synchronized (sSingletonLock) { Loading Loading @@ -199,6 +203,10 @@ public final class JobStore { return mJobSet.size(); } public JobStorePersistStats getPersistStats() { return mPersistInfo; } public int countJobsForUid(int uid) { return mJobSet.countJobsForUid(uid); } Loading Loading @@ -336,6 +344,9 @@ public final class JobStore { } private void writeJobsMapImpl(List<JobStatus> jobList) { int numJobs = 0; int numSystemJobs = 0; int numSyncJobs = 0; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); XmlSerializer out = new FastXmlSerializer(); Loading @@ -356,6 +367,14 @@ public final class JobStore { writeExecutionCriteriaToXml(out, jobStatus); writeBundleToXml(jobStatus.getJob().getExtras(), out); out.endTag(null, "job"); numJobs++; if (jobStatus.getUid() == Process.SYSTEM_UID) { numSystemJobs++; if (isSyncJob(jobStatus)) { numSyncJobs++; } } } out.endTag(null, "job-info"); out.endDocument(); Loading @@ -373,6 +392,10 @@ public final class JobStore { if (DEBUG) { Slog.d(TAG, "Error persisting bundle.", e); } } finally { mPersistInfo.countAllJobsSaved = numJobs; mPersistInfo.countSystemServerJobsSaved = numSystemJobs; mPersistInfo.countSystemSyncManagerJobsSaved = numSyncJobs; } } Loading Loading @@ -525,6 +548,11 @@ public final class JobStore { return Pair.create(earliest, latest); } private static boolean isSyncJob(JobStatus status) { return com.android.server.content.SyncJobService.class.getName() .equals(status.getServiceComponent().getClassName()); } /** * Runnable that reads list of persisted job from xml. This is run once at start up, so doesn't * need to go through {@link JobStore#add(com.android.server.job.controllers.JobStatus)}. Loading @@ -545,6 +573,8 @@ public final class JobStore { @Override public void run() { int numJobs = 0; int numSystemJobs = 0; int numSyncJobs = 0; try { List<JobStatus> jobs; FileInputStream fis = mJobsFile.openRead(); Loading @@ -558,7 +588,14 @@ public final class JobStore { js.prepareLocked(am); js.enqueueTime = now; this.jobSet.add(js); numJobs++; if (js.getUid() == Process.SYSTEM_UID) { numSystemJobs++; if (isSyncJob(js)) { numSyncJobs++; } } } } } Loading @@ -569,6 +606,12 @@ public final class JobStore { } } catch (XmlPullParserException | IOException e) { Slog.wtf(TAG, "Error jobstore xml.", e); } finally { if (mPersistInfo.countAllJobsLoaded < 0) { // Only set them once. mPersistInfo.countAllJobsLoaded = numJobs; mPersistInfo.countSystemServerJobsLoaded = numSystemJobs; mPersistInfo.countSystemSyncManagerJobsLoaded = numSyncJobs; } } Slog.i(TAG, "Read " + numJobs + " jobs"); } Loading