From b221b040c9ddba69f3f8e06ca3ca11e765b85871 Mon Sep 17 00:00:00 2001 From: Mohammad Samiul Islam Date: Tue, 11 Aug 2020 22:31:42 +0100 Subject: [PATCH] Dump orphaned sessions is separate block A child wihout its parent can never be installed. As such, it can't be "Active install session". Presence of orphaned sessions indicate leak in cleanup for multi-package sessions. Creating a separate dumping block for orphaned sessions so that we can catch leaks more easily. Bug: 162518337 Test: use `adb install-multi-package --staged` to create multi-package session and then abandon the parent session to create orphaned child sessions. Made sure dumpsys isn't printing them anymore. Change-Id: I36d7e7a88409d3d1582cb0554da9ed91e94a508d --- .../server/pm/PackageInstallerService.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 840645edcb82e..0ce0f1e4d9047 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -1281,14 +1281,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements pw.increaseIndent(); List finalizedSessions = new ArrayList<>(); + List orphanedChildSessions = new ArrayList<>(); int N = mSessions.size(); for (int i = 0; i < N; i++) { final PackageInstallerSession session = mSessions.valueAt(i); - // Do not print finalized staged session as active install sessions final PackageInstallerSession rootSession = session.hasParentSessionId() ? getSession(session.getParentSessionId()) : session; + // Do not print orphaned child sessions as active install sessions + if (rootSession == null) { + orphanedChildSessions.add(session); + continue; + } + + // Do not print finalized staged session as active install sessions if (rootSession.isStagedAndInTerminalState()) { finalizedSessions.add(session); continue; @@ -1300,6 +1307,21 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements pw.println(); pw.decreaseIndent(); + if (!orphanedChildSessions.isEmpty()) { + // Presence of orphaned sessions indicate leak in cleanup for multi-package and + // should be cleaned up. + pw.println("Orphaned install sessions:"); + pw.increaseIndent(); + N = orphanedChildSessions.size(); + for (int i = 0; i < N; i++) { + final PackageInstallerSession session = orphanedChildSessions.get(i); + session.dump(pw); + pw.println(); + } + pw.println(); + pw.decreaseIndent(); + } + pw.println("Finalized install sessions:"); pw.increaseIndent(); N = finalizedSessions.size();