summaryrefslogtreecommitdiff
path: root/cmds/installd/InstalldNativeService.cpp
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@android.com> 2017-05-30 14:38:42 -0600
committer Jeff Sharkey <jsharkey@android.com> 2017-05-30 16:08:42 -0600
commit60f8a5330ca921d936ae306bf6d17596b82b518c (patch)
tree275a1dc3dd1e16461156a735a7c194b4a12c191c /cmds/installd/InstalldNativeService.cpp
parent8caf56ef7caf33a602ef0d99afc6469f723fb1eb (diff)
Consistent "low storage" behavior.
When freeing cached data, the caller can now provide a "reserved" size which we won't clear cached data from. Bug: 38008706 Test: cts-tradefed run commandAndExit cts-dev -m CtsJobSchedulerTestCases -t android.jobscheduler.cts.StorageConstraintTest Test: cts-tradefed run commandAndExit cts-dev -m CtsAppSecurityHostTestCases -t android.appsecurity.cts.StorageHostTest Change-Id: Ieb91b3e5345a950d4785fd7915f520f0a68a567a
Diffstat (limited to 'cmds/installd/InstalldNativeService.cpp')
-rw-r--r--cmds/installd/InstalldNativeService.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp
index 509dd92b14..dec23d3945 100644
--- a/cmds/installd/InstalldNativeService.cpp
+++ b/cmds/installd/InstalldNativeService.cpp
@@ -915,15 +915,8 @@ binder::Status InstalldNativeService::destroyUserData(const std::unique_ptr<std:
return res;
}
-/* Try to ensure free_size bytes of storage are available.
- * Returns 0 on success.
- * This is rather simple-minded because doing a full LRU would
- * be potentially memory-intensive, and without atime it would
- * also require that apps constantly modify file metadata even
- * when just reading from the cache, which is pretty awful.
- */
binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::string>& uuid,
- int64_t freeStorageSize, int32_t flags) {
+ int64_t targetFreeBytes, int64_t cacheReservedBytes, int32_t flags) {
ENFORCE_UID(AID_SYSTEM);
CHECK_ARGUMENT_UUID(uuid);
std::lock_guard<std::recursive_mutex> lock(mLock);
@@ -938,11 +931,12 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
return error("Failed to determine free space for " + data_path);
}
- int64_t needed = freeStorageSize - free;
+ int64_t cleared = 0;
+ int64_t needed = targetFreeBytes - free;
LOG(DEBUG) << "Device " << data_path << " has " << free << " free; requested "
- << freeStorageSize << "; needed " << needed;
+ << targetFreeBytes << "; needed " << needed;
- if (free >= freeStorageSize) {
+ if (free >= targetFreeBytes) {
return ok();
}
@@ -999,6 +993,7 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
// 2. Populate tracker stats and insert into priority queue
ATRACE_BEGIN("populate");
+ int64_t cacheTotal = 0;
auto cmp = [](std::shared_ptr<CacheTracker> left, std::shared_ptr<CacheTracker> right) {
return (left->getCacheRatio() < right->getCacheRatio());
};
@@ -1007,6 +1002,7 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
for (const auto& it : trackers) {
it.second->loadStats();
queue.push(it.second);
+ cacheTotal += it.second->cacheUsed;
}
ATRACE_END();
@@ -1023,6 +1019,12 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
break;
}
+ // Only keep clearing when we haven't pushed into reserved area
+ if (cacheReservedBytes > 0 && cleared >= (cacheTotal - cacheReservedBytes)) {
+ LOG(DEBUG) << "Refusing to clear cached data in reserved space";
+ break;
+ }
+
// Find the best tracker to work with; this might involve swapping
// if the active tracker is no longer the most over quota
bool nextBetter = active && !queue.empty()
@@ -1052,13 +1054,14 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
}
active->cacheUsed -= item->size;
needed -= item->size;
+ cleared += item->size;
}
// Verify that we're actually done before bailing, since sneaky
// apps might be using hardlinks
if (needed <= 0) {
free = data_disk_free(data_path);
- needed = freeStorageSize - free;
+ needed = targetFreeBytes - free;
if (needed <= 0) {
break;
} else {
@@ -1073,11 +1076,11 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr<std::strin
}
free = data_disk_free(data_path);
- if (free >= freeStorageSize) {
+ if (free >= targetFreeBytes) {
return ok();
} else {
return error(StringPrintf("Failed to free up %" PRId64 " on %s; final free space %" PRId64,
- freeStorageSize, data_path.c_str(), free));
+ targetFreeBytes, data_path.c_str(), free));
}
}