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

Unified Diff: chrome/browser/safe_browsing/safe_browsing_database.cc

Issue 910953002: Move SafeBrowsing to the blocking pool via an experiment. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix browsertest. Created 5 years, 10 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
Index: chrome/browser/safe_browsing/safe_browsing_database.cc
diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
index 4690bf37b5755d669ed1f72c740c200ba8c2a986..1e85d7aa6a5c2376e10a6b0e34c9bbdbacbd1656 100644
--- a/chrome/browser/safe_browsing/safe_browsing_database.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
@@ -317,12 +317,21 @@ bool GetCachedFullHash(std::map<SBPrefix, SBCachedFullHashResult>* cache,
return true;
}
+SafeBrowsingStoreFile* CreateStore(
+ bool enable,
+ const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
+ if (!enable)
+ return nullptr;
+ return new SafeBrowsingStoreFile(task_runner);
+}
+
} // namespace
// The default SafeBrowsingDatabaseFactory.
class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
public:
SafeBrowsingDatabase* CreateSafeBrowsingDatabase(
+ const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
bool enable_download_protection,
bool enable_client_side_whitelist,
bool enable_download_whitelist,
@@ -331,15 +340,15 @@ class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
bool enable_ip_blacklist,
bool enable_unwanted_software_list) override {
return new SafeBrowsingDatabaseNew(
- new SafeBrowsingStoreFile, // browse_store
- enable_download_protection ? new SafeBrowsingStoreFile : NULL,
- enable_client_side_whitelist ? new SafeBrowsingStoreFile : NULL,
- enable_download_whitelist ? new SafeBrowsingStoreFile : NULL,
- new SafeBrowsingStoreFile, // inclusion_whitelist_store
- enable_extension_blacklist ? new SafeBrowsingStoreFile : NULL,
- enable_side_effect_free_whitelist ? new SafeBrowsingStoreFile : NULL,
- enable_ip_blacklist ? new SafeBrowsingStoreFile : NULL,
- enable_unwanted_software_list ? new SafeBrowsingStoreFile : NULL);
+ db_task_runner, CreateStore(true, db_task_runner), // browse_store
+ CreateStore(enable_download_protection, db_task_runner),
+ CreateStore(enable_client_side_whitelist, db_task_runner),
+ CreateStore(enable_download_whitelist, db_task_runner),
+ CreateStore(true, db_task_runner), // inclusion_whitelist_store
+ CreateStore(enable_extension_blacklist, db_task_runner),
+ CreateStore(enable_side_effect_free_whitelist, db_task_runner),
+ CreateStore(enable_ip_blacklist, db_task_runner),
+ CreateStore(enable_unwanted_software_list, db_task_runner));
}
SafeBrowsingDatabaseFactoryImpl() { }
@@ -351,12 +360,13 @@ class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
// static
SafeBrowsingDatabaseFactory* SafeBrowsingDatabase::factory_ = NULL;
-// Factory method, non-thread safe. Caller has to make sure this is called
-// on SafeBrowsing Thread.
+// Factory method, should be called on the Safe Browsing sequenced task runner,
+// which is also passed to the function as |current_task_runner|.
// TODO(shess): There's no need for a factory any longer. Convert
// SafeBrowsingDatabaseNew to SafeBrowsingDatabase, and have Create()
// callers just construct things directly.
SafeBrowsingDatabase* SafeBrowsingDatabase::Create(
+ const scoped_refptr<base::SequencedTaskRunner>& current_task_runner,
bool enable_download_protection,
bool enable_client_side_whitelist,
bool enable_download_whitelist,
@@ -364,15 +374,14 @@ SafeBrowsingDatabase* SafeBrowsingDatabase::Create(
bool enable_side_effect_free_whitelist,
bool enable_ip_blacklist,
bool enable_unwanted_software_list) {
+ DCHECK(current_task_runner->RunsTasksOnCurrentThread());
if (!factory_)
factory_ = new SafeBrowsingDatabaseFactoryImpl();
- return factory_->CreateSafeBrowsingDatabase(enable_download_protection,
- enable_client_side_whitelist,
- enable_download_whitelist,
- enable_extension_blacklist,
- enable_side_effect_free_whitelist,
- enable_ip_blacklist,
- enable_unwanted_software_list);
+ return factory_->CreateSafeBrowsingDatabase(
+ current_task_runner, enable_download_protection,
+ enable_client_side_whitelist, enable_download_whitelist,
+ enable_extension_blacklist, enable_side_effect_free_whitelist,
+ enable_ip_blacklist, enable_unwanted_software_list);
}
SafeBrowsingDatabase::~SafeBrowsingDatabase() {
@@ -446,7 +455,7 @@ base::FilePath SafeBrowsingDatabase::UnwantedSoftwareDBFilename(
SafeBrowsingStore* SafeBrowsingDatabaseNew::GetStore(const int list_id) {
// Stores are not thread safe.
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (list_id == safe_browsing_util::PHISH ||
list_id == safe_browsing_util::MALWARE) {
@@ -522,10 +531,10 @@ class SafeBrowsingDatabaseNew::ThreadSafeStateManager::ReadTransaction {
enum class AutoLockRequirement {
LOCK,
// SBWhitelist's, IPBlacklist's, and PrefixSet's (not caches) are only
- // ever written to on the main thread (as enforced by
- // ThreadSafeStateManager) and can therefore be read on the main thread
- // without first acquiring |lock_|.
- DONT_LOCK_ON_MAIN_THREAD
+ // ever written to on the main task runner (as enforced by
+ // ThreadSafeStateManager) and can therefore be read on the main task
+ // runner without first acquiring |lock_|.
+ DONT_LOCK_ON_MAIN_TASK_RUNNER
};
ReadTransaction(const ThreadSafeStateManager* outer,
@@ -535,7 +544,7 @@ class SafeBrowsingDatabaseNew::ThreadSafeStateManager::ReadTransaction {
if (auto_lock_requirement == AutoLockRequirement::LOCK)
transaction_lock_.reset(new base::AutoLock(outer_->lock_));
else
- DCHECK(outer_->thread_checker_.CalledOnValidThread());
+ DCHECK(outer_->db_task_runner_->RunsTasksOnCurrentThread());
}
const ThreadSafeStateManager* outer_;
@@ -591,7 +600,7 @@ class SafeBrowsingDatabaseNew::ThreadSafeStateManager::WriteTransaction {
explicit WriteTransaction(ThreadSafeStateManager* outer)
: outer_(outer), transaction_lock_(outer_->lock_) {
DCHECK(outer_);
- DCHECK(outer_->thread_checker_.CalledOnValidThread());
+ DCHECK(outer_->db_task_runner_->RunsTasksOnCurrentThread());
}
SBWhitelist* SBWhitelistForId(SBWhitelistId id) {
@@ -614,13 +623,23 @@ class SafeBrowsingDatabaseNew::ThreadSafeStateManager::WriteTransaction {
};
SafeBrowsingDatabaseNew::ThreadSafeStateManager::ThreadSafeStateManager(
- const base::ThreadChecker& thread_checker)
- : thread_checker_(thread_checker) {
+ const scoped_refptr<const base::SequencedTaskRunner>& db_task_runner)
+ : db_task_runner_(db_task_runner) {
}
SafeBrowsingDatabaseNew::ThreadSafeStateManager::~ThreadSafeStateManager() {
}
+SafeBrowsingDatabaseNew::DatabaseStateManager::DatabaseStateManager(
+ const scoped_refptr<const base::SequencedTaskRunner>& db_task_runner)
+ : db_task_runner_(db_task_runner),
+ corruption_detected_(false),
+ change_detected_(false) {
+}
+
+SafeBrowsingDatabaseNew::DatabaseStateManager::~DatabaseStateManager() {
+}
+
scoped_ptr<SafeBrowsingDatabaseNew::ReadTransaction>
SafeBrowsingDatabaseNew::ThreadSafeStateManager::BeginReadTransaction() {
return make_scoped_ptr(
@@ -628,9 +647,10 @@ SafeBrowsingDatabaseNew::ThreadSafeStateManager::BeginReadTransaction() {
}
scoped_ptr<SafeBrowsingDatabaseNew::ReadTransaction> SafeBrowsingDatabaseNew::
- ThreadSafeStateManager::BeginReadTransactionNoLockOnMainThread() {
+ ThreadSafeStateManager::BeginReadTransactionNoLockOnMainTaskRunner() {
return make_scoped_ptr(new ReadTransaction(
- this, ReadTransaction::AutoLockRequirement::DONT_LOCK_ON_MAIN_THREAD));
+ this,
+ ReadTransaction::AutoLockRequirement::DONT_LOCK_ON_MAIN_TASK_RUNNER));
}
scoped_ptr<SafeBrowsingDatabaseNew::WriteTransaction>
@@ -638,28 +658,8 @@ SafeBrowsingDatabaseNew::ThreadSafeStateManager::BeginWriteTransaction() {
return make_scoped_ptr(new WriteTransaction(this));
}
-SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew()
- : SafeBrowsingDatabaseNew(new SafeBrowsingStoreFile, // browse_store
- NULL, // download_store
- NULL, // csd_whitelist_store
- NULL, // download_whitelist_store
- NULL, // inclusion_whitelist_store
- NULL, // extension_blacklist_store
- NULL, // side_effect_free_whitelist_store
- NULL, // ip_blacklist_store
- NULL) { // unwanted_software_store
- DCHECK(browse_store_.get());
- DCHECK(!download_store_.get());
- DCHECK(!csd_whitelist_store_.get());
- DCHECK(!download_whitelist_store_.get());
- DCHECK(!inclusion_whitelist_store_.get());
- DCHECK(!extension_blacklist_store_.get());
- DCHECK(!side_effect_free_whitelist_store_.get());
- DCHECK(!ip_blacklist_store_.get());
- DCHECK(!unwanted_software_store_.get());
-}
-
SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
+ const scoped_refptr<base::SequencedTaskRunner>& db_task_runner,
SafeBrowsingStore* browse_store,
SafeBrowsingStore* download_store,
SafeBrowsingStore* csd_whitelist_store,
@@ -669,8 +669,9 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
SafeBrowsingStore* side_effect_free_whitelist_store,
SafeBrowsingStore* ip_blacklist_store,
SafeBrowsingStore* unwanted_software_store)
- : state_manager_(thread_checker_),
- db_state_manager_(thread_checker_),
+ : db_task_runner_(db_task_runner),
+ state_manager_(db_task_runner_),
+ db_state_manager_(db_task_runner_),
browse_store_(browse_store),
download_store_(download_store),
csd_whitelist_store_(csd_whitelist_store),
@@ -686,11 +687,11 @@ SafeBrowsingDatabaseNew::SafeBrowsingDatabaseNew(
SafeBrowsingDatabaseNew::~SafeBrowsingDatabaseNew() {
// The DCHECK is disabled due to crbug.com/338486 .
- // DCHECK(thread_checker_.CalledOnValidThread());
+ // DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
}
void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
db_state_manager_.init_filename_base(filename_base);
@@ -840,7 +841,7 @@ void SafeBrowsingDatabaseNew::Init(const base::FilePath& filename_base) {
}
bool SafeBrowsingDatabaseNew::ResetDatabase() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// Delete files on disk.
// TODO(shess): Hard to see where one might want to delete without a
@@ -940,7 +941,7 @@ bool SafeBrowsingDatabaseNew::PrefixSetContainsUrlHashes(
bool SafeBrowsingDatabaseNew::ContainsDownloadUrl(
const std::vector<GURL>& urls,
std::vector<SBPrefix>* prefix_hits) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// Ignore this check when download checking is not enabled.
if (!download_store_.get())
@@ -975,7 +976,7 @@ bool SafeBrowsingDatabaseNew::ContainsInclusionWhitelistedUrl(const GURL& url) {
bool SafeBrowsingDatabaseNew::ContainsExtensionPrefixes(
const std::vector<SBPrefix>& prefixes,
std::vector<SBPrefix>* prefix_hits) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (!extension_blacklist_store_)
return false;
@@ -1072,7 +1073,7 @@ void SafeBrowsingDatabaseNew::InsertAddChunk(
SafeBrowsingStore* store,
const safe_browsing_util::ListType list_id,
const SBChunkData& chunk_data) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(store);
// The server can give us a chunk that we already have because
@@ -1101,7 +1102,7 @@ void SafeBrowsingDatabaseNew::InsertSubChunk(
SafeBrowsingStore* store,
const safe_browsing_util::ListType list_id,
const SBChunkData& chunk_data) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(store);
// The server can give us a chunk that we already have because
@@ -1134,7 +1135,7 @@ void SafeBrowsingDatabaseNew::InsertSubChunk(
void SafeBrowsingDatabaseNew::InsertChunks(
const std::string& list_name,
const std::vector<SBChunkData*>& chunks) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (db_state_manager_.corruption_detected() || chunks.empty())
return;
@@ -1169,7 +1170,7 @@ void SafeBrowsingDatabaseNew::InsertChunks(
void SafeBrowsingDatabaseNew::DeleteChunks(
const std::vector<SBChunkDelete>& chunk_deletes) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (db_state_manager_.corruption_detected() || chunk_deletes.empty())
return;
@@ -1220,7 +1221,7 @@ void SafeBrowsingDatabaseNew::CacheHashResults(
bool SafeBrowsingDatabaseNew::UpdateStarted(
std::vector<SBListChunkRanges>* lists) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(lists);
// If |BeginUpdate()| fails, reset the database.
@@ -1326,7 +1327,7 @@ bool SafeBrowsingDatabaseNew::UpdateStarted(
}
void SafeBrowsingDatabaseNew::UpdateFinished(bool update_succeeded) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// The update may have failed due to corrupt storage (for instance,
// an excessive number of invalid add_chunks and sub_chunks).
@@ -1458,7 +1459,7 @@ void SafeBrowsingDatabaseNew::UpdateWhitelistStore(
const base::FilePath& store_filename,
SafeBrowsingStore* store,
SBWhitelistId whitelist_id) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (!store)
return;
@@ -1486,7 +1487,7 @@ void SafeBrowsingDatabaseNew::UpdateHashPrefixStore(
const base::FilePath& store_filename,
SafeBrowsingStore* store,
FailureType failure_type) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// These results are not used after this call. Simply ignore the
// returned value after FinishUpdate(...).
@@ -1510,7 +1511,7 @@ void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore(
FailureType finish_failure_type,
FailureType write_failure_type,
bool store_full_hashes_in_prefix_set) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(url_store);
// Measure the amount of IO during the filter build.
@@ -1590,7 +1591,7 @@ void SafeBrowsingDatabaseNew::UpdatePrefixSetUrlStore(
}
void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// Note: prefixes will not be empty. The current data store implementation
// stores all full-length hashes as both full and prefix hashes.
@@ -1615,20 +1616,20 @@ void SafeBrowsingDatabaseNew::UpdateIpBlacklistStore() {
}
void SafeBrowsingDatabaseNew::HandleCorruptDatabase() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// Reset the database after the current task has unwound (but only
// reset once within the scope of a given task).
if (!reset_factory_.HasWeakPtrs()) {
RecordFailure(FAILURE_DATABASE_CORRUPT);
- base::MessageLoop::current()->PostTask(FROM_HERE,
- base::Bind(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase,
- reset_factory_.GetWeakPtr()));
+ db_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&SafeBrowsingDatabaseNew::OnHandleCorruptDatabase,
+ reset_factory_.GetWeakPtr()));
}
}
void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER);
db_state_manager_.set_corruption_detected(); // Stop updating the database.
@@ -1647,7 +1648,7 @@ void SafeBrowsingDatabaseNew::LoadPrefixSet(const base::FilePath& db_filename,
WriteTransaction* txn,
PrefixSetId prefix_set_id,
FailureType read_failure_type) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(txn);
DCHECK(!db_state_manager_.filename_base().empty());
@@ -1671,7 +1672,7 @@ void SafeBrowsingDatabaseNew::LoadPrefixSet(const base::FilePath& db_filename,
}
bool SafeBrowsingDatabaseNew::Delete() {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
DCHECK(!db_state_manager_.filename_base().empty());
// TODO(shess): This is a mess. SafeBrowsingFileStore::Delete() closes the
@@ -1760,13 +1761,13 @@ bool SafeBrowsingDatabaseNew::Delete() {
void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename,
PrefixSetId prefix_set_id,
FailureType write_failure_type) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
// Do not grab the lock to avoid contention while writing to disk. This is
- // safe as only this thread can ever modify |state_manager_|'s prefix sets
- // anyways.
+ // safe as only this task runner can ever modify |state_manager_|'s prefix
+ // sets anyways.
scoped_ptr<ReadTransaction> txn =
- state_manager_.BeginReadTransactionNoLockOnMainThread();
+ state_manager_.BeginReadTransactionNoLockOnMainTaskRunner();
const PrefixSet* prefix_set = txn->GetPrefixSet(prefix_set_id);
if (!prefix_set)
@@ -1791,7 +1792,7 @@ void SafeBrowsingDatabaseNew::WritePrefixSet(const base::FilePath& db_filename,
void SafeBrowsingDatabaseNew::LoadWhitelist(
const std::vector<SBAddFullHash>& full_hashes,
SBWhitelistId whitelist_id) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
if (full_hashes.size() > kMaxWhitelistSize) {
state_manager_.BeginWriteTransaction()->WhitelistEverything(whitelist_id);
@@ -1819,7 +1820,7 @@ void SafeBrowsingDatabaseNew::LoadWhitelist(
void SafeBrowsingDatabaseNew::LoadIpBlacklist(
const std::vector<SBAddFullHash>& full_hashes) {
- DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(db_task_runner_->RunsTasksOnCurrentThread());
IPBlacklist new_blacklist;
for (std::vector<SBAddFullHash>::const_iterator it = full_hashes.begin();
« no previous file with comments | « chrome/browser/safe_browsing/safe_browsing_database.h ('k') | chrome/browser/safe_browsing/safe_browsing_database_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698