Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e659fb92 authored by Christopher Tate's avatar Christopher Tate
Browse files

Gracefully handle "needs init" transport errors at finish

Although it's typical for a backup transport to report that it
needs an explicit initialization opportunity when the backup is
initiated, it can sometimes come to pass that the "needs init"
error condition is reported at backup *finish*.  In this case the
framework side was failing to properly reset all of the relevant
state.  The end result was to spin hard forever, holding wakelocks
and continually failing to actually perform the necessary init
operation, possibly continuing even after a reboot.  Fixed.

Bug 5434579

Change-Id: If1d72c338526e4019ea524c48a11e71e44e77f71
parent e47b89ca
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1966,6 +1966,9 @@ class BackupManagerService extends IBackupManager.Stub {
            synchronized (mQueueLock) {
                mBackupRunning = false;
                if (mStatus == BackupConstants.TRANSPORT_NOT_INITIALIZED) {
                    // Make sure we back up everything and perform the one-time init
                    clearMetadata();
                    if (DEBUG) Slog.d(TAG, "Server requires init; rerunning");
                    backupNow();
                }
            }
@@ -1975,6 +1978,12 @@ class BackupManagerService extends IBackupManager.Stub {
            mWakelock.release();
        }

        // Remove the PM metadata state. This will generate an init on the next pass.
        void clearMetadata() {
            final File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
            if (pmState.exists()) pmState.delete();
        }

        // Invoke an agent's doBackup() and start a timeout message spinning on the main
        // handler in case it doesn't get back to us.
        int invokeAgentForBackup(String packageName, IBackupAgent agent,