From dbf4a8b327bb0e0a8fd9951a4ad13e34779f9fe8 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 26 Dec 2019 11:27:01 +0800 Subject: [PATCH] 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 dumpsys rollback, confirm rollback is no longer listed Change-Id: I75005b2fd5b9f6035f4817b386e9e54f2b4243e6 --- .../rollback/RollbackManagerServiceImpl.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index c21c0a99f822d..5c83c50b970fa 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -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 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, session 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.