Periodically free cache below high storage threshold
Bug: 203650385
Test: atest installd_cache_test
Ignore-AOSP-First: This CL is to be submitted in a topic aimed
for T release
Change-Id: Ia01ab02a77b6365585fafc974d2c68349b5e9e62
diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp
index bb83db5..fffcdd1 100644
--- a/cmds/installd/InstalldNativeService.cpp
+++ b/cmds/installd/InstalldNativeService.cpp
@@ -1353,6 +1353,7 @@
const char* uuid_ = uuid ? uuid->c_str() : nullptr;
auto data_path = create_data_path(uuid_);
auto noop = (flags & FLAG_FREE_CACHE_NOOP);
+ auto defy_target = (flags & FLAG_FREE_CACHE_DEFY_TARGET_FREE_BYTES);
int64_t free = data_disk_free(data_path);
if (free < 0) {
@@ -1361,11 +1362,13 @@
int64_t cleared = 0;
int64_t needed = targetFreeBytes - free;
- LOG(DEBUG) << "Device " << data_path << " has " << free << " free; requested "
- << targetFreeBytes << "; needed " << needed;
+ if (!defy_target) {
+ LOG(DEBUG) << "Device " << data_path << " has " << free << " free; requested "
+ << targetFreeBytes << "; needed " << needed;
- if (free >= targetFreeBytes) {
- return ok();
+ if (free >= targetFreeBytes) {
+ return ok();
+ }
}
if (flags & FLAG_FREE_CACHE_V2) {
@@ -1479,15 +1482,17 @@
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 = targetFreeBytes - free;
+ if (!defy_target) {
+ // Verify that we're actually done before bailing, since sneaky
+ // apps might be using hardlinks
if (needed <= 0) {
- break;
- } else {
- LOG(WARNING) << "Expected to be done but still need " << needed;
+ free = data_disk_free(data_path);
+ needed = targetFreeBytes - free;
+ if (needed <= 0) {
+ break;
+ } else {
+ LOG(WARNING) << "Expected to be done but still need " << needed;
+ }
}
}
}
@@ -1497,12 +1502,16 @@
return error("Legacy cache logic no longer supported");
}
- free = data_disk_free(data_path);
- if (free >= targetFreeBytes) {
- return ok();
+ if (!defy_target) {
+ free = data_disk_free(data_path);
+ if (free >= targetFreeBytes) {
+ return ok();
+ } else {
+ return error(StringPrintf("Failed to free up %" PRId64 " on %s; final free space %" PRId64,
+ targetFreeBytes, data_path.c_str(), free));
+ }
} else {
- return error(StringPrintf("Failed to free up %" PRId64 " on %s; final free space %" PRId64,
- targetFreeBytes, data_path.c_str(), free));
+ return ok();
}
}