Add isAvailable flag to RollbackData.

To distinguish between rollbacks of staged sessions before and after the
session has been applied.

Bug: 112431924
Test: atest RollbackTest
Change-Id: I93d6af4836933c0b551e17479ec896639ca0740e
This commit is contained in:
Richard Uhler
2019-02-05 13:25:39 +00:00
parent 7a5eeb1ae3
commit 60ac706fdc
4 changed files with 26 additions and 8 deletions

View File

@@ -55,6 +55,14 @@ class RollbackData {
*/
public int stagedSessionId;
/**
* A flag to indicate whether the rollback should be considered available
* for use. This will always be true for rollbacks of non-staged sessions.
* For rollbacks of staged sessions, this is not set to true until after
* the staged session has been applied.
*/
public boolean isAvailable;
/**
* Whether this Rollback is currently in progress. This field is true from the point
* we commit a {@code PackageInstaller} session containing these packages to the point the
@@ -63,10 +71,11 @@ class RollbackData {
// NOTE: All accesses to this field are from the RollbackManager handler thread.
public boolean inProgress = false;
RollbackData(int rollbackId, File backupDir, int stagedSessionId) {
RollbackData(int rollbackId, File backupDir, int stagedSessionId, boolean isAvailable) {
this.rollbackId = rollbackId;
this.backupDir = backupDir;
this.stagedSessionId = stagedSessionId;
this.isAvailable = isAvailable;
}
/**

View File

@@ -221,7 +221,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
List<RollbackInfo> rollbacks = new ArrayList<>();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
rollbacks.add(new RollbackInfo(data.rollbackId, data.packages, data.isStaged()));
if (data.isAvailable) {
rollbacks.add(new RollbackInfo(data.rollbackId,
data.packages, data.isStaged()));
}
}
return new ParceledListSlice<>(rollbacks);
}
@@ -655,6 +658,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
Iterator<RollbackData> iter = mAvailableRollbacks.iterator();
while (iter.hasNext()) {
RollbackData data = iter.next();
if (!data.isAvailable) {
continue;
}
if (!now.isBefore(data.timestamp.plusMillis(ROLLBACK_LIFETIME_DURATION_MILLIS))) {
iter.remove();
mRollbackStore.deleteAvailableRollback(data);
@@ -1064,7 +1071,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
if (getPackageRollbackInfo(data, packageName) != null) {
if (data.isAvailable && getPackageRollbackInfo(data, packageName) != null) {
return data;
}
}
@@ -1083,7 +1090,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
ensureRollbackDataLoadedLocked();
for (int i = 0; i < mAvailableRollbacks.size(); ++i) {
RollbackData data = mAvailableRollbacks.get(i);
if (data.rollbackId == rollbackId) {
if (data.isAvailable && data.rollbackId == rollbackId) {
return data;
}
}

View File

@@ -201,13 +201,13 @@ class RollbackStore {
*/
RollbackData createAvailableRollback(int rollbackId) throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
return new RollbackData(rollbackId, backupDir, -1);
return new RollbackData(rollbackId, backupDir, -1, true);
}
RollbackData createPendingStagedRollback(int rollbackId, int stagedSessionId)
throws IOException {
File backupDir = new File(mAvailableRollbacksDir, Integer.toString(rollbackId));
return new RollbackData(rollbackId, backupDir, stagedSessionId);
return new RollbackData(rollbackId, backupDir, stagedSessionId, false);
}
/**
@@ -247,6 +247,7 @@ class RollbackStore {
dataJson.put("packages", toJson(data.packages));
dataJson.put("timestamp", data.timestamp.toString());
dataJson.put("stagedSessionId", data.stagedSessionId);
dataJson.put("isAvailable", data.isAvailable);
PrintWriter pw = new PrintWriter(new File(data.backupDir, "rollback.json"));
pw.println(dataJson.toString());
@@ -307,8 +308,9 @@ class RollbackStore {
int rollbackId = dataJson.getInt("rollbackId");
int stagedSessionId = dataJson.getInt("stagedSessionId");
boolean isAvailable = dataJson.getBoolean("isAvailable");
RollbackData data = new RollbackData(rollbackId, backupDir,
stagedSessionId);
stagedSessionId, isAvailable);
data.packages.addAll(packageRollbackInfosFromJson(dataJson.getJSONArray("packages")));
data.timestamp = Instant.parse(dataJson.getString("timestamp"));
return data;

View File

@@ -80,7 +80,7 @@ public class AppDataRollbackHelperTest {
}
private static RollbackData createInProgressRollbackData(String packageName) {
RollbackData data = new RollbackData(1, new File("/does/not/exist"), -1);
RollbackData data = new RollbackData(1, new File("/does/not/exist"), -1, true);
data.packages.add(new PackageRollbackInfo(
new VersionedPackage(packageName, 1), new VersionedPackage(packageName, 1),
new IntArray(), new ArrayList<>(), false));