Merge changes from topic "revert-16575908-dont_abandon_child_qt_dev-VVMFNIYZZO" into qt-dev
* changes:
[RESTRICT AUTOMERGE] Revert "Revert "Revert "[pm] remove old stage dirs on low storage"""
[RESTRICT AUTOMERGE] Revert "Don't abandon child sessions (1/n)"
[RESTRICT AUTOMERGE] Revert "Fix NPE"
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index df3f116..0321da6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -129,9 +129,6 @@
private static final long MAX_ACTIVE_SESSIONS = 1024;
/** Upper bound on number of historical sessions for a UID */
private static final long MAX_HISTORICAL_SESSIONS = 1048576;
- /** Destroy sessions older than this on storage free request */
- private static final long MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS = 8 * DateUtils.HOUR_IN_MILLIS;
-
private final Context mContext;
private final PackageManagerService mPm;
@@ -278,28 +275,18 @@
@GuardedBy("mSessions")
private void reconcileStagesLocked(String volumeUuid) {
- final ArraySet<File> unclaimedStages = getStagingDirsOnVolume(volumeUuid);
+ final File stagingDir = getTmpSessionDir(volumeUuid);
+ final ArraySet<File> unclaimedStages = newArraySet(
+ stagingDir.listFiles(sStageFilter));
+
// Ignore stages claimed by active sessions
for (int i = 0; i < mSessions.size(); i++) {
final PackageInstallerSession session = mSessions.valueAt(i);
unclaimedStages.remove(session.stageDir);
}
- removeStagingDirs(unclaimedStages);
- }
- private ArraySet<File> getStagingDirsOnVolume(String volumeUuid) {
- final File stagingDir = getTmpSessionDir(volumeUuid);
- final ArraySet<File> stagingDirs = newArraySet(stagingDir.listFiles(sStageFilter));
- // We also need to clean up orphaned staging directory for staged sessions
- final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid);
- stagingDirs.addAll(newArraySet(stagedSessionStagingDir.listFiles()));
- return stagingDirs;
- }
-
-
- private void removeStagingDirs(ArraySet<File> stagingDirsToRemove) {
// Clean up orphaned staging directories
- for (File stage : stagingDirsToRemove) {
+ for (File stage : unclaimedStages) {
Slog.w(TAG, "Deleting orphan stage " + stage);
synchronized (mPm.mInstallLock) {
mPm.removeCodePathLI(stage);
@@ -313,42 +300,6 @@
}
}
- /**
- * Called to free up some storage space from obsolete installation files
- */
- public void freeStageDirs(String volumeUuid) {
- final ArraySet<File> unclaimedStagingDirsOnVolume = getStagingDirsOnVolume(volumeUuid);
- final long currentTimeMillis = System.currentTimeMillis();
- synchronized (mSessions) {
- for (int i = 0; i < mSessions.size(); i++) {
- final PackageInstallerSession session = mSessions.valueAt(i);
- if (!unclaimedStagingDirsOnVolume.contains(session.stageDir)) {
- // Only handles sessions stored on the target volume
- continue;
- }
- final long age = currentTimeMillis - session.createdMillis;
- if (age >= MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS) {
- // Aggressively close old sessions because we are running low on storage
- // Their staging dirs will be removed too
- PackageInstallerSession root = !session.hasParentSessionId()
- ? session : mSessions.get(session.getParentSessionId());
- if (root == null) {
- Slog.e(TAG, "freeStageDirs: found an orphaned session: "
- + session.sessionId + " parent=" + session.getParentSessionId());
- } else if (!root.isDestroyed() &&
- (!root.isStaged() || (root.isStaged() && root.isStagedSessionReady())))
- {
- root.abandon();
- }
- } else {
- // Session is new enough, so it deserves to be kept even on low storage
- unclaimedStagingDirsOnVolume.remove(session.stageDir);
- }
- }
- }
- removeStagingDirs(unclaimedStagingDirsOnVolume);
- }
-
public static boolean isStageName(String name) {
final boolean isFile = name.startsWith("vmdl") && name.endsWith(".tmp");
final boolean isContainer = name.startsWith("smdl") && name.endsWith(".tmp");
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 3232692..7980f3c 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -2088,7 +2088,8 @@
+ mParentSessionId + " and may not be abandoned directly.");
}
synchronized (mLock) {
- assertCallerIsOwnerOrRootOrSystemLocked();
+ assertCallerIsOwnerOrRootLocked();
+
if (isStagedAndInTerminalState()) {
// We keep the session in the database if it's in a finalized state. It will be
// removed by PackageInstallerService when the last update time is old enough.
@@ -2115,20 +2116,6 @@
dispatchSessionFinished(INSTALL_FAILED_ABORTED, "Session was abandoned", null);
}
- /**
- * Check if the caller is the owner of this session. Otherwise throw a
- * {@link SecurityException}.
- */
- @GuardedBy("mLock")
- private void assertCallerIsOwnerOrRootOrSystemLocked() {
- final int callingUid = Binder.getCallingUid();
- if (callingUid != Process.ROOT_UID && callingUid != mInstallerUid
- && callingUid != Process.SYSTEM_UID) {
- throw new SecurityException("Session does not belong to uid " + callingUid);
- }
- }
-
-
@Override
public boolean isMultiPackage() {
return params.isMultiPackage;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3549db4..af91d59 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -4875,9 +4875,6 @@
InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
return;
}
- // 12. Clear temp install session files
- mInstallerService.freeStageDirs(volumeUuid);
-
} else {
try {
mInstaller.freeCache(volumeUuid, bytes, 0, 0);