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

Side by Side Diff: chrome/browser/safe_browsing/safe_browsing_database.cc

Issue 11196036: Finish conversion from bloom filter to prefix set in safe browsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Delete the unnecessary unit test. Created 8 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/safe_browsing/safe_browsing_database.h" 5 #include "chrome/browser/safe_browsing/safe_browsing_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/message_loop.h" 12 #include "base/message_loop.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/metrics/stats_counters.h" 14 #include "base/metrics/stats_counters.h"
15 #include "base/process_util.h" 15 #include "base/process_util.h"
16 #include "base/time.h" 16 #include "base/time.h"
17 #include "chrome/browser/safe_browsing/bloom_filter.h"
18 #include "chrome/browser/safe_browsing/prefix_set.h" 17 #include "chrome/browser/safe_browsing/prefix_set.h"
19 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" 18 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h"
20 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
21 #include "crypto/sha2.h" 20 #include "crypto/sha2.h"
22 #include "googleurl/src/gurl.h" 21 #include "googleurl/src/gurl.h"
23 22
24 #if defined(OS_MACOSX) 23 #if defined(OS_MACOSX)
25 #include "base/mac/mac_util.h" 24 #include "base/mac/mac_util.h"
26 #endif 25 #endif
27 26
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 if (subs_deleted > 0) 256 if (subs_deleted > 0)
258 UMA_HISTOGRAM_COUNTS("SB2.DownloadBinhashSubsDeleted", subs_deleted); 257 UMA_HISTOGRAM_COUNTS("SB2.DownloadBinhashSubsDeleted", subs_deleted);
259 } 258 }
260 259
261 // Order |SBAddFullHash| on the prefix part. |SBAddPrefixLess()| from 260 // Order |SBAddFullHash| on the prefix part. |SBAddPrefixLess()| from
262 // safe_browsing_store.h orders on both chunk-id and prefix. 261 // safe_browsing_store.h orders on both chunk-id and prefix.
263 bool SBAddFullHashPrefixLess(const SBAddFullHash& a, const SBAddFullHash& b) { 262 bool SBAddFullHashPrefixLess(const SBAddFullHash& a, const SBAddFullHash& b) {
264 return a.full_hash.prefix < b.full_hash.prefix; 263 return a.full_hash.prefix < b.full_hash.prefix;
265 } 264 }
266 265
267 // Track what LoadBloomFilterOrPrefixSet() loaded.
268 enum FilterLoad {
269 FILTER_LOAD, // All calls.
270 FILTER_LOADED_PREFIX_SET, // Cases loaded from prefix set.
271 FILTER_LOADED_BLOOM_FILTER, // Cases loaded from bloom filter.
272
273 // Memory space for histograms is determined by the max. ALWAYS ADD
274 // NEW VALUES BEFORE THIS ONE.
275 FILTER_LOAD_MAX
276 };
277
278 void RecordFilterLoad(FilterLoad event_type) {
279 UMA_HISTOGRAM_ENUMERATION("SB2.FilterLoad", event_type,
280 FILTER_LOAD_MAX);
281 }
282
283 // This code always checks for non-zero file size. This helper makes 266 // This code always checks for non-zero file size. This helper makes
284 // that less verbose. 267 // that less verbose.
285 int64 GetFileSizeOrZero(const FilePath& file_path) { 268 int64 GetFileSizeOrZero(const FilePath& file_path) {
286 int64 size_64; 269 int64 size_64;
287 if (!file_util::GetFileSize(file_path, &size_64)) 270 if (!file_util::GetFileSize(file_path, &size_64))
288 return 0; 271 return 0;
289 return size_64; 272 return size_64;
290 } 273 }
291 274
292 } // namespace 275 } // namespace
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 407
425 void SafeBrowsingDatabaseNew::Init(const FilePath& filename_base) { 408 void SafeBrowsingDatabaseNew::Init(const FilePath& filename_base) {
426 DCHECK_EQ(creation_loop_, MessageLoop::current()); 409 DCHECK_EQ(creation_loop_, MessageLoop::current());
427 // Ensure we haven't been run before. 410 // Ensure we haven't been run before.
428 DCHECK(browse_filename_.empty()); 411 DCHECK(browse_filename_.empty());
429 DCHECK(download_filename_.empty()); 412 DCHECK(download_filename_.empty());
430 DCHECK(csd_whitelist_filename_.empty()); 413 DCHECK(csd_whitelist_filename_.empty());
431 DCHECK(download_whitelist_filename_.empty()); 414 DCHECK(download_whitelist_filename_.empty());
432 415
433 browse_filename_ = BrowseDBFilename(filename_base); 416 browse_filename_ = BrowseDBFilename(filename_base);
434 bloom_filter_filename_ = BloomFilterForFilename(browse_filename_);
435 prefix_set_filename_ = PrefixSetForFilename(browse_filename_); 417 prefix_set_filename_ = PrefixSetForFilename(browse_filename_);
436 418
437 browse_store_->Init( 419 browse_store_->Init(
438 browse_filename_, 420 browse_filename_,
439 base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase, 421 base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
440 base::Unretained(this))); 422 base::Unretained(this)));
441 DVLOG(1) << "Init browse store: " << browse_filename_.value(); 423 DVLOG(1) << "Init browse store: " << browse_filename_.value();
442 424
443 { 425 {
444 // NOTE: There is no need to grab the lock in this function, since 426 // NOTE: There is no need to grab the lock in this function, since
445 // until it returns, there are no pointers to this class on other 427 // until it returns, there are no pointers to this class on other
446 // threads. Then again, that means there is no possibility of 428 // threads. Then again, that means there is no possibility of
447 // contention on the lock... 429 // contention on the lock...
448 base::AutoLock locked(lookup_lock_); 430 base::AutoLock locked(lookup_lock_);
449 full_browse_hashes_.clear(); 431 full_browse_hashes_.clear();
450 pending_browse_hashes_.clear(); 432 pending_browse_hashes_.clear();
451 LoadBloomFilterOrPrefixSet(); 433 LoadPrefixSet();
452 } 434 }
453 435
454 if (download_store_.get()) { 436 if (download_store_.get()) {
455 download_filename_ = DownloadDBFilename(filename_base); 437 download_filename_ = DownloadDBFilename(filename_base);
456 download_store_->Init( 438 download_store_->Init(
457 download_filename_, 439 download_filename_,
458 base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase, 440 base::Bind(&SafeBrowsingDatabaseNew::HandleCorruptDatabase,
459 base::Unretained(this))); 441 base::Unretained(this)));
460 DVLOG(1) << "Init download store: " << download_filename_.value(); 442 DVLOG(1) << "Init download store: " << download_filename_.value();
461 } 443 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 // reset. Perhaps inline |Delete()|? 486 // reset. Perhaps inline |Delete()|?
505 if (!Delete()) 487 if (!Delete())
506 return false; 488 return false;
507 489
508 // Reset objects in memory. 490 // Reset objects in memory.
509 { 491 {
510 base::AutoLock locked(lookup_lock_); 492 base::AutoLock locked(lookup_lock_);
511 full_browse_hashes_.clear(); 493 full_browse_hashes_.clear();
512 pending_browse_hashes_.clear(); 494 pending_browse_hashes_.clear();
513 prefix_miss_cache_.clear(); 495 prefix_miss_cache_.clear();
514 browse_bloom_filter_ = NULL;
515 prefix_set_.reset(); 496 prefix_set_.reset();
516 } 497 }
517 // Wants to acquire the lock itself. 498 // Wants to acquire the lock itself.
518 WhitelistEverything(&csd_whitelist_); 499 WhitelistEverything(&csd_whitelist_);
519 WhitelistEverything(&download_whitelist_); 500 WhitelistEverything(&download_whitelist_);
520 501
521 return true; 502 return true;
522 } 503 }
523 504
524 // TODO(lzheng): Remove matching_list, it is not used anywhere. 505 // TODO(lzheng): Remove matching_list, it is not used anywhere.
(...skipping 10 matching lines...) Expand all
535 516
536 std::vector<SBFullHash> full_hashes; 517 std::vector<SBFullHash> full_hashes;
537 BrowseFullHashesToCheck(url, false, &full_hashes); 518 BrowseFullHashesToCheck(url, false, &full_hashes);
538 if (full_hashes.empty()) 519 if (full_hashes.empty())
539 return false; 520 return false;
540 521
541 // This function is called on the I/O thread, prevent changes to 522 // This function is called on the I/O thread, prevent changes to
542 // filter and caches. 523 // filter and caches.
543 base::AutoLock locked(lookup_lock_); 524 base::AutoLock locked(lookup_lock_);
544 525
545 // TODO(shess): During transition, users will have a bloom filter 526 // |prefix_set_| is empty until it is either read from disk, or the
546 // but no prefix set until first update, after which they'll have a 527 // first update populates it. Bail out without a hit if not yet
547 // prefix set but no bloom filter. 528 // available.
548 const bool use_prefix_set = prefix_set_.get() != NULL; 529 if (!prefix_set_.get())
549 if (!use_prefix_set && !browse_bloom_filter_.get())
550 return false; 530 return false;
551 531
552 size_t miss_count = 0; 532 size_t miss_count = 0;
553 for (size_t i = 0; i < full_hashes.size(); ++i) { 533 for (size_t i = 0; i < full_hashes.size(); ++i) {
554 const SBPrefix prefix = full_hashes[i].prefix; 534 const SBPrefix prefix = full_hashes[i].prefix;
555 if ((use_prefix_set && prefix_set_->Exists(prefix)) || 535 if (prefix_set_->Exists(prefix)) {
556 (!use_prefix_set && browse_bloom_filter_->Exists(prefix))) {
557 prefix_hits->push_back(prefix); 536 prefix_hits->push_back(prefix);
558 if (prefix_miss_cache_.count(prefix) > 0) 537 if (prefix_miss_cache_.count(prefix) > 0)
559 ++miss_count; 538 ++miss_count;
560 } 539 }
561 } 540 }
562 541
563 // If all the prefixes are cached as 'misses', don't issue a GetHash. 542 // If all the prefixes are cached as 'misses', don't issue a GetHash.
564 if (miss_count == prefix_hits->size()) 543 if (miss_count == prefix_hits->size())
565 return false; 544 return false;
566 545
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 if (download_whitelist_store_.get() && 984 if (download_whitelist_store_.get() &&
1006 !download_whitelist_store_->CheckValidity()) { 985 !download_whitelist_store_->CheckValidity()) {
1007 DLOG(ERROR) << "Safe-browsing download whitelist database corrupt."; 986 DLOG(ERROR) << "Safe-browsing download whitelist database corrupt.";
1008 } 987 }
1009 } 988 }
1010 989
1011 if (corruption_detected_) 990 if (corruption_detected_)
1012 return; 991 return;
1013 992
1014 // Unroll the transaction if there was a protocol error or if the 993 // Unroll the transaction if there was a protocol error or if the
1015 // transaction was empty. This will leave the bloom filter, the 994 // transaction was empty. This will leave the prefix set, the
1016 // pending hashes, and the prefix miss cache in place. 995 // pending hashes, and the prefix miss cache in place.
1017 if (!update_succeeded || !change_detected_) { 996 if (!update_succeeded || !change_detected_) {
1018 // Track empty updates to answer questions at http://crbug.com/72216 . 997 // Track empty updates to answer questions at http://crbug.com/72216 .
1019 if (update_succeeded && !change_detected_) 998 if (update_succeeded && !change_detected_)
1020 UMA_HISTOGRAM_COUNTS("SB2.DatabaseUpdateKilobytes", 0); 999 UMA_HISTOGRAM_COUNTS("SB2.DatabaseUpdateKilobytes", 0);
1021 browse_store_->CancelUpdate(); 1000 browse_store_->CancelUpdate();
1022 if (download_store_.get()) 1001 if (download_store_.get())
1023 download_store_->CancelUpdate(); 1002 download_store_->CancelUpdate();
1024 if (csd_whitelist_store_.get()) 1003 if (csd_whitelist_store_.get())
1025 csd_whitelist_store_->CancelUpdate(); 1004 csd_whitelist_store_->CancelUpdate();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1165 base::AutoLock locked(lookup_lock_); 1144 base::AutoLock locked(lookup_lock_);
1166 full_browse_hashes_.swap(add_full_hashes); 1145 full_browse_hashes_.swap(add_full_hashes);
1167 1146
1168 // TODO(shess): If |CacheHashResults()| is posted between the 1147 // TODO(shess): If |CacheHashResults()| is posted between the
1169 // earlier lock and this clear, those pending hashes will be lost. 1148 // earlier lock and this clear, those pending hashes will be lost.
1170 // It could be fixed by only removing hashes which were collected 1149 // It could be fixed by only removing hashes which were collected
1171 // at the earlier point. I believe that is fail-safe as-is (the 1150 // at the earlier point. I believe that is fail-safe as-is (the
1172 // hash will be fetched again). 1151 // hash will be fetched again).
1173 pending_browse_hashes_.clear(); 1152 pending_browse_hashes_.clear();
1174 prefix_miss_cache_.clear(); 1153 prefix_miss_cache_.clear();
1175 browse_bloom_filter_ = NULL; // Stop using the bloom filter.
1176 prefix_set_.swap(prefix_set); 1154 prefix_set_.swap(prefix_set);
1177 } 1155 }
1178 1156
1179 DVLOG(1) << "SafeBrowsingDatabaseImpl built prefix set in " 1157 DVLOG(1) << "SafeBrowsingDatabaseImpl built prefix set in "
1180 << (base::TimeTicks::Now() - before).InMilliseconds() 1158 << (base::TimeTicks::Now() - before).InMilliseconds()
1181 << " ms total. prefix count: " << add_prefixes.size(); 1159 << " ms total. prefix count: " << add_prefixes.size();
1182 UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before); 1160 UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", base::TimeTicks::Now() - before);
1183 1161
1184 // Persist the prefix set to disk. Since only this thread changes 1162 // Persist the prefix set to disk. Since only this thread changes
1185 // |prefix_set_|, there is no need to lock. 1163 // |prefix_set_|, there is no need to lock.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 1204
1227 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() { 1205 void SafeBrowsingDatabaseNew::OnHandleCorruptDatabase() {
1228 RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER); 1206 RecordFailure(FAILURE_DATABASE_CORRUPT_HANDLER);
1229 corruption_detected_ = true; // Stop updating the database. 1207 corruption_detected_ = true; // Stop updating the database.
1230 ResetDatabase(); 1208 ResetDatabase();
1231 DLOG(FATAL) << "SafeBrowsing database was corrupt and reset"; 1209 DLOG(FATAL) << "SafeBrowsing database was corrupt and reset";
1232 } 1210 }
1233 1211
1234 // TODO(shess): I'm not clear why this code doesn't have any 1212 // TODO(shess): I'm not clear why this code doesn't have any
1235 // real error-handling. 1213 // real error-handling.
1236 // TODO(shess): After a transition period, this can convert to just 1214 void SafeBrowsingDatabaseNew::LoadPrefixSet() {
1237 // giving up if the prefix set is not on disk.
1238 void SafeBrowsingDatabaseNew::LoadBloomFilterOrPrefixSet() {
1239 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1215 DCHECK_EQ(creation_loop_, MessageLoop::current());
1240 DCHECK(!bloom_filter_filename_.empty());
1241 DCHECK(!prefix_set_filename_.empty()); 1216 DCHECK(!prefix_set_filename_.empty());
1242 1217
1243 // If there is no database, the filter cannot be used. 1218 // If there is no database, the filter cannot be used.
1244 base::PlatformFileInfo db_info; 1219 base::PlatformFileInfo db_info;
1245 if (!file_util::GetFileInfo(browse_filename_, &db_info) || db_info.size == 0) 1220 if (!file_util::GetFileInfo(browse_filename_, &db_info) || db_info.size == 0)
1246 return; 1221 return;
1247 1222
1248 RecordFilterLoad(FILTER_LOAD); 1223 // Cleanup any stale bloom filter (no longer used).
1249 1224 // TODO(shess): Track failure to delete?
1250 // If there is no prefix set, or if the file is too old, check for a 1225 FilePath bloom_filter_filename = BloomFilterForFilename(browse_filename_);
1251 // bloom filter. 1226 file_util::Delete(bloom_filter_filename, false);
1252 // TODO(shess): The time check is in case this code gets reverted
1253 // and re-landed. It might be good to keep as a sanity check.
1254 // Better would be to put the db's checksum in the filter file.
1255 base::PlatformFileInfo prefix_set_info;
1256 if (!file_util::GetFileInfo(prefix_set_filename_, &prefix_set_info) ||
1257 prefix_set_info.size == 0 ||
1258 prefix_set_info.last_modified < db_info.last_modified) {
1259 // No prefix set.
1260 prefix_set_.reset();
1261
1262 int64 file_size = GetFileSizeOrZero(bloom_filter_filename_);
1263 if (!file_size) {
1264 RecordFailure(FAILURE_DATABASE_FILTER_MISSING);
1265 return;
1266 }
1267
1268 const base::TimeTicks before = base::TimeTicks::Now();
1269 browse_bloom_filter_ = BloomFilter::LoadFile(bloom_filter_filename_);
1270 DVLOG(1) << "SafeBrowsingDatabaseNew read bloom filter in "
1271 << (base::TimeTicks::Now() - before).InMilliseconds() << " ms";
1272 UMA_HISTOGRAM_TIMES("SB2.BloomFilterLoad", base::TimeTicks::Now() - before);
1273
1274 if (!browse_bloom_filter_.get())
1275 RecordFailure(FAILURE_DATABASE_FILTER_READ);
1276 else
1277 RecordFilterLoad(FILTER_LOADED_BLOOM_FILTER);
1278
1279 return;
1280 }
1281
1282 // Once there is a prefix set stored, never use the bloom filter.
1283 browse_bloom_filter_ = NULL;
1284
1285 // TODO(shess): The bloom filter file should have been deleted in
1286 // WritePrefixSet(), unless this code is reverted and re-landed.
1287 // Just paranoid.
1288 file_util::Delete(bloom_filter_filename_, false);
1289 1227
1290 const base::TimeTicks before = base::TimeTicks::Now(); 1228 const base::TimeTicks before = base::TimeTicks::Now();
1291 prefix_set_.reset(safe_browsing::PrefixSet::LoadFile(prefix_set_filename_)); 1229 prefix_set_.reset(safe_browsing::PrefixSet::LoadFile(prefix_set_filename_));
1292 DVLOG(1) << "SafeBrowsingDatabaseNew read prefix set in " 1230 DVLOG(1) << "SafeBrowsingDatabaseNew read prefix set in "
1293 << (base::TimeTicks::Now() - before).InMilliseconds() << " ms"; 1231 << (base::TimeTicks::Now() - before).InMilliseconds() << " ms";
1294 UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before); 1232 UMA_HISTOGRAM_TIMES("SB2.PrefixSetLoad", base::TimeTicks::Now() - before);
1295 1233
1296 if (!prefix_set_.get()) 1234 if (!prefix_set_.get())
1297 RecordFailure(FAILURE_DATABASE_PREFIX_SET_READ); 1235 RecordFailure(FAILURE_DATABASE_PREFIX_SET_READ);
1298 else
1299 RecordFilterLoad(FILTER_LOADED_PREFIX_SET);
1300 } 1236 }
1301 1237
1302 bool SafeBrowsingDatabaseNew::Delete() { 1238 bool SafeBrowsingDatabaseNew::Delete() {
1303 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1239 DCHECK_EQ(creation_loop_, MessageLoop::current());
1304 1240
1305 const bool r1 = browse_store_->Delete(); 1241 const bool r1 = browse_store_->Delete();
1306 if (!r1) 1242 if (!r1)
1307 RecordFailure(FAILURE_DATABASE_STORE_DELETE); 1243 RecordFailure(FAILURE_DATABASE_STORE_DELETE);
1308 1244
1309 const bool r2 = download_store_.get() ? download_store_->Delete() : true; 1245 const bool r2 = download_store_.get() ? download_store_->Delete() : true;
1310 if (!r2) 1246 if (!r2)
1311 RecordFailure(FAILURE_DATABASE_STORE_DELETE); 1247 RecordFailure(FAILURE_DATABASE_STORE_DELETE);
1312 1248
1313 const bool r3 = csd_whitelist_store_.get() ? 1249 const bool r3 = csd_whitelist_store_.get() ?
1314 csd_whitelist_store_->Delete() : true; 1250 csd_whitelist_store_->Delete() : true;
1315 if (!r3) 1251 if (!r3)
1316 RecordFailure(FAILURE_DATABASE_STORE_DELETE); 1252 RecordFailure(FAILURE_DATABASE_STORE_DELETE);
1317 1253
1318 const bool r4 = download_whitelist_store_.get() ? 1254 const bool r4 = download_whitelist_store_.get() ?
1319 download_whitelist_store_->Delete() : true; 1255 download_whitelist_store_->Delete() : true;
1320 if (!r4) 1256 if (!r4)
1321 RecordFailure(FAILURE_DATABASE_STORE_DELETE); 1257 RecordFailure(FAILURE_DATABASE_STORE_DELETE);
1322 1258
1323 const bool r5 = file_util::Delete(bloom_filter_filename_, false); 1259 FilePath bloom_filter_filename = BloomFilterForFilename(browse_filename_);
1260 const bool r5 = file_util::Delete(bloom_filter_filename, false);
1324 if (!r5) 1261 if (!r5)
1325 RecordFailure(FAILURE_DATABASE_FILTER_DELETE); 1262 RecordFailure(FAILURE_DATABASE_FILTER_DELETE);
1326 1263
1327 const bool r6 = file_util::Delete(prefix_set_filename_, false); 1264 const bool r6 = file_util::Delete(prefix_set_filename_, false);
1328 if (!r6) 1265 if (!r6)
1329 RecordFailure(FAILURE_DATABASE_PREFIX_SET_DELETE); 1266 RecordFailure(FAILURE_DATABASE_PREFIX_SET_DELETE);
1330 return r1 && r2 && r3 && r4 && r5 && r6; 1267 return r1 && r2 && r3 && r4 && r5 && r6;
1331 } 1268 }
1332 1269
1333 void SafeBrowsingDatabaseNew::WritePrefixSet() { 1270 void SafeBrowsingDatabaseNew::WritePrefixSet() {
1334 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1271 DCHECK_EQ(creation_loop_, MessageLoop::current());
1335 1272
1336 if (!prefix_set_.get()) 1273 if (!prefix_set_.get())
1337 return; 1274 return;
1338 1275
1339 const base::TimeTicks before = base::TimeTicks::Now(); 1276 const base::TimeTicks before = base::TimeTicks::Now();
1340 const bool write_ok = prefix_set_->WriteFile(prefix_set_filename_); 1277 const bool write_ok = prefix_set_->WriteFile(prefix_set_filename_);
1341 DVLOG(1) << "SafeBrowsingDatabaseNew wrote prefix set in " 1278 DVLOG(1) << "SafeBrowsingDatabaseNew wrote prefix set in "
1342 << (base::TimeTicks::Now() - before).InMilliseconds() << " ms"; 1279 << (base::TimeTicks::Now() - before).InMilliseconds() << " ms";
1343 UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before); 1280 UMA_HISTOGRAM_TIMES("SB2.PrefixSetWrite", base::TimeTicks::Now() - before);
1344 1281
1345 if (!write_ok) 1282 if (!write_ok)
1346 RecordFailure(FAILURE_DATABASE_PREFIX_SET_WRITE); 1283 RecordFailure(FAILURE_DATABASE_PREFIX_SET_WRITE);
1347 1284
1348 // Delete any stale bloom filter (checking before deleting is
1349 // unlikely to be faster).
1350 file_util::Delete(bloom_filter_filename_, false);
1351
1352 #if defined(OS_MACOSX) 1285 #if defined(OS_MACOSX)
1353 base::mac::SetFileBackupExclusion(prefix_set_filename_); 1286 base::mac::SetFileBackupExclusion(prefix_set_filename_);
1354 #endif 1287 #endif
1355 } 1288 }
1356 1289
1357 void SafeBrowsingDatabaseNew::WhitelistEverything(SBWhitelist* whitelist) { 1290 void SafeBrowsingDatabaseNew::WhitelistEverything(SBWhitelist* whitelist) {
1358 base::AutoLock locked(lookup_lock_); 1291 base::AutoLock locked(lookup_lock_);
1359 whitelist->second = true; 1292 whitelist->second = true;
1360 whitelist->first.clear(); 1293 whitelist->first.clear();
1361 } 1294 }
(...skipping 21 matching lines...) Expand all
1383 if (std::binary_search(new_whitelist.begin(), new_whitelist.end(), 1316 if (std::binary_search(new_whitelist.begin(), new_whitelist.end(),
1384 kill_switch)) { 1317 kill_switch)) {
1385 // The kill switch is whitelisted hence we whitelist all URLs. 1318 // The kill switch is whitelisted hence we whitelist all URLs.
1386 WhitelistEverything(whitelist); 1319 WhitelistEverything(whitelist);
1387 } else { 1320 } else {
1388 base::AutoLock locked(lookup_lock_); 1321 base::AutoLock locked(lookup_lock_);
1389 whitelist->second = false; 1322 whitelist->second = false;
1390 whitelist->first.swap(new_whitelist); 1323 whitelist->first.swap(new_whitelist);
1391 } 1324 }
1392 } 1325 }
OLDNEW
« 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