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

Commit c1e8f1f8 authored by Oli Lan's avatar Oli Lan
Browse files

Abandon other staged sessions when a rollback is staged.

This change causes all staged sessions that are not rollbacks to be
abandoned (failed) when a rollback is staged.

This will ensure that an SDK extension level dependency is not violated
if a rollback causes the extension level to drop while at the same time
an app is installed that depends on the higher extension level.

Other rollbacks are not failed so that multiple rollbacks can be staged
together.

Bug: 163734200
Test: atest RollbackManagerHostTest
Change-Id: Iffb50d2a05f6ab0b6691fc84ffc273c2faecb88b
parent 840870e7
Loading
Loading
Loading
Loading
+24 −24
Original line number Diff line number Diff line
@@ -737,11 +737,10 @@ public class StagingManager {
                    continue;
                }

                // New session cannot have same package name as one of the active sessions
                if (stagedSession.sessionContains(s -> s.getPackageName().equals(packageName))) {
                    if (isRollback) {
                if (isRollback && !isRollback(stagedSession)) {
                    // If the new session is a rollback, then it gets priority. The existing
                        // session is failed to unblock rollback.
                    // session is failed to reduce risk and avoid an SDK extension dependency
                    // violation.
                    final StagedSession root = stagedSession;
                    if (!ensureActiveApexSessionIsAborted(root)) {
                        Slog.e(TAG, "Failed to abort apex session " + root.sessionId());
@@ -751,10 +750,12 @@ public class StagingManager {
                    }
                    root.setSessionFailed(
                            SessionInfo.STAGED_SESSION_CONFLICT,
                                "Session was blocking rollback session: " + session.sessionId());
                            "Session was failed by rollback session: " + session.sessionId());
                    Slog.i(TAG, "Session " + root.sessionId() + " is marked failed due to "
                                + "blocking rollback session: " + session.sessionId());
                    } else {
                            + "rollback session: " + session.sessionId());
                } else if (stagedSession.sessionContains(
                        s -> s.getPackageName().equals(packageName))) {
                    // New session cannot have same package name as one of the active sessions
                    throw new PackageManagerException(
                            SessionInfo.STAGED_SESSION_VERIFICATION_FAILED,
                            "Package: " + session.getPackageName() + " in session: "
@@ -762,7 +763,6 @@ public class StagingManager {
                                    + " has been staged already by session: "
                                    + stagedSession.sessionId(), null);
                }
                }

                // Staging multiple root sessions is not allowed if device doesn't support
                // checkpoint. If session and stagedSession do not have common ancestor, they are