Explicitly close file stream when initializing quotas.

When the device boots and the StorageStatsService is initialized, we
load the last calculated cache quotas from a file. We were never closing
the FileInputStream and leaked a resource.

By using try-with-resources, we can avoid that.

Bug: 128920416
Test: Manual -- did not crash on a phone that booted a few times.
Change-Id: Ib85e571ddf033caf63eef7c69a91336dad1b55bc
This commit is contained in:
Daniel Nishi
2019-04-01 13:12:51 -07:00
parent f89753c6c1
commit 6edbf68e84

View File

@@ -66,7 +66,6 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* CacheQuotaStrategy is a strategy for determining cache quotas using usage stats and foreground
@@ -296,26 +295,24 @@ public class CacheQuotaStrategy implements RemoteCallback.OnResultListener {
* @return the number of bytes that were free on the device when the quotas were last calced.
*/
public long setupQuotasFromFile() throws IOException {
FileInputStream stream;
try {
stream = mPreviousValuesFile.openRead();
Pair<Long, List<CacheQuotaHint>> cachedValues = null;
try (FileInputStream stream = mPreviousValuesFile.openRead()) {
try {
cachedValues = readFromXml(stream);
} catch (XmlPullParserException e) {
throw new IllegalStateException(e.getMessage());
}
} catch (FileNotFoundException e) {
// The file may not exist yet -- this isn't truly exceptional.
return -1;
}
Pair<Long, List<CacheQuotaHint>> cachedValues = null;
try {
cachedValues = readFromXml(stream);
} catch (XmlPullParserException e) {
throw new IllegalStateException(e.getMessage());
}
if (cachedValues == null) {
Slog.e(TAG, "An error occurred while parsing the cache quota file.");
return -1;
}
pushProcessedQuotas(cachedValues.second);
return cachedValues.first;
}