Bug 964898 - Auto delete unused cache version data on demand, r=jduell

This commit is contained in:
Honza Bambas 2014-02-05 20:29:54 +01:00
parent 76c5141e04
commit 3908bcae70
10 changed files with 88 additions and 1 deletions

View File

@ -18,6 +18,7 @@ XPIDL_MODULE = 'necko_cache'
EXPORTS += [
'nsApplicationCacheService.h',
'nsCacheService.h',
'nsDeleteDir.h'
]
# These files cannot be built in unified mode because they force NSPR logging.

View File

@ -3053,6 +3053,23 @@ nsCacheService::GetClearingEntries()
return gService->mClearingEntries;
}
// static
void nsCacheService::GetDiskCacheDirectory(nsIFile ** result) {
*result = nullptr;
if (gService && gService->mObserver) {
nsCOMPtr<nsIFile> directory =
gService->mObserver->DiskCacheParentDirectory();
if (!directory)
return;
nsresult rv = directory->AppendNative(NS_LITERAL_CSTRING("Cache"));
if (NS_FAILED(rv))
return;
directory.forget(result);
}
}
#if defined(PR_LOGGING)
void

View File

@ -127,6 +127,8 @@ public:
static bool GetClearingEntries();
static void GetDiskCacheDirectory(nsIFile ** result);
/**
* Methods called by any cache classes
*/

View File

@ -1611,6 +1611,19 @@ CacheFileIOManager::EnumerateEntryFiles(EEnumerateMode aMode,
return NS_OK;
}
// static
void CacheFileIOManager::GetCacheDirectory(nsIFile** result)
{
*result = nullptr;
nsRefPtr<CacheFileIOManager> ioMan = gInstance;
if (!ioMan)
return;
nsCOMPtr<nsIFile> file = ioMan->mCacheDirectory;
file.forget(result);
}
static nsresult
TruncFile(PRFileDesc *aFD, uint32_t aEOF)
{

View File

@ -224,6 +224,8 @@ public:
static nsresult EnumerateEntryFiles(EEnumerateMode aMode,
CacheEntriesEnumerator** aEnumerator);
static void GetCacheDirectory(nsIFile** result);
private:
friend class CacheFileHandle;
friend class CacheFileChunk;

View File

@ -25,6 +25,8 @@ uint32_t CacheObserver::sMemoryLimit = kDefaultMemoryLimit;
static uint32_t const kDefaultUseNewCache = 0; // Don't use the new cache by default
uint32_t CacheObserver::sUseNewCache = kDefaultUseNewCache;
static int32_t const kAutoDeleteCacheVersion = -1; // Auto-delete off by default
static int32_t sAutoDeleteCacheVersion = kAutoDeleteCacheVersion;
static int32_t const kDefaultHalfLifeExperiment = -1; // Disabled
int32_t CacheObserver::sHalfLifeExperiment = kDefaultHalfLifeExperiment;
@ -71,6 +73,7 @@ CacheObserver::Init()
obs->AddObserver(sSelf, "prefservice:after-app-defaults", true);
obs->AddObserver(sSelf, "profile-do-change", true);
obs->AddObserver(sSelf, "sessionstore-windows-restored", true);
obs->AddObserver(sSelf, "profile-before-change", true);
obs->AddObserver(sSelf, "xpcom-shutdown", true);
obs->AddObserver(sSelf, "last-pb-context-exited", true);
@ -94,6 +97,9 @@ CacheObserver::Shutdown()
void
CacheObserver::AttachToPreferences()
{
sAutoDeleteCacheVersion = mozilla::Preferences::GetInt(
"browser.cache.auto_delete_cache_version", kAutoDeleteCacheVersion);
mozilla::Preferences::AddUintVarCache(
&sUseNewCache, "browser.cache.use_new_backend", kDefaultUseNewCache);
@ -153,6 +159,21 @@ CacheObserver::AttachToPreferences()
}
}
void CacheObserver::SchduleAutoDelete()
{
// Auto-delete not set
if (sAutoDeleteCacheVersion == -1)
return;
// Don't autodelete the same version of the cache user has setup
// to use.
int32_t activeVersion = UseNewCache() ? 1 : 0;
if (sAutoDeleteCacheVersion == activeVersion)
return;
CacheStorageService::WipeCacheDirectory(sAutoDeleteCacheVersion);
}
// static
bool const CacheObserver::UseNewCache()
{
@ -284,6 +305,11 @@ CacheObserver::Observe(nsISupports* aSubject,
return NS_OK;
}
if (!strcmp(aTopic, "sessionstore-windows-restored")) {
SchduleAutoDelete();
return NS_OK;
}
if (!strcmp(aTopic, "profile-before-change")) {
nsRefPtr<CacheStorageService> service = CacheStorageService::Self();
if (service)
@ -332,6 +358,7 @@ CacheObserver::Observe(nsISupports* aSubject,
return NS_OK;
}
MOZ_ASSERT(false, "Missing observer handler");
return NS_OK;
}

View File

@ -51,6 +51,7 @@ private:
static CacheObserver* sSelf;
void AttachToPreferences();
void SchduleAutoDelete();
static uint32_t sUseNewCache;
static bool sUseDiskCache;

View File

@ -9,12 +9,13 @@
#include "nsICacheStorageVisitor.h"
#include "nsIObserverService.h"
#include "nsICacheService.h" // for old cache preference
#include "CacheStorage.h"
#include "AppCacheStorage.h"
#include "CacheEntry.h"
#include "OldWrappers.h"
#include "nsCacheService.h"
#include "nsDeleteDir.h"
#include "nsIFile.h"
#include "nsIURI.h"
@ -384,6 +385,25 @@ void CacheStorageService::DropPrivateBrowsingEntries()
DoomStorageEntries(keys[i], true, nullptr);
}
// static
void CacheStorageService::WipeCacheDirectory(uint32_t aVersion)
{
nsCOMPtr<nsIFile> cacheDir;
switch (aVersion) {
case 0:
nsCacheService::GetDiskCacheDirectory(getter_AddRefs(cacheDir));
break;
case 1:
CacheFileIOManager::GetCacheDirectory(getter_AddRefs(cacheDir));
break;
}
if (!cacheDir)
return;
nsDeleteDir::DeleteDir(cacheDir, true, 30000);
}
// Helper methods
// static

View File

@ -53,6 +53,9 @@ public:
void Shutdown();
void DropPrivateBrowsingEntries();
// Wipes out the new or the old cache directory completely.
static void WipeCacheDirectory(uint32_t aVersion);
static CacheStorageService* Self() { return sSelf; }
nsresult Dispatch(nsIRunnable* aEvent);
static bool IsRunning() { return sSelf && !sSelf->mShutdown; }

View File

@ -47,6 +47,7 @@ SOURCES += [
LOCAL_INCLUDES += [
'../base/src',
'../cache',
]
FAIL_ON_WARNINGS = True