Delete orphaned staging directories for staged session on reboot

Bug: 173132101
Test: StagedInstallInternalTest#testOrphanedStagingDirectoryGetsCleanedUpOnReboot
Change-Id: If840f35245c2d049401d0d2f6539fe8c4625151e
Merged-In: If840f35245c2d049401d0d2f6539fe8c4625151e
(cherry picked from commit bfbf960801)
This commit is contained in:
Mohammad Samiul Islam
2020-11-13 19:08:31 +00:00
parent f54412183a
commit 37daf1ba80
2 changed files with 17 additions and 0 deletions

View File

@@ -299,6 +299,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
final ArraySet<File> unclaimedStages = newArraySet(
stagingDir.listFiles(sStageFilter));
// We also need to clean up orphaned staging directory for staged sessions
final File stagedSessionStagingDir = Environment.getDataStagingDirectory(volumeUuid);
unclaimedStages.addAll(newArraySet(stagedSessionStagingDir.listFiles()));
// Ignore stages claimed by active sessions
for (int i = 0; i < mSessions.size(); i++) {
final PackageInstallerSession session = mSessions.valueAt(i);

View File

@@ -109,6 +109,19 @@ public class StagedInstallInternalTest extends BaseHostJUnit4Test {
assertThat(after).isEqualTo(before);
}
@Test
public void testOrphanedStagingDirectoryGetsCleanedUpOnReboot() throws Exception {
//create random directories in /data/app-staging folder
getDevice().enableAdbRoot();
getDevice().executeShellCommand("mkdir /data/app-staging/session_123");
getDevice().executeShellCommand("mkdir /data/app-staging/random_name");
getDevice().disableAdbRoot();
assertThat(getStagingDirectories()).isNotEmpty();
getDevice().reboot();
assertThat(getStagingDirectories()).isEmpty();
}
private List<String> getStagingDirectories() throws DeviceNotAvailableException {
String baseDir = "/data/app-staging";
try {