Merge "Fix device not rebooting after watchdog triggered staged rollback" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
efb4630527
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.rollback;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -32,7 +33,6 @@ import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.PowerManager;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
import android.util.Slog;
|
||||
import android.util.StatsLog;
|
||||
|
||||
@@ -77,74 +77,50 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
@Override
|
||||
public int onHealthCheckFailed(VersionedPackage failedPackage) {
|
||||
VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
|
||||
if (moduleMetadataPackage == null) {
|
||||
// Ignore failure, no mainline update available
|
||||
return PackageHealthObserverImpact.USER_IMPACT_NONE;
|
||||
}
|
||||
|
||||
if (getAvailableRollback(mContext.getSystemService(RollbackManager.class),
|
||||
failedPackage, moduleMetadataPackage) == null) {
|
||||
if (getAvailableRollback(mContext.getSystemService(RollbackManager.class), failedPackage)
|
||||
== null) {
|
||||
// Don't handle the notification, no rollbacks available for the package
|
||||
return PackageHealthObserverImpact.USER_IMPACT_NONE;
|
||||
} else {
|
||||
// Rollback is available, we may get a callback into #execute
|
||||
return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
|
||||
}
|
||||
// Rollback is available, we may get a callback into #execute
|
||||
return PackageHealthObserverImpact.USER_IMPACT_MEDIUM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean execute(VersionedPackage failedPackage) {
|
||||
VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
|
||||
if (moduleMetadataPackage == null) {
|
||||
// Ignore failure, no mainline update available
|
||||
return false;
|
||||
}
|
||||
|
||||
RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class);
|
||||
Pair<RollbackInfo, Boolean> rollbackPair = getAvailableRollback(rollbackManager,
|
||||
failedPackage, moduleMetadataPackage);
|
||||
if (rollbackPair == null) {
|
||||
VersionedPackage moduleMetadataPackage = getModuleMetadataPackage();
|
||||
RollbackInfo rollback = getAvailableRollback(rollbackManager, failedPackage);
|
||||
|
||||
if (rollback == null) {
|
||||
Slog.w(TAG, "Expected rollback but no valid rollback found for package: [ "
|
||||
+ failedPackage.getPackageName() + "] with versionCode: ["
|
||||
+ failedPackage.getVersionCode() + "]");
|
||||
return false;
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_INITIATE);
|
||||
LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver((Intent result) -> {
|
||||
if (hasModuleMetadataPackage) {
|
||||
int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
|
||||
RollbackManager.STATUS_FAILURE);
|
||||
if (status == RollbackManager.STATUS_SUCCESS) {
|
||||
if (rollback.isStaged()) {
|
||||
int rollbackId = rollback.getRollbackId();
|
||||
BroadcastReceiver listener =
|
||||
listenForStagedSessionReady(rollbackManager, rollbackId,
|
||||
moduleMetadataPackage);
|
||||
handleStagedSessionChange(rollbackManager, rollbackId, listener,
|
||||
moduleMetadataPackage);
|
||||
} else {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
StatsLog
|
||||
.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
}
|
||||
int status = result.getIntExtra(RollbackManager.EXTRA_STATUS,
|
||||
RollbackManager.STATUS_FAILURE);
|
||||
if (status == RollbackManager.STATUS_SUCCESS) {
|
||||
if (rollback.isStaged()) {
|
||||
int rollbackId = rollback.getRollbackId();
|
||||
BroadcastReceiver listener =
|
||||
listenForStagedSessionReady(rollbackManager, rollbackId,
|
||||
moduleMetadataPackage);
|
||||
handleStagedSessionChange(rollbackManager, rollbackId, listener,
|
||||
moduleMetadataPackage);
|
||||
} else {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS);
|
||||
}
|
||||
} else {
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -193,26 +169,17 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
}
|
||||
|
||||
String moduleMetadataPackageName = getModuleMetadataPackageName();
|
||||
if (moduleMetadataPackageName == null) {
|
||||
// Only log mainline staged rollbacks
|
||||
return;
|
||||
}
|
||||
|
||||
// Use the version of the metadata package that was installed before
|
||||
// we rolled back for logging purposes.
|
||||
VersionedPackage moduleMetadataPackage = null;
|
||||
for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
|
||||
if (moduleMetadataPackageName.equals(packageRollback.getPackageName())) {
|
||||
if (packageRollback.getPackageName().equals(moduleMetadataPackageName)) {
|
||||
moduleMetadataPackage = packageRollback.getVersionRolledBackFrom();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (moduleMetadataPackage == null) {
|
||||
// Only log mainline staged rollbacks
|
||||
return;
|
||||
}
|
||||
|
||||
int sessionId = rollback.getCommittedSessionId();
|
||||
PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId);
|
||||
if (sessionInfo == null) {
|
||||
@@ -220,42 +187,33 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
return;
|
||||
}
|
||||
if (sessionInfo.isStagedSessionApplied()) {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_SUCCESS);
|
||||
} else if (sessionInfo.isStagedSessionReady()) {
|
||||
// TODO: What do for staged session ready but not applied
|
||||
} else {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
private Pair<RollbackInfo, Boolean> getAvailableRollback(RollbackManager rollbackManager,
|
||||
VersionedPackage failedPackage, VersionedPackage moduleMetadataPackage) {
|
||||
private RollbackInfo getAvailableRollback(RollbackManager rollbackManager,
|
||||
VersionedPackage failedPackage) {
|
||||
for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) {
|
||||
// We only rollback mainline packages, so check if rollback contains the
|
||||
// module metadata provider, if it does, the rollback is a mainline rollback
|
||||
boolean hasModuleMetadataPackage = false;
|
||||
boolean hasFailedPackage = false;
|
||||
for (PackageRollbackInfo packageRollback : rollback.getPackages()) {
|
||||
hasModuleMetadataPackage |= packageRollback.getPackageName().equals(
|
||||
moduleMetadataPackage.getPackageName());
|
||||
hasFailedPackage |= packageRollback.getPackageName().equals(
|
||||
boolean hasFailedPackage = packageRollback.getPackageName().equals(
|
||||
failedPackage.getPackageName())
|
||||
&& packageRollback.getVersionRolledBackFrom().getVersionCode()
|
||||
== failedPackage.getVersionCode();
|
||||
}
|
||||
if (hasFailedPackage) {
|
||||
return new Pair<RollbackInfo, Boolean>(rollback, hasModuleMetadataPackage);
|
||||
if (hasFailedPackage) {
|
||||
return rollback;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getModuleMetadataPackageName() {
|
||||
String packageName = mContext.getResources().getString(
|
||||
R.string.config_defaultModuleMetadataProvider);
|
||||
@@ -265,6 +223,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
return packageName;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private VersionedPackage getModuleMetadataPackage() {
|
||||
String packageName = getModuleMetadataPackageName();
|
||||
if (packageName == null) {
|
||||
@@ -311,18 +270,13 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
if (sessionInfo.isStagedSessionReady()) {
|
||||
mContext.unregisterReceiver(listener);
|
||||
saveLastStagedRollbackId(rollbackId);
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog
|
||||
.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_BOOT_TRIGGERED);
|
||||
mContext.getSystemService(PowerManager.class).reboot("Rollback staged install");
|
||||
} else if (sessionInfo.isStagedSessionFailed()) {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED,
|
||||
StatsLog
|
||||
.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE,
|
||||
moduleMetadataPackage.getPackageName(),
|
||||
moduleMetadataPackage.getVersionCode());
|
||||
logEvent(moduleMetadataPackage,
|
||||
StatsLog.WATCHDOG_ROLLBACK_OCCURRED__ROLLBACK_TYPE__ROLLBACK_FAILURE);
|
||||
mContext.unregisterReceiver(listener);
|
||||
}
|
||||
}
|
||||
@@ -358,4 +312,12 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
|
||||
mLastStagedRollbackIdFile.delete();
|
||||
return rollbackId;
|
||||
}
|
||||
|
||||
private static void logEvent(@Nullable VersionedPackage moduleMetadataPackage, int type) {
|
||||
Slog.i(TAG, "Watchdog event occurred of type: " + type);
|
||||
if (moduleMetadataPackage != null) {
|
||||
StatsLog.write(StatsLog.WATCHDOG_ROLLBACK_OCCURRED, type,
|
||||
moduleMetadataPackage.getPackageName(), moduleMetadataPackage.getVersionCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user