From 0f32717a17307ee581381d7f8527b686aacb3ac4 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Wed, 15 Oct 2014 17:49:42 -0700 Subject: [PATCH] Fix spurious restore session timeouts The restore-session idle timeout should not be ticking while we're doing legitimate restore work. We now explicitly stop the timeout ticker [a delayed message on our handler thread] whenever we undertake a valid restore operation. The timer is already correctly resumed when restore operations conclude. (In practice we need to suspend the timeout tracking at exactly those times when we're entering the wakelock-protected restore flow. The timeout is reestablished when the wakelock is released; this part is already in the code.) Bug 17990544 Change-Id: I7318020ce30fd9c35bc3a644f8c101fd3d063c8b --- .../server/backup/BackupManagerService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 3694d61fe4d39..60801fb965b76 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -8857,6 +8857,12 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF Slog.w(TAG, "Null transport getting restore sets"); return -1; } + + // We know we're doing legit work now, so halt the timeout + // until we're done. It gets started again when the result + // comes in. + mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT); + // spin off the transport request to our service thread mWakelock.acquire(); Message msg = mBackupHandler.obtainMessage(MSG_RUN_GET_RESTORE_SETS, @@ -8909,6 +8915,9 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF synchronized (mQueueLock) { for (int i = 0; i < mRestoreSets.length; i++) { if (token == mRestoreSets[i].token) { + // Real work, so stop the session timeout until we finalize the restore + mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT); + long oldId = Binder.clearCallingIdentity(); mWakelock.acquire(); if (MORE_DEBUG) { @@ -8988,6 +8997,9 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF synchronized (mQueueLock) { for (int i = 0; i < mRestoreSets.length; i++) { if (token == mRestoreSets[i].token) { + // Stop the session timeout until we finalize the restore + mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT); + long oldId = Binder.clearCallingIdentity(); mWakelock.acquire(); if (MORE_DEBUG) { @@ -9068,6 +9080,9 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF return -1; } + // Stop the session timeout until we finalize the restore + mBackupHandler.removeMessages(MSG_RESTORE_TIMEOUT); + // Ready to go: enqueue the restore request and claim success long oldId = Binder.clearCallingIdentity(); mWakelock.acquire();