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:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user