Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Unified Diff: content/browser/cache_storage/cache_storage.cc

Issue 1421863002: [CacheStorage] Garbage collect unreferenced caches (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@random_cache_name
Patch Set: Nits Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/cache_storage/cache_storage_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/cache_storage/cache_storage.cc
diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc
index aa0ffb33f4dc6169a5e6a19bc49968d1504f9ecd..99393b2cc1d258edd47227e38142d50a139327c6 100644
--- a/content/browser/cache_storage/cache_storage.cc
+++ b/content/browser/cache_storage/cache_storage.cc
@@ -4,6 +4,7 @@
#include "content/browser/cache_storage/cache_storage.h"
+#include <set>
#include <string>
#include "base/barrier_closure.h"
@@ -327,6 +328,8 @@ class CacheStorage::SimpleCacheLoader : public CacheStorage::CacheLoader {
const std::string& serialized) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ scoped_ptr<std::set<std::string>> cache_dirs(new std::set<std::string>);
+
CacheStorageIndex index;
if (index.ParseFromString(serialized)) {
for (int i = 0, max = index.cache_size(); i < max; ++i) {
@@ -334,9 +337,14 @@ class CacheStorage::SimpleCacheLoader : public CacheStorage::CacheLoader {
DCHECK(cache.has_cache_dir());
names->push_back(cache.name());
cache_name_to_cache_dir_[cache.name()] = cache.cache_dir();
+ cache_dirs->insert(cache.cache_dir());
}
}
+ cache_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&DeleteUnreferencedCachesInPool, origin_path_,
+ base::Passed(&cache_dirs)));
+
// TODO(jkarlin): Delete caches that are in the directory and not returned
jsbell 2015/10/23 21:20:22 Remove this TODO?
jkarlin 2015/10/23 23:08:45 Thanks! The whole purpose of the CL was to remove
// in LoadIndex.
callback.Run(names.Pass());
@@ -346,6 +354,20 @@ class CacheStorage::SimpleCacheLoader : public CacheStorage::CacheLoader {
friend class MigratedLegacyCacheDirectoryNameTest;
~SimpleCacheLoader() override {}
+ // Iterates over the caches and deletes any directory not found in
+ // |cache_dirs|. Runs on cache_task_runner_
+ static void DeleteUnreferencedCachesInPool(
+ const base::FilePath& cache_base_dir,
+ scoped_ptr<std::set<std::string>> cache_dirs) {
+ base::FileEnumerator file_enum(cache_base_dir, false /* recursive */,
jsbell 2015/10/23 21:20:22 I'm suddenly paranoid that the docs for FileEnumer
jkarlin 2015/10/23 23:08:45 No longer deletes while iterating, just to be safe
+ base::FileEnumerator::DIRECTORIES);
+ base::FilePath cache_path;
+ while (!(cache_path = file_enum.Next()).empty()) {
+ if (!ContainsKey(*cache_dirs, cache_path.BaseName().AsUTF8Unsafe()))
+ base::DeleteFile(cache_path, true /* recursive */);
+ }
+ }
+
// Runs on cache_task_runner_
static std::string MigrateCachesIfNecessaryInPool(
const std::string& body,
« no previous file with comments | « no previous file | content/browser/cache_storage/cache_storage_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698