From 1055fd4f4a59904cd25b3b5bae474a0c30ef19e2 Mon Sep 17 00:00:00 2001 From: Gian-Carlo Pascutto Date: Wed, 15 Aug 2012 09:04:31 +0200 Subject: [PATCH] Bug 673470 - Optimize input buffer size. Cache active tables. r=dcamp --- .../components/url-classifier/Classifier.cpp | 69 +++++++++++-------- .../components/url-classifier/Classifier.h | 2 + .../components/url-classifier/HashStore.cpp | 12 +++- toolkit/components/url-classifier/HashStore.h | 2 - .../nsUrlClassifierDBService.cpp | 3 + 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/toolkit/components/url-classifier/Classifier.cpp b/toolkit/components/url-classifier/Classifier.cpp index b362249557b..dd175b77006 100644 --- a/toolkit/components/url-classifier/Classifier.cpp +++ b/toolkit/components/url-classifier/Classifier.cpp @@ -182,6 +182,8 @@ Classifier::Open(nsIFile& aCacheDirectory) return NS_ERROR_FAILURE; } + RegenActiveTables(); + return NS_OK; } @@ -214,6 +216,7 @@ Classifier::Reset() NS_ENSURE_SUCCESS(rv, rv); mTableFreshness.Clear(); + RegenActiveTables(); return NS_OK; } @@ -368,6 +371,7 @@ Classifier::ApplyUpdates(nsTArray* aUpdates) } } aUpdates->Clear(); + RegenActiveTables(); LOG(("Done applying updates.")); #if defined(PR_LOGGING) @@ -405,6 +409,41 @@ Classifier::DropStores() mLookupCaches.Clear(); } +nsresult +Classifier::RegenActiveTables() +{ + mActiveTablesCache.Clear(); + + nsTArray foundTables; + ScanStoreDir(foundTables); + + for (uint32 i = 0; i < foundTables.Length(); i++) { + nsAutoPtr store(new HashStore(nsCString(foundTables[i]), mStoreDirectory)); + if (!store) + return NS_ERROR_OUT_OF_MEMORY; + + nsresult rv = store->Open(); + if (NS_FAILED(rv)) + continue; + + LookupCache *lookupCache = GetLookupCache(store->TableName()); + if (!lookupCache) { + continue; + } + + const ChunkSet &adds = store->AddChunks(); + const ChunkSet &subs = store->SubChunks(); + + if (adds.Length() == 0 && subs.Length() == 0) + continue; + + LOG(("Active table: %s", store->TableName().get())); + mActiveTablesCache.AppendElement(store->TableName()); + } + + return NS_OK; +} + nsresult Classifier::ScanStoreDir(nsTArray& aTables) { @@ -438,35 +477,7 @@ Classifier::ScanStoreDir(nsTArray& aTables) nsresult Classifier::ActiveTables(nsTArray& aTables) { - aTables.Clear(); - - nsTArray foundTables; - ScanStoreDir(foundTables); - - for (uint32 i = 0; i < foundTables.Length(); i++) { - nsAutoPtr store(new HashStore(nsCString(foundTables[i]), mStoreDirectory)); - if (!store) - return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv = store->Open(); - if (NS_FAILED(rv)) - continue; - - LookupCache *lookupCache = GetLookupCache(store->TableName()); - if (!lookupCache) { - continue; - } - - const ChunkSet &adds = store->AddChunks(); - const ChunkSet &subs = store->SubChunks(); - - if (adds.Length() == 0 && subs.Length() == 0) - continue; - - LOG(("Active table: %s", store->TableName().get())); - aTables.AppendElement(store->TableName()); - } - + aTables = mActiveTablesCache; return NS_OK; } diff --git a/toolkit/components/url-classifier/Classifier.h b/toolkit/components/url-classifier/Classifier.h index b6eb00a73b6..7ef191672f2 100644 --- a/toolkit/components/url-classifier/Classifier.h +++ b/toolkit/components/url-classifier/Classifier.h @@ -104,6 +104,7 @@ public: PrefixArray* aNoiseEntries); private: void DropStores(); + nsresult RegenActiveTables(); nsresult ScanStoreDir(nsTArray& aTables); nsresult ApplyTableUpdates(nsTArray* aUpdates, @@ -116,6 +117,7 @@ private: nsCOMPtr mStoreDirectory; nsTArray mHashStores; nsTArray mLookupCaches; + nsTArray mActiveTablesCache; PRUint32 mHashKey; // Stores the last time a given table was updated (seconds). nsDataHashtable mTableFreshness; diff --git a/toolkit/components/url-classifier/HashStore.cpp b/toolkit/components/url-classifier/HashStore.cpp index 3704000d71f..8f5cdf3411f 100644 --- a/toolkit/components/url-classifier/HashStore.cpp +++ b/toolkit/components/url-classifier/HashStore.cpp @@ -217,8 +217,12 @@ HashStore::Open() return NS_OK; } + PRInt64 fileSize; + rv = storeFile->GetFileSize(&fileSize); + NS_ENSURE_SUCCESS(rv, rv); + rv = NS_NewBufferedInputStream(getter_AddRefs(mInputStream), origStream, - BUFFER_SIZE); + fileSize); NS_ENSURE_SUCCESS(rv, rv); rv = CheckChecksum(storeFile); @@ -784,6 +788,10 @@ HashStore::WriteFile() rv = safeOut->Finish(); NS_ENSURE_SUCCESS(rv, rv); + PRInt64 fileSize; + rv = storeFile->GetFileSize(&fileSize); + NS_ENSURE_SUCCESS(rv, rv); + // Reopen the file now that we've rewritten it. nsCOMPtr origStream; rv = NS_NewLocalFileInputStream(getter_AddRefs(origStream), storeFile, @@ -791,7 +799,7 @@ HashStore::WriteFile() NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewBufferedInputStream(getter_AddRefs(mInputStream), origStream, - BUFFER_SIZE); + fileSize); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; diff --git a/toolkit/components/url-classifier/HashStore.h b/toolkit/components/url-classifier/HashStore.h index bf76984eea0..fca2d2aa27c 100644 --- a/toolkit/components/url-classifier/HashStore.h +++ b/toolkit/components/url-classifier/HashStore.h @@ -152,8 +152,6 @@ public: nsresult ReadEntireStore(); private: - static const int BUFFER_SIZE = 6 * 1024 * 1024; - void Clear(); nsresult Reset(); diff --git a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp index 89e7c5fbd04..b29b55054fb 100644 --- a/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp +++ b/toolkit/components/url-classifier/nsUrlClassifierDBService.cpp @@ -150,6 +150,9 @@ private: nsCOMPtr mCryptoHash; + nsAutoPtr mClassifier; + nsAutoPtr mProtocolParser; + // Directory where to store the SB databases. nsCOMPtr mCacheDir;