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
This commit is contained in:
JW Wang
2019-12-26 11:27:01 +08:00
parent 3fa0ce99ac
commit dbf4a8b327

View File

@@ -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.