diff options
3 files changed, 84 insertions, 19 deletions
diff --git a/core/java/android/content/SyncStatusInfo.java b/core/java/android/content/SyncStatusInfo.java index ded11cfd82ef..2d521e9e4e60 100644 --- a/core/java/android/content/SyncStatusInfo.java +++ b/core/java/android/content/SyncStatusInfo.java @@ -28,10 +28,15 @@ import java.util.GregorianCalendar; public class SyncStatusInfo implements Parcelable { private static final String TAG = "Sync"; - static final int VERSION = 5; + static final int VERSION = 6; private static final int MAX_EVENT_COUNT = 10; + /** + * Number of sync sources. KEEP THIS AND SyncStorageEngine.SOURCES IN SYNC. + */ + private static final int SOURCE_COUNT = 6; + public final int authorityId; /** @@ -120,7 +125,10 @@ public class SyncStatusInfo implements Parcelable { public long initialFailureTime; public boolean pending; public boolean initialize; - + + public final long[] perSourceLastSuccessTimes = new long[SOURCE_COUNT]; + public final long[] perSourceLastFailureTimes = new long[SOURCE_COUNT]; + // Warning: It is up to the external caller to ensure there are // no race conditions when accessing this list private ArrayList<Long> periodicSyncTimes; @@ -191,6 +199,10 @@ public class SyncStatusInfo implements Parcelable { todayStats.writeToParcel(parcel); yesterdayStats.writeToParcel(parcel); + + // Version 6. + parcel.writeLongArray(perSourceLastSuccessTimes); + parcel.writeLongArray(perSourceLastFailureTimes); } public SyncStatusInfo(Parcel parcel) { @@ -260,6 +272,10 @@ public class SyncStatusInfo implements Parcelable { todayStats.readFromParcel(parcel); yesterdayStats.readFromParcel(parcel); } + if (version >= 6) { + parcel.readLongArray(perSourceLastSuccessTimes); + parcel.readLongArray(perSourceLastFailureTimes); + } } public SyncStatusInfo(SyncStatusInfo other) { @@ -284,6 +300,13 @@ public class SyncStatusInfo implements Parcelable { } mLastEventTimes.addAll(other.mLastEventTimes); mLastEvents.addAll(other.mLastEvents); + + copy(perSourceLastSuccessTimes, other.perSourceLastSuccessTimes); + copy(perSourceLastFailureTimes, other.perSourceLastFailureTimes); + } + + private static void copy(long[] to, long[] from) { + System.arraycopy(from, 0, to, 0, to.length); } public void setPeriodicSyncTime(int index, long when) { @@ -332,6 +355,34 @@ public class SyncStatusInfo implements Parcelable { return mLastEvents.get(i); } + /** Call this when a sync has succeeded. */ + public void setLastSuccess(int source, long lastSyncTime) { + lastSuccessTime = lastSyncTime; + lastSuccessSource = source; + lastFailureTime = 0; + lastFailureSource = -1; + lastFailureMesg = null; + initialFailureTime = 0; + + if (0 <= source && source < perSourceLastSuccessTimes.length) { + perSourceLastSuccessTimes[source] = lastSyncTime; + } + } + + /** Call this when a sync has failed. */ + public void setLastFailure(int source, long lastSyncTime, String failureMessage) { + lastFailureTime = lastSyncTime; + lastFailureSource = source; + lastFailureMesg = failureMessage; + if (initialFailureTime == 0) { + initialFailureTime = lastSyncTime; + } + + if (0 <= source && source < perSourceLastFailureTimes.length) { + perSourceLastFailureTimes[source] = lastSyncTime; + } + } + public static final Creator<SyncStatusInfo> CREATOR = new Creator<SyncStatusInfo>() { public SyncStatusInfo createFromParcel(Parcel in) { return new SyncStatusInfo(in); @@ -356,7 +407,7 @@ public class SyncStatusInfo implements Parcelable { } /** - * If the last reset was not not today, move today's stats to yesterday's and clear today's. + * If the last reset was not today, move today's stats to yesterday's and clear today's. */ public void maybeResetTodayStats(boolean clockValid, boolean force) { final long now = System.currentTimeMillis(); @@ -391,4 +442,4 @@ public class SyncStatusInfo implements Parcelable { return c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR); } -}
\ No newline at end of file +} diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index decae1865e47..a55870f41571 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -1980,6 +1980,9 @@ public class SyncManager { } static String formatTime(long time) { + if (time == 0) { + return "N/A"; + } Time tobj = new Time(); tobj.set(time); return tobj.format("%Y-%m-%d %H:%M:%S"); @@ -2334,13 +2337,28 @@ public class SyncManager { pw.print("]"); pw.println(); + pw.println(" Per source last syncs:"); + for (int j = 0; j < SyncStorageEngine.SOURCES.length; j++) { + pw.print(" "); + pw.print(String.format("%8s", SyncStorageEngine.SOURCES[j])); + pw.print(" Success: "); + pw.print(formatTime(event.second.perSourceLastSuccessTimes[j])); + + pw.print(" Failure: "); + pw.println(formatTime(event.second.perSourceLastFailureTimes[j])); + } + + pw.println(" Last syncs:"); for (int j = 0; j < event.second.getEventCount(); j++) { - pw.print(" "); + pw.print(" "); pw.print(formatTime(event.second.getEventTime(j))); pw.print(' '); pw.print(event.second.getEvent(j)); pw.println(); } + if (event.second.getEventCount() == 0) { + pw.println(" N/A"); + } } } diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java index f54a9a0c006a..6a343f88a273 100644 --- a/services/core/java/com/android/server/content/SyncStorageEngine.java +++ b/services/core/java/com/android/server/content/SyncStorageEngine.java @@ -128,8 +128,13 @@ public class SyncStorageEngine { public static final long NOT_IN_BACKOFF_MODE = -1; - /** String names for the sync source types. */ - public static final String[] SOURCES = { "OTHER", + /** + * String names for the sync source types. + * + * KEEP THIS AND {@link SyncStatusInfo#SOURCE_COUNT} IN SYNC. + */ + public static final String[] SOURCES = { + "OTHER", "LOCAL", "POLL", "USER", @@ -1231,12 +1236,7 @@ public class SyncStorageEngine { if (status.lastSuccessTime == 0 || status.lastFailureTime != 0) { writeStatusNow = true; } - status.lastSuccessTime = lastSyncTime; - status.lastSuccessSource = item.source; - status.lastFailureTime = 0; - status.lastFailureSource = -1; - status.lastFailureMesg = null; - status.initialFailureTime = 0; + status.setLastSuccess(item.source, lastSyncTime); ds.successCount++; ds.successTime += elapsedTime; } else if (!MESG_CANCELED.equals(resultMessage)) { @@ -1246,12 +1246,8 @@ public class SyncStorageEngine { status.totalStats.numFailures++; status.todayStats.numFailures++; - status.lastFailureTime = lastSyncTime; - status.lastFailureSource = item.source; - status.lastFailureMesg = resultMessage; - if (status.initialFailureTime == 0) { - status.initialFailureTime = lastSyncTime; - } + status.setLastFailure(item.source, lastSyncTime, resultMessage); + ds.failureCount++; ds.failureTime += elapsedTime; } else { |