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

Commit 4e554188 authored by Carmen Agimof's avatar Carmen Agimof
Browse files

Do not try to do a restore at install if the user is not ready for

backup.

Bug: 144155744

This solves a bug which makes staged installs hang. This is
happening because when installing, the PackageManager is waiting for a response to be sent back from
the BackupManagerService after it finishes restoring. In the case of staged installs which happen at boot,
isUserReadyForBackup is false, so the method does nothing and the
PackageManager keeps on waiting on a response.

Test: 1) atest RunBackupFrameworksServicesRoboTests and atest AutoRestoreHostSideTest
2) Manual:
   - Applied ag/9722795
   - run `atest com.android.tests.rollback.host.StagedRollbackTest#testStagedInstallHang`
   - The log file doesn't contain any "Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in handler on main thread (main)".

Change-Id: I294c309b0c7e5a9e12bdbd0c3fc4946767f91cee
parent 49f933a7
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -596,6 +596,12 @@ interface IBackupManager {
    @UnsupportedAppUsage
    @UnsupportedAppUsage
    boolean isBackupServiceActive(int whichUser);
    boolean isBackupServiceActive(int whichUser);


    /**
    * Checks if the user is ready for backup or not.
    * @param userId User id for which this operation should be performed.
    */
    boolean isUserReadyForBackup(int userId);

    /**
    /**
     * Ask the framework which dataset, if any, the given package's data would be
     * Ask the framework which dataset, if any, the given package's data would be
     * restored from if we were to install it right now.
     * restored from if we were to install it right now.
+8 −3
Original line number Original line Diff line number Diff line
@@ -274,9 +274,14 @@ public class BackupManagerService extends IBackupManager.Stub {
        }
        }
    }
    }


    // This method should not perform any I/O (e.g. do not call isBackupActivatedForUser),
    /**
    // it's used in multiple places where I/O waits would cause system lock-ups.
     * This method should not perform any I/O (e.g. do not call isBackupActivatedForUser),
    private boolean isUserReadyForBackup(int userId) {
     * it's used in multiple places where I/O waits would cause system lock-ups.
     * @param userId User id for which this operation should be performed.
     * @return true if the user is ready for backup and false otherwise.
     */
    @Override
    public boolean isUserReadyForBackup(int userId) {
        return mUserServices.get(UserHandle.USER_SYSTEM) != null
        return mUserServices.get(UserHandle.USER_SYSTEM) != null
                && mUserServices.get(userId) != null;
                && mUserServices.get(userId) != null;
    }
    }
+3 −1
Original line number Original line Diff line number Diff line
@@ -13483,10 +13483,12 @@ public class PackageManagerService extends IPackageManager.Stub
            }
            }
            Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
            Trace.asyncTraceBegin(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
            try {
            try {
                if (bm.isBackupServiceActive(userId)) {
                if (bm.isUserReadyForBackup(userId)) {
                    bm.restoreAtInstallForUser(
                    bm.restoreAtInstallForUser(
                            userId, res.pkg.getAppInfoPackageName(), token);
                            userId, res.pkg.getAppInfoPackageName(), token);
                } else {
                } else {
                    Slog.w(TAG, "User " + userId + " is not ready. Restore at install "
                            + "didn't take place.");
                    return false;
                    return false;
                }
                }
            } catch (RemoteException e) {
            } catch (RemoteException e) {