From 60f8a5330ca921d936ae306bf6d17596b82b518c Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Tue, 30 May 2017 14:38:42 -0600 Subject: 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 --- cmds/installd/InstalldNativeService.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) (limited to 'cmds/installd/InstalldNativeService.cpp') 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& 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 lock(mLock); @@ -938,11 +931,12 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr= freeStorageSize) { + if (free >= targetFreeBytes) { return ok(); } @@ -999,6 +993,7 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr left, std::shared_ptr right) { return (left->getCacheRatio() < right->getCacheRatio()); }; @@ -1007,6 +1002,7 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptrloadStats(); queue.push(it.second); + cacheTotal += it.second->cacheUsed; } ATRACE_END(); @@ -1023,6 +1019,12 @@ binder::Status InstalldNativeService::freeCache(const std::unique_ptr 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_ptrcacheUsed -= 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= 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)); } } -- cgit v1.2.3-59-g8ed1b