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

Commit dbf4a8b3 authored by JW Wang's avatar JW Wang
Browse files

Delete rollbacks immediately when any of child sessions failed (2/n)

Currently rollbacks for abandoned sessions will be deleted after reboot.
This change deletes rollbacks immediately/proactively when a session is
abandoned to be more memory and disk efficient.

Bug: 134652027
Test: adb install TestAppAv1.apk
      adb install --enable-rollback --staged TestAppAv2.apk
      dumpsys rollback
      adb shell pm install-abandon <stagedSessionId from dumpsys rollback>
      dumpsys rollback, confirm rollback is no longer listed

Change-Id: I75005b2fd5b9f6035f4817b386e9e54f2b4243e6
parent 3fa0ce99
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -780,6 +780,33 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        return enableRollbackForPackageSession(newRollback.rollback, packageSession);
    }

    private void removeRollbackForPackageSessionId(int sessionId) {
        if (LOCAL_LOGV) {
            Slog.v(TAG, "removeRollbackForPackageSessionId=" + sessionId);
        }

        synchronized (mLock) {
            NewRollback newRollback = getNewRollbackForPackageSessionLocked(sessionId);
            if (newRollback != null) {
                Slog.w(TAG, "Delete new rollback id=" + newRollback.rollback.info.getRollbackId()
                        + " for session id=" + sessionId);
                mNewRollbacks.remove(newRollback);
                newRollback.rollback.delete(mAppDataRollbackHelper);
            }
            Iterator<Rollback> iter = mRollbacks.iterator();
            while (iter.hasNext()) {
                Rollback rollback = iter.next();
                if (rollback.getStagedSessionId() == sessionId) {
                    Slog.w(TAG, "Delete rollback id=" + rollback.info.getRollbackId()
                            + " for session id=" + sessionId);
                    iter.remove();
                    rollback.delete(mAppDataRollbackHelper);
                    break;
                }
            }
        }
    }

    /**
     * Do code and userdata backups to enable rollback of the given session.
     * In case of multiPackage sessions, <code>session</code> should be one of
@@ -1110,7 +1137,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                    }
                }
            } else {
                // TODO: delete rollbacks for this failed session
                removeRollbackForPackageSessionId(sessionId);
            }

            // Clear the queue so it will never be leaked to next tests.