summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mohammad Samiul Islam <samiul@google.com> 2020-03-06 16:19:22 +0000
committer Mohammad Samiul Islam <samiul@google.com> 2020-03-06 16:35:25 +0000
commit166243fd1d2384d47f18a4cea0726966348cdabf (patch)
treeec0debb597b4adece1798487d5adee811b3440ce
parent23c81a156eefeb7858eb5d91278a9268da43e282 (diff)
Improve logging for failed scenario in staged install flow
The failure reason added to the session object disappears due to fs-checkpointing. As a result we cannot figure out the failure reason using dumpsys. If we log the failure reasons, then when somebody logcats across reboot, they can at least see the failure reason on their screen/file. This will make debugging easier. Bug: 146343545 Test: builds without error Change-Id: Id5a4f1c4751b6449388c430140bb8efd8620337e
-rw-r--r--services/core/java/com/android/server/pm/StagingManager.java28
1 files changed, 17 insertions, 11 deletions
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index fe992290a3c9..21383c13dbc1 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -331,7 +331,8 @@ public class StagingManager {
}
// Reverts apex sessions and user data (if checkpoint is supported). Also reboots the device.
- private void abortCheckpoint() {
+ private void abortCheckpoint(String errorMsg) {
+ Slog.e(TAG, "Aborting checkpoint: " + errorMsg);
try {
if (supportsCheckpoint() && needsCheckpoint()) {
mApexManager.revertActiveSessions();
@@ -504,6 +505,8 @@ public class StagingManager {
// mode. If not, we fail all sessions.
if (supportsCheckpoint() && !needsCheckpoint()) {
// TODO(b/146343545): Persist failure reason across checkpoint reboot
+ Slog.d(TAG, "Reverting back to safe state. Marking " + session.sessionId
+ + " as failed.");
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_UNKNOWN,
"Reverting back to safe state");
return;
@@ -524,26 +527,29 @@ public class StagingManager {
if (hasApex) {
if (apexSessionInfo == null) {
+ String errorMsg = "apexd did not know anything about a staged session supposed to"
+ + " be activated";
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
- "apexd did not know anything about a staged session supposed to be"
- + "activated");
- abortCheckpoint();
+ errorMsg);
+ abortCheckpoint(errorMsg);
return;
}
if (isApexSessionFailed(apexSessionInfo)) {
+ String errorMsg = "APEX activation failed. Check logcat messages from apexd for "
+ + "more information.";
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
- "APEX activation failed. Check logcat messages from apexd for "
- + "more information.");
- abortCheckpoint();
+ errorMsg);
+ abortCheckpoint(errorMsg);
return;
}
if (!apexSessionInfo.isActivated && !apexSessionInfo.isSuccess) {
// Apexd did not apply the session for some unknown reason. There is no guarantee
// that apexd will install it next time. Safer to proactively mark as failed.
+ String errorMsg = "Staged session " + session.sessionId + "at boot didn't "
+ + "activate nor fail. Marking it as failed anyway.";
session.setStagedSessionFailed(SessionInfo.STAGED_SESSION_ACTIVATION_FAILED,
- "Staged session " + session.sessionId + "at boot didn't "
- + "activate nor fail. Marking it as failed anyway.");
- abortCheckpoint();
+ errorMsg);
+ abortCheckpoint(errorMsg);
return;
}
snapshotAndRestoreForApexSession(session);
@@ -556,7 +562,7 @@ public class StagingManager {
installApksInSession(session);
} catch (PackageManagerException e) {
session.setStagedSessionFailed(e.error, e.getMessage());
- abortCheckpoint();
+ abortCheckpoint(e.getMessage());
// If checkpoint is not supported, we have to handle failure for one staged session.
if (!hasApex) {