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

Commit 888e9203 authored by JW Wang's avatar JW Wang
Browse files

Unify the flow of enabling rollbacks (2/n)

* Remove the workaround in makeVerificationParamsLocked() since now
  we have only once place to enable rollbacks.
* Listen to the broadcast to enable rollbacks for both staged and
  non-staged sessions.
* notifyStagedSession() becomes a getter.
* SessionCallback cares about parent sessions only which tell if a
  session is installed successfully or not.

Bug: 183466803
Test: atest RollbackTest CtsRollbackManagerTestCases
Test: atest MultiUserRollbackTest CtsRollbackManagerHostTestCases StagedRollbackTest

Change-Id: I2a6b58f124b70fac731c68ad2b91403586c26f19
parent daa11006
Loading
Loading
Loading
Loading
+1 −8
Original line number Diff line number Diff line
@@ -2516,14 +2516,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {

        mRelinquished = true;

        // TODO(b/169375643): Remove this workaround once b/161121612 is fixed.
        PackageInstaller.SessionParams copiedParams = params.copy();
        if (params.isStaged) {
            // This is called by the pre-reboot verification. Don't enable rollback here since
            // it has been enabled when pre-reboot verification starts.
            copiedParams.installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
        }
        return mPm.new VerificationParams(user, stageDir, localObserver, copiedParams,
        return mPm.new VerificationParams(user, stageDir, localObserver, params,
                mInstallSource, mInstallerUid, mSigningDetails, sessionId, mPackageLite);
    }

+24 −47
Original line number Diff line number Diff line
@@ -789,7 +789,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
            newRollback = createNewRollback(parentSession);
        }

        return enableRollbackForPackageSession(newRollback, packageSession);
        if (enableRollbackForPackageSession(newRollback, packageSession)) {
            // Persist the rollback if all packages are enabled. We will make the rollback
            // available once the whole session is installed successfully.
            return newRollback.allPackagesEnabled() ? completeEnableRollback(newRollback) : true;
        } else {
            return false;
        }
    }

    @WorkerThread
@@ -978,43 +984,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
            throw new SecurityException("notifyStagedSession may only be called by the system.");
        }

        // NOTE: We post this runnable on the RollbackManager's binder thread because we'd prefer
        // to preserve the invariant that all operations that modify state happen there.
        return awaitResult(() -> {
            assertInWorkerThread();
            PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();

            final PackageInstaller.SessionInfo session = installer.getSessionInfo(sessionId);
            if (session == null) {
                Slog.e(TAG, "No matching install session for: " + sessionId);
                return -1;
            }

            Rollback newRollback = createNewRollback(session);
            if (!session.isMultiPackage()) {
                if (!enableRollbackForPackageSession(newRollback, session)) {
                    Slog.e(TAG, "Unable to enable rollback for session: " + sessionId);
                }
            } else {
                for (int childSessionId : session.getChildSessionIds()) {
                    final PackageInstaller.SessionInfo childSession =
                            installer.getSessionInfo(childSessionId);
                    if (childSession == null) {
                        Slog.e(TAG, "No matching child install session for: " + childSessionId);
                        break;
                    }
                    if (!enableRollbackForPackageSession(newRollback, childSession)) {
                        Slog.e(TAG, "Unable to enable rollback for session: " + sessionId);
                        break;
                    }
                }
            }

            if (!completeEnableRollback(newRollback)) {
                return -1;
            } else {
                return newRollback.info.getRollbackId();
            }
            Rollback rollback = getRollbackForSession(sessionId);
            return rollback != null ? rollback.info.getRollbackId() : -1;
        });
    }

@@ -1124,16 +1097,21 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
                Slog.v(TAG, "SessionCallback.onFinished id=" + sessionId + " success=" + success);
            }

            if (success) {
            Rollback rollback = getRollbackForSession(sessionId);
                if (rollback != null && !rollback.isStaged() && rollback.isEnabling()
                        && rollback.notifySessionWithSuccess()
                        && completeEnableRollback(rollback)) {
            if (rollback == null || !rollback.isEnabling()
                    || sessionId != rollback.getOriginalSessionId()) {
                // We only care about the parent session id which will tell us whether the
                // whole session is successful or not.
                return;
            }
            if (success) {
                if (!rollback.isStaged() && completeEnableRollback(rollback)) {
                    // completeEnableRollback() ensures the rollback is deleted if not all packages
                    // are enabled. For staged rollbacks, we will make them available in
                    // onBootCompleted().
                    makeRollbackAvailable(rollback);
                }
            } else {
                Rollback rollback = getRollbackForSession(sessionId);
                if (rollback != null && rollback.isEnabling()) {
                Slog.w(TAG, "Delete rollback id=" + rollback.info.getRollbackId()
                        + " for failed session id=" + sessionId);
                mRollbacks.remove(rollback);
@@ -1141,7 +1119,6 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
            }
        }
    }
    }

    /**
     * Persist a rollback as enable-completed. It does not make the rollback available yet.