Improve logging for why a staged session was reverted

mFailureReason gets populated with actual reason when we try to resume
the staged session in checkpointing mode. But, if the device has a
native crash due to which the device reboots even before we attempt to
"resume" staged session, then it will never get populated.

As such, during boot loops that occur earlier than "resume" of staged
session, we end up logging nothing.

In this CL, we improve on the scenario by falling back to using
mNativeFailureReason if mFailureReason is empty. But this only works if
our staged session contains APEX package in it. For apk-only staged
sessions, we will still be logging blanks.

Bug: 163787002
Test: atest ApexRollbackTests#testReasonForRevertIsLoggedDuringBootloop
Change-Id: I5cd1733d66aa0b30855803b95eb9818dc81aa0d7
Merged-In: I5cd1733d66aa0b30855803b95eb9818dc81aa0d7
(cherry picked from commit a4cb493bdb)
This commit is contained in:
Mohammad Samiul Islam
2020-08-12 15:15:48 +01:00
parent e5e2388844
commit 558f0c8842
2 changed files with 20 additions and 7 deletions

View File

@@ -1060,7 +1060,9 @@ class PackageManagerShellCommand extends ShellCommand {
+ "; isStaged = " + session.isStaged()
+ "; isReady = " + session.isStagedSessionReady()
+ "; isApplied = " + session.isStagedSessionApplied()
+ "; isFailed = " + session.isStagedSessionFailed() + ";");
+ "; isFailed = " + session.isStagedSessionFailed()
+ "; errorMsg = " + session.getStagedSessionErrorMessage()
+ ";");
}
private Intent parseIntentAndUser() throws URISyntaxException {

View File

@@ -605,13 +605,14 @@ public class StagingManager {
// If checkpoint is supported, then we only resume sessions if we are in checkpointing
// mode. If not, we fail all sessions.
if (supportsCheckpoint() && !needsCheckpoint()) {
String errorMsg = "Reverting back to safe state. Marking " + session.sessionId
+ " as failed";
if (!TextUtils.isEmpty(mFailureReason)) {
errorMsg = errorMsg + ": " + mFailureReason;
String revertMsg = "Reverting back to safe state. Marking "
+ session.sessionId + " as failed.";
final String reasonForRevert = getReasonForRevert();
if (!TextUtils.isEmpty(reasonForRevert)) {
revertMsg += " Reason for revert: " + reasonForRevert;
}
Slog.d(TAG, errorMsg);
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, errorMsg);
Slog.d(TAG, revertMsg);
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN, revertMsg);
return;
}
} catch (RemoteException e) {
@@ -715,6 +716,16 @@ public class StagingManager {
}
}
private String getReasonForRevert() {
if (!TextUtils.isEmpty(mFailureReason)) {
return mFailureReason;
}
if (!TextUtils.isEmpty(mNativeFailureReason)) {
return "Session reverted due to crashing native process: " + mNativeFailureReason;
}
return "";
}
private List<String> findAPKsInDir(File stageDir) {
List<String> ret = new ArrayList<>();
if (stageDir != null && stageDir.exists()) {