OSDN Git Service

Fix spurious restore session timeouts
authorChristopher Tate <ctate@google.com>
Thu, 16 Oct 2014 00:49:42 +0000 (17:49 -0700)
committerChristopher Tate <ctate@android.com>
Thu, 16 Oct 2014 01:34:01 +0000 (01:34 +0000)
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

services/backup/java/com/android/server/backup/BackupManagerService.java

index 3694d61..60801fb 100644 (file)
@@ -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();