Bug 1254766 - Stop caching Safe Browsing completions to disk. r=gcp
MozReview-Commit-ID: 8Qnc8yymgDL
This commit is contained in:
@@ -304,11 +304,11 @@ Classifier::ApplyUpdates(nsTArray<TableUpdate*>* aUpdates)
|
||||
LOG(("Applying %d table updates.", aUpdates->Length()));
|
||||
|
||||
for (uint32_t i = 0; i < aUpdates->Length(); i++) {
|
||||
// Previous ApplyTableUpdates() may have consumed this update..
|
||||
// Previous UpdateHashStore() may have consumed this update..
|
||||
if ((*aUpdates)[i]) {
|
||||
// Run all updates for one table
|
||||
nsCString updateTable(aUpdates->ElementAt(i)->TableName());
|
||||
rv = ApplyTableUpdates(aUpdates, updateTable);
|
||||
rv = UpdateHashStore(aUpdates, updateTable);
|
||||
if (NS_FAILED(rv)) {
|
||||
if (rv != NS_ERROR_OUT_OF_MEMORY) {
|
||||
Reset();
|
||||
@@ -344,6 +344,25 @@ Classifier::ApplyUpdates(nsTArray<TableUpdate*>* aUpdates)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Classifier::ApplyFullHashes(nsTArray<TableUpdate*>* aUpdates)
|
||||
{
|
||||
LOG(("Applying %d table gethashes.", aUpdates->Length()));
|
||||
|
||||
for (uint32_t i = 0; i < aUpdates->Length(); i++) {
|
||||
TableUpdate *update = aUpdates->ElementAt(i);
|
||||
|
||||
nsresult rv = UpdateCache(update);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
aUpdates->ElementAt(i) = nullptr;
|
||||
delete update;
|
||||
}
|
||||
aUpdates->Clear();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Classifier::MarkSpoiled(nsTArray<nsCString>& aTables)
|
||||
{
|
||||
@@ -354,12 +373,20 @@ Classifier::MarkSpoiled(nsTArray<nsCString>& aTables)
|
||||
// Remove any cached Completes for this table
|
||||
LookupCache *cache = GetLookupCache(aTables[i]);
|
||||
if (cache) {
|
||||
cache->ClearCompleteCache();
|
||||
cache->ClearCache();
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
int64_t
|
||||
Classifier::GetLastUpdateTime(const nsACString& aTableName)
|
||||
{
|
||||
int64_t age;
|
||||
bool found = mTableFreshness.Get(aTableName, &age);
|
||||
return found ? (age * PR_MSEC_PER_SEC) : 0;
|
||||
}
|
||||
|
||||
void
|
||||
Classifier::SetLastUpdateTime(const nsACString &aTable,
|
||||
uint64_t updateTime)
|
||||
@@ -550,24 +577,17 @@ Classifier::RecoverBackups()
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will consume+delete updates from the passed nsTArray.
|
||||
*/
|
||||
nsresult
|
||||
Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
const nsACString& aTable)
|
||||
bool
|
||||
Classifier::CheckValidUpdate(nsTArray<TableUpdate*>* aUpdates,
|
||||
const nsACString& aTable)
|
||||
{
|
||||
LOG(("Classifier::ApplyTableUpdates(%s)", PromiseFlatCString(aTable).get()));
|
||||
|
||||
HashStore store(aTable, mStoreDirectory);
|
||||
|
||||
// take the quick exit if there is no valid update for us
|
||||
// (common case)
|
||||
uint32_t validupdates = 0;
|
||||
|
||||
for (uint32_t i = 0; i < aUpdates->Length(); i++) {
|
||||
TableUpdate *update = aUpdates->ElementAt(i);
|
||||
if (!update || !update->TableName().Equals(store.TableName()))
|
||||
if (!update || !update->TableName().Equals(aTable))
|
||||
continue;
|
||||
if (update->Empty()) {
|
||||
aUpdates->ElementAt(i) = nullptr;
|
||||
@@ -579,6 +599,24 @@ Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
|
||||
if (!validupdates) {
|
||||
// This can happen if the update was only valid for one table.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will consume+delete updates from the passed nsTArray.
|
||||
*/
|
||||
nsresult
|
||||
Classifier::UpdateHashStore(nsTArray<TableUpdate*>* aUpdates,
|
||||
const nsACString& aTable)
|
||||
{
|
||||
LOG(("Classifier::UpdateHashStore(%s)", PromiseFlatCString(aTable).get()));
|
||||
|
||||
HashStore store(aTable, mStoreDirectory);
|
||||
|
||||
if (!CheckValidUpdate(aUpdates, store.TableName())) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -588,20 +626,22 @@ Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Read the part of the store that is (only) in the cache
|
||||
LookupCache *prefixSet = GetLookupCache(store.TableName());
|
||||
if (!prefixSet) {
|
||||
LookupCache *lookupCache = GetLookupCache(store.TableName());
|
||||
if (!lookupCache) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Clear cache when update
|
||||
lookupCache->ClearCache();
|
||||
|
||||
FallibleTArray<uint32_t> AddPrefixHashes;
|
||||
rv = prefixSet->GetPrefixes(AddPrefixHashes);
|
||||
rv = lookupCache->GetPrefixes(AddPrefixHashes);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = store.AugmentAdds(AddPrefixHashes);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
AddPrefixHashes.Clear();
|
||||
|
||||
uint32_t applied = 0;
|
||||
bool updateFreshness = false;
|
||||
bool hasCompletes = false;
|
||||
|
||||
for (uint32_t i = 0; i < aUpdates->Length(); i++) {
|
||||
TableUpdate *update = aUpdates->ElementAt(i);
|
||||
@@ -623,17 +663,6 @@ Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
LOG((" %d add expirations", update->AddExpirations().Length()));
|
||||
LOG((" %d sub expirations", update->SubExpirations().Length()));
|
||||
|
||||
if (!update->IsLocalUpdate()) {
|
||||
updateFreshness = true;
|
||||
LOG(("Remote update, updating freshness"));
|
||||
}
|
||||
|
||||
if (update->AddCompletes().Length() > 0
|
||||
|| update->SubCompletes().Length() > 0) {
|
||||
hasCompletes = true;
|
||||
LOG(("Contains Completes, keeping cache."));
|
||||
}
|
||||
|
||||
aUpdates->ElementAt(i) = nullptr;
|
||||
delete update;
|
||||
}
|
||||
@@ -643,11 +672,6 @@ Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
rv = store.Rebuild();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Not an update with Completes, clear all completes data.
|
||||
if (!hasCompletes) {
|
||||
store.ClearCompletes();
|
||||
}
|
||||
|
||||
LOG(("Table %s now has:", store.TableName().get()));
|
||||
LOG((" %d add chunks", store.AddChunks().Length()));
|
||||
LOG((" %d add prefixes", store.AddPrefixes().Length()));
|
||||
@@ -661,21 +685,41 @@ Classifier::ApplyTableUpdates(nsTArray<TableUpdate*>* aUpdates,
|
||||
|
||||
// At this point the store is updated and written out to disk, but
|
||||
// the data is still in memory. Build our quick-lookup table here.
|
||||
rv = prefixSet->Build(store.AddPrefixes(), store.AddCompletes());
|
||||
rv = lookupCache->Build(store.AddPrefixes(), store.AddCompletes());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
#if defined(DEBUG)
|
||||
prefixSet->Dump();
|
||||
lookupCache->Dump();
|
||||
#endif
|
||||
rv = prefixSet->WriteFile();
|
||||
rv = lookupCache->WriteFile();
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (updateFreshness) {
|
||||
int64_t now = (PR_Now() / PR_USEC_PER_SEC);
|
||||
LOG(("Successfully updated %s", store.TableName().get()));
|
||||
mTableFreshness.Put(store.TableName(), now);
|
||||
int64_t now = (PR_Now() / PR_USEC_PER_SEC);
|
||||
LOG(("Successfully updated %s", store.TableName().get()));
|
||||
mTableFreshness.Put(store.TableName(), now);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Classifier::UpdateCache(TableUpdate* aUpdate)
|
||||
{
|
||||
if (!aUpdate) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsAutoCString table(aUpdate->TableName());
|
||||
LOG(("Classifier::UpdateCache(%s)", table.get()));
|
||||
|
||||
LookupCache *lookupCache = GetLookupCache(table);
|
||||
NS_ENSURE_TRUE(lookupCache, NS_ERROR_FAILURE);
|
||||
|
||||
lookupCache->AddCompletionsToCache(aUpdate->AddCompletes());
|
||||
|
||||
#if defined(DEBUG)
|
||||
lookupCache->DumpCache();
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user