OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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_bloom.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_database_bloom.h" |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 // If we're missing either of the database or filter files, we wait until the | 84 // If we're missing either of the database or filter files, we wait until the |
85 // next update to generate a new filter. | 85 // next update to generate a new filter. |
86 // TODO(paulg): Investigate how often the filter file is missing and how | 86 // TODO(paulg): Investigate how often the filter file is missing and how |
87 // expensive it would be to regenerate it. | 87 // expensive it would be to regenerate it. |
88 int64 size_64; | 88 int64 size_64; |
89 if (!file_util::GetFileSize(filename_, &size_64) || size_64 == 0) | 89 if (!file_util::GetFileSize(filename_, &size_64) || size_64 == 0) |
90 return; | 90 return; |
91 | 91 |
92 if (!file_util::GetFileSize(bloom_filter_filename_, &size_64) || | 92 if (!file_util::GetFileSize(bloom_filter_filename_, &size_64) || |
93 size_64 == 0) { | 93 size_64 == 0) { |
94 UMA_HISTOGRAM_COUNTS(L"SB2.FilterMissing", 1); | 94 UMA_HISTOGRAM_COUNTS("SB2.FilterMissing", 1); |
95 return; | 95 return; |
96 } | 96 } |
97 | 97 |
98 // We have a bloom filter file, so use that as our filter. | 98 // We have a bloom filter file, so use that as our filter. |
99 int size = static_cast<int>(size_64); | 99 int size = static_cast<int>(size_64); |
100 char* data = new char[size]; | 100 char* data = new char[size]; |
101 CHECK(data); | 101 CHECK(data); |
102 | 102 |
103 Time before = Time::Now(); | 103 Time before = Time::Now(); |
104 file_util::ReadFile(bloom_filter_filename_, data, size); | 104 file_util::ReadFile(bloom_filter_filename_, data, size); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 } else { | 396 } else { |
397 while (!chunk.hosts.empty()) { | 397 while (!chunk.hosts.empty()) { |
398 chunk.hosts.front().entry->Destroy(); | 398 chunk.hosts.front().entry->Destroy(); |
399 chunk.hosts.pop_front(); | 399 chunk.hosts.pop_front(); |
400 } | 400 } |
401 } | 401 } |
402 | 402 |
403 chunks->pop_front(); | 403 chunks->pop_front(); |
404 } | 404 } |
405 | 405 |
406 UMA_HISTOGRAM_TIMES(L"SB2.ChunkInsert", base::Time::Now() - insert_start); | 406 UMA_HISTOGRAM_TIMES("SB2.ChunkInsert", base::Time::Now() - insert_start); |
407 | 407 |
408 delete chunks; | 408 delete chunks; |
409 | 409 |
410 if (chunk_inserted_callback_.get()) | 410 if (chunk_inserted_callback_.get()) |
411 chunk_inserted_callback_->Run(); | 411 chunk_inserted_callback_->Run(); |
412 } | 412 } |
413 | 413 |
414 bool SafeBrowsingDatabaseBloom::UpdateStarted() { | 414 bool SafeBrowsingDatabaseBloom::UpdateStarted() { |
415 DCHECK(insert_transaction_.get() == NULL); | 415 DCHECK(insert_transaction_.get() == NULL); |
416 | 416 |
(...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1309 | 1309 |
1310 // Save the chunk numbers we've received to the database for reporting in | 1310 // Save the chunk numbers we've received to the database for reporting in |
1311 // future update requests. | 1311 // future update requests. |
1312 if (!WriteChunkNumbers()) | 1312 if (!WriteChunkNumbers()) |
1313 return; | 1313 return; |
1314 | 1314 |
1315 // Commit all the changes to the database. | 1315 // Commit all the changes to the database. |
1316 int rv = insert_transaction_->Commit(); | 1316 int rv = insert_transaction_->Commit(); |
1317 if (rv != SQLITE_OK) { | 1317 if (rv != SQLITE_OK) { |
1318 NOTREACHED() << "SafeBrowsing update transaction failed to commit."; | 1318 NOTREACHED() << "SafeBrowsing update transaction failed to commit."; |
1319 UMA_HISTOGRAM_COUNTS(L"SB2.FailedUpdate", 1); | 1319 UMA_HISTOGRAM_COUNTS("SB2.FailedUpdate", 1); |
1320 return; | 1320 return; |
1321 } | 1321 } |
1322 | 1322 |
1323 // Swap in the newly built filter and cache. If there were any matching subs, | 1323 // Swap in the newly built filter and cache. If there were any matching subs, |
1324 // the size (add_count_) will be smaller. | 1324 // the size (add_count_) will be smaller. |
1325 { | 1325 { |
1326 AutoLock lock(lookup_lock_); | 1326 AutoLock lock(lookup_lock_); |
1327 add_count_ = new_count; | 1327 add_count_ = new_count; |
1328 bloom_filter_ = filter; | 1328 bloom_filter_ = filter; |
1329 hash_cache_.swap(add_cache); | 1329 hash_cache_.swap(add_cache); |
1330 } | 1330 } |
1331 | 1331 |
1332 TimeDelta bloom_gen = Time::Now() - before; | 1332 TimeDelta bloom_gen = Time::Now() - before; |
1333 | 1333 |
1334 // Persist the bloom filter to disk. | 1334 // Persist the bloom filter to disk. |
1335 WriteBloomFilter(); | 1335 WriteBloomFilter(); |
1336 | 1336 |
1337 // Gather statistics. | 1337 // Gather statistics. |
1338 #if defined(OS_WIN) | 1338 #if defined(OS_WIN) |
1339 metric->GetIOCounters(&io_after); | 1339 metric->GetIOCounters(&io_after); |
1340 UMA_HISTOGRAM_COUNTS(L"SB2.BuildReadBytes", | 1340 UMA_HISTOGRAM_COUNTS("SB2.BuildReadBytes", |
1341 static_cast<int>(io_after.ReadTransferCount - | 1341 static_cast<int>(io_after.ReadTransferCount - |
1342 io_before.ReadTransferCount)); | 1342 io_before.ReadTransferCount)); |
1343 UMA_HISTOGRAM_COUNTS(L"SB2.BuildWriteBytes", | 1343 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteBytes", |
1344 static_cast<int>(io_after.WriteTransferCount - | 1344 static_cast<int>(io_after.WriteTransferCount - |
1345 io_before.WriteTransferCount)); | 1345 io_before.WriteTransferCount)); |
1346 UMA_HISTOGRAM_COUNTS(L"SB2.BuildReadOperations", | 1346 UMA_HISTOGRAM_COUNTS("SB2.BuildReadOperations", |
1347 static_cast<int>(io_after.ReadOperationCount - | 1347 static_cast<int>(io_after.ReadOperationCount - |
1348 io_before.ReadOperationCount)); | 1348 io_before.ReadOperationCount)); |
1349 UMA_HISTOGRAM_COUNTS(L"SB2.BuildWriteOperations", | 1349 UMA_HISTOGRAM_COUNTS("SB2.BuildWriteOperations", |
1350 static_cast<int>(io_after.WriteOperationCount - | 1350 static_cast<int>(io_after.WriteOperationCount - |
1351 io_before.WriteOperationCount)); | 1351 io_before.WriteOperationCount)); |
1352 #endif | 1352 #endif |
1353 SB_DLOG(INFO) << "SafeBrowsingDatabaseImpl built bloom filter in " | 1353 SB_DLOG(INFO) << "SafeBrowsingDatabaseImpl built bloom filter in " |
1354 << bloom_gen.InMilliseconds() | 1354 << bloom_gen.InMilliseconds() |
1355 << " ms total. prefix count: "<< add_count_; | 1355 << " ms total. prefix count: "<< add_count_; |
1356 UMA_HISTOGRAM_LONG_TIMES(L"SB2.BuildFilter", bloom_gen); | 1356 UMA_HISTOGRAM_LONG_TIMES("SB2.BuildFilter", bloom_gen); |
1357 UMA_HISTOGRAM_COUNTS(L"SB2.AddPrefixes", add_count_); | 1357 UMA_HISTOGRAM_COUNTS("SB2.AddPrefixes", add_count_); |
1358 UMA_HISTOGRAM_COUNTS(L"SB2.SubPrefixes", subs); | 1358 UMA_HISTOGRAM_COUNTS("SB2.SubPrefixes", subs); |
1359 int64 size_64; | 1359 int64 size_64; |
1360 if (file_util::GetFileSize(filename_, &size_64)) | 1360 if (file_util::GetFileSize(filename_, &size_64)) |
1361 UMA_HISTOGRAM_COUNTS(L"SB2.DatabaseBytes", static_cast<int>(size_64)); | 1361 UMA_HISTOGRAM_COUNTS("SB2.DatabaseBytes", static_cast<int>(size_64)); |
1362 } | 1362 } |
1363 | 1363 |
1364 void SafeBrowsingDatabaseBloom::GetCachedFullHashes( | 1364 void SafeBrowsingDatabaseBloom::GetCachedFullHashes( |
1365 const std::vector<SBPrefix>* prefix_hits, | 1365 const std::vector<SBPrefix>* prefix_hits, |
1366 std::vector<SBFullHashResult>* full_hits, | 1366 std::vector<SBFullHashResult>* full_hits, |
1367 Time last_update) { | 1367 Time last_update) { |
1368 DCHECK(prefix_hits && full_hits); | 1368 DCHECK(prefix_hits && full_hits); |
1369 | 1369 |
1370 Time max_age = Time::Now() - TimeDelta::FromMinutes(kMaxStalenessMinutes); | 1370 Time max_age = Time::Now() - TimeDelta::FromMinutes(kMaxStalenessMinutes); |
1371 | 1371 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 if (did_resume_) { | 1487 if (did_resume_) { |
1488 PlatformThread::Sleep(kOnResumeHoldupMs); | 1488 PlatformThread::Sleep(kOnResumeHoldupMs); |
1489 did_resume_ = false; | 1489 did_resume_ = false; |
1490 } | 1490 } |
1491 } | 1491 } |
1492 | 1492 |
1493 // This database is always synchronous since we don't need to worry about | 1493 // This database is always synchronous since we don't need to worry about |
1494 // blocking any incoming reads. | 1494 // blocking any incoming reads. |
1495 void SafeBrowsingDatabaseBloom::SetSynchronous() { | 1495 void SafeBrowsingDatabaseBloom::SetSynchronous() { |
1496 } | 1496 } |
OLD | NEW |