summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Zimuzo Ezeozue <zezeozue@google.com> 2019-02-05 13:59:42 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-02-05 13:59:42 +0000
commited6a17b24a50453917f1be834ce0ccaf28db4d55 (patch)
tree32ecc1ade7160b0abd86dcd7ff7ec1018526c63b
parent121f9739b0b473d0a724656fc6ed2bca1b9c830b (diff)
parent9e57ecb5c4ee4f2a4c87e85285ad5d0509e78263 (diff)
Merge "Allow non-mainline package rollbacks"
-rw-r--r--services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java65
-rw-r--r--tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java4
2 files changed, 36 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
index 8e041602c75f..3c6a54af4bd7 100644
--- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
+++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java
@@ -26,6 +26,7 @@ import android.content.rollback.RollbackManager;
import android.os.Handler;
import android.os.HandlerThread;
import android.text.TextUtils;
+import android.util.Pair;
import android.util.Slog;
import android.util.StatsLog;
@@ -64,10 +65,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
return PackageHealthObserverImpact.USER_IMPACT_NONE;
}
- RollbackInfo rollback =
- getAvailableMainlineRollback(mContext.getSystemService(RollbackManager.class),
- failedPackage, moduleMetadataPackage);
- if (rollback == null) {
+ if (getAvailableRollback(mContext.getSystemService(RollbackManager.class),
+ failedPackage, moduleMetadataPackage) == null) {
// Don't handle the notification, no rollbacks available for the package
return PackageHealthObserverImpact.USER_IMPACT_NONE;
}
@@ -84,38 +83,46 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
}
RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class);
- RollbackInfo rollback = getAvailableMainlineRollback(rollbackManager,
+ Pair<RollbackInfo, Boolean> rollbackPair = getAvailableRollback(rollbackManager,
failedPackage, moduleMetadataPackage);
- if (rollback == null) {
- Slog.w(TAG, "Expected rollback but no mainline rollback found for package: [ "
+ if (rollbackPair == null) {
+ Slog.w(TAG, "Expected rollback but no valid rollback found for package: [ "
+ failedPackage.getPackageName() + "] with versionCode: ["
+ failedPackage.getVersionCode() + "]");
return false;
}
-
- StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
- StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE,
- moduleMetadataPackage.getPackageName(),
- moduleMetadataPackage.getVersionCode());
+ RollbackInfo rollback = rollbackPair.first;
+ // We only log mainline package rollbacks, so check if rollback contains the
+ // module metadata provider, if it does, the rollback is a mainline rollback
+ boolean hasModuleMetadataPackage = rollbackPair.second;
+
+ if (hasModuleMetadataPackage) {
+ StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+ StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE,
+ moduleMetadataPackage.getPackageName(),
+ moduleMetadataPackage.getVersionCode());
+ }
LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver((Intent result) -> {
- int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
- RollbackManager.STATUS_FAILURE);
- if (status == RollbackManager.STATUS_SUCCESS) {
- StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
- StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS,
- moduleMetadataPackage.getPackageName(),
- moduleMetadataPackage.getVersionCode());
- } else {
- StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
- StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
- moduleMetadataPackage.getPackageName(),
- moduleMetadataPackage.getVersionCode());
+ if (hasModuleMetadataPackage) {
+ int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
+ RollbackManager.STATUS_FAILURE);
+ if (status == RollbackManager.STATUS_SUCCESS) {
+ StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+ StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS,
+ moduleMetadataPackage.getPackageName(),
+ moduleMetadataPackage.getVersionCode());
+ } else {
+ StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
+ StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
+ moduleMetadataPackage.getPackageName(),
+ moduleMetadataPackage.getVersionCode());
+ }
}
});
mHandler.post(() ->
rollbackManager.commitRollback(rollback.getRollbackId(),
- Collections.singletonList(moduleMetadataPackage),
+ Collections.singletonList(failedPackage),
rollbackReceiver.getIntentSender()));
// Assume rollback executed successfully
return true;
@@ -134,7 +141,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs);
}
- private RollbackInfo getAvailableMainlineRollback(RollbackManager rollbackManager,
+ private Pair<RollbackInfo, Boolean> getAvailableRollback(RollbackManager rollbackManager,
VersionedPackage failedPackage, VersionedPackage moduleMetadataPackage) {
for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) {
// We only rollback mainline packages, so check if rollback contains the
@@ -149,8 +156,8 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
&& packageRollback.getVersionRolledBackFrom().getVersionCode()
== failedPackage.getVersionCode();
}
- if (hasModuleMetadataPackage && hasFailedPackage) {
- return rollback;
+ if (hasFailedPackage) {
+ return new Pair<RollbackInfo, Boolean>(rollback, hasModuleMetadataPackage);
}
}
return null;
@@ -159,7 +166,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
private VersionedPackage getModuleMetadataPackage() {
String packageName = mContext.getResources().getString(
R.string.config_defaultModuleMetadataProvider);
- if (!TextUtils.isEmpty(packageName)) {
+ if (TextUtils.isEmpty(packageName)) {
return null;
}
diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index ace0e6d14c58..4b277ae850c5 100644
--- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -37,7 +37,6 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -629,12 +628,9 @@ public class RollbackTest {
assertEquals(versionRolledBackTo, info.getVersionRolledBackTo().getLongVersionCode());
}
- // TODO: Allow installing test app along atomically with module metadata package so that
- // a failed test app will be flagged as a failed mainline app
/**
* Test bad update automatic rollback.
*/
- @Ignore
@Test
public void testBadUpdateRollback() throws Exception {
BroadcastReceiver crashCountReceiver = null;