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

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

Issue 6711021: Safe-browsing PrefixSet cleanups. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add logging for first-broken-detected, appease the git-cl gods. Created 9 years, 9 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/metrics/stats_counters.h" 11 #include "base/metrics/stats_counters.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 // - Any bloom filter miss should be a prefix set miss. 207 // - Any bloom filter miss should be a prefix set miss.
208 // - Any prefix set hit should be a bloom filter hit. 208 // - Any prefix set hit should be a bloom filter hit.
209 // - Bloom filter false positives are prefix set misses. 209 // - Bloom filter false positives are prefix set misses.
210 // The following is to log actual performance to verify this. 210 // The following is to log actual performance to verify this.
211 enum PrefixSetEvent { 211 enum PrefixSetEvent {
212 PREFIX_SET_EVENT_HIT, 212 PREFIX_SET_EVENT_HIT,
213 PREFIX_SET_EVENT_BLOOM_HIT, 213 PREFIX_SET_EVENT_BLOOM_HIT,
214 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT, 214 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT,
215 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID, 215 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID,
216 PREFIX_SET_GETPREFIXES_BROKEN, 216 PREFIX_SET_GETPREFIXES_BROKEN,
217 PREFIX_SET_GETPREFIXES_FIRST_BROKEN,
218 PREFIX_SET_SBPREFIX_WAS_BROKEN,
217 219
218 // Memory space for histograms is determined by the max. ALWAYS ADD 220 // Memory space for histograms is determined by the max. ALWAYS ADD
219 // NEW VALUES BEFORE THIS ONE. 221 // NEW VALUES BEFORE THIS ONE.
220 PREFIX_SET_EVENT_MAX 222 PREFIX_SET_EVENT_MAX
221 }; 223 };
222 224
223 void RecordPrefixSetInfo(PrefixSetEvent event_type) { 225 void RecordPrefixSetInfo(PrefixSetEvent event_type) {
224 UMA_HISTOGRAM_ENUMERATION("SB2.PrefixSetEvent", event_type, 226 UMA_HISTOGRAM_ENUMERATION("SB2.PrefixSetEvent", event_type,
225 PREFIX_SET_EVENT_MAX); 227 PREFIX_SET_EVENT_MAX);
226 } 228 }
227 229
230 // Verify that |GetPrefixes()| returns the same set of prefixes as
231 // |prefixes|. This is necessary so that the
232 // PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID histogram in
233 // ContainsBrowseUrl() can be trustworthy.
234 void CheckPrefixSet(const safe_browsing::PrefixSet& prefix_set,
235 const std::vector<SBPrefix>& prefixes) {
236 std::vector<SBPrefix> restored;
237 prefix_set.GetPrefixes(&restored);
238
239 const std::set<SBPrefix> unique(prefixes.begin(), prefixes.end());
240
241 // Expect them to be equal.
242 if (restored.size() == unique.size() &&
243 std::equal(unique.begin(), unique.end(), restored.begin()))
244 return;
245
246 // Log BROKEN for continuity with previous release, and SIZE to
247 // distinguish which test failed.
248 NOTREACHED();
249 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN);
lzheng 2011/03/18 00:37:34 When you get here, do you want to see if it is res
Scott Hess - ex-Googler 2011/03/18 02:04:59 Actually, I had another histogram for this, I can
250
251 // Try to distinguish between updates from one broken user and a
252 // distributed problem.
253 static bool logged_broken = false;
254 if (!logged_broken) {
255 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_FIRST_BROKEN);
256 logged_broken = true;
257 }
258
259 // This seems so very very unlikely. But if it ever were true, then
260 // it could explain why GetPrefixes() seemed broken.
261 if (sizeof(int) != sizeof(int32))
262 RecordPrefixSetInfo(PREFIX_SET_SBPREFIX_WAS_BROKEN);
263 }
264
228 } // namespace 265 } // namespace
229 266
230 // The default SafeBrowsingDatabaseFactory. 267 // The default SafeBrowsingDatabaseFactory.
231 class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory { 268 class SafeBrowsingDatabaseFactoryImpl : public SafeBrowsingDatabaseFactory {
232 public: 269 public:
233 virtual SafeBrowsingDatabase* CreateSafeBrowsingDatabase( 270 virtual SafeBrowsingDatabase* CreateSafeBrowsingDatabase(
234 bool enable_download_protection, 271 bool enable_download_protection,
235 bool enable_client_side_whitelist) { 272 bool enable_client_side_whitelist) {
236 return new SafeBrowsingDatabaseNew( 273 return new SafeBrowsingDatabaseNew(
237 new SafeBrowsingStoreFile, 274 new SafeBrowsingStoreFile,
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 } 1003 }
967 1004
968 std::vector<SBPrefix> prefixes; 1005 std::vector<SBPrefix> prefixes;
969 for (size_t i = 0; i < add_prefixes.size(); ++i) { 1006 for (size_t i = 0; i < add_prefixes.size(); ++i) {
970 prefixes.push_back(add_prefixes[i].prefix); 1007 prefixes.push_back(add_prefixes[i].prefix);
971 } 1008 }
972 std::sort(prefixes.begin(), prefixes.end()); 1009 std::sort(prefixes.begin(), prefixes.end());
973 scoped_ptr<safe_browsing::PrefixSet> 1010 scoped_ptr<safe_browsing::PrefixSet>
974 prefix_set(new safe_browsing::PrefixSet(prefixes)); 1011 prefix_set(new safe_browsing::PrefixSet(prefixes));
975 1012
976 // Verify that |GetPrefixes()| returns the same set of prefixes as 1013 CheckPrefixSet(*(prefix_set.get()), prefixes);
977 // was passed to the constructor.
978 std::vector<SBPrefix> restored;
979 prefix_set->GetPrefixes(&restored);
980 prefixes.erase(std::unique(prefixes.begin(), prefixes.end()), prefixes.end());
981 if (restored.size() != prefixes.size() ||
982 !std::equal(prefixes.begin(), prefixes.end(), restored.begin())) {
983 NOTREACHED();
984 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN);
985 }
986 1014
987 // This needs to be in sorted order by prefix for efficient access. 1015 // This needs to be in sorted order by prefix for efficient access.
988 std::sort(add_full_hashes.begin(), add_full_hashes.end(), 1016 std::sort(add_full_hashes.begin(), add_full_hashes.end(),
989 SBAddFullHashPrefixLess); 1017 SBAddFullHashPrefixLess);
990 1018
991 // Swap in the newly built filter and cache. 1019 // Swap in the newly built filter and cache.
992 { 1020 {
993 base::AutoLock locked(lookup_lock_); 1021 base::AutoLock locked(lookup_lock_);
994 full_browse_hashes_.swap(add_full_hashes); 1022 full_browse_hashes_.swap(add_full_hashes);
995 1023
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 // Manually re-generate the prefix set from the main database. 1117 // Manually re-generate the prefix set from the main database.
1090 // TODO(shess): Write/read for prefix set. 1118 // TODO(shess): Write/read for prefix set.
1091 std::vector<SBAddPrefix> add_prefixes; 1119 std::vector<SBAddPrefix> add_prefixes;
1092 browse_store_->GetAddPrefixes(&add_prefixes); 1120 browse_store_->GetAddPrefixes(&add_prefixes);
1093 std::vector<SBPrefix> prefixes; 1121 std::vector<SBPrefix> prefixes;
1094 for (size_t i = 0; i < add_prefixes.size(); ++i) { 1122 for (size_t i = 0; i < add_prefixes.size(); ++i) {
1095 prefixes.push_back(add_prefixes[i].prefix); 1123 prefixes.push_back(add_prefixes[i].prefix);
1096 } 1124 }
1097 std::sort(prefixes.begin(), prefixes.end()); 1125 std::sort(prefixes.begin(), prefixes.end());
1098 prefix_set_.reset(new safe_browsing::PrefixSet(prefixes)); 1126 prefix_set_.reset(new safe_browsing::PrefixSet(prefixes));
1099 1127 CheckPrefixSet(*(prefix_set_.get()), prefixes);
1100 // Double-check the prefixes so that the
1101 // PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID histogram in
1102 // ContainsBrowseUrl() can be trustworthy.
1103 std::vector<SBPrefix> restored;
1104 prefix_set_->GetPrefixes(&restored);
1105 std::set<SBPrefix> unique(prefixes.begin(), prefixes.end());
1106 if (restored.size() != unique.size() ||
1107 !std::equal(unique.begin(), unique.end(), restored.begin())) {
1108 NOTREACHED();
1109 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN);
1110 }
1111 } 1128 }
1112 1129
1113 bool SafeBrowsingDatabaseNew::Delete() { 1130 bool SafeBrowsingDatabaseNew::Delete() {
1114 DCHECK_EQ(creation_loop_, MessageLoop::current()); 1131 DCHECK_EQ(creation_loop_, MessageLoop::current());
1115 1132
1116 const bool r1 = browse_store_->Delete(); 1133 const bool r1 = browse_store_->Delete();
1117 if (!r1) 1134 if (!r1)
1118 RecordFailure(FAILURE_DATABASE_STORE_DELETE); 1135 RecordFailure(FAILURE_DATABASE_STORE_DELETE);
1119 1136
1120 const bool r2 = download_store_.get() ? download_store_->Delete() : true; 1137 const bool r2 = download_store_.get() ? download_store_->Delete() : true;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1173 if (std::binary_search(new_csd_whitelist.begin(), new_csd_whitelist.end(), 1190 if (std::binary_search(new_csd_whitelist.begin(), new_csd_whitelist.end(),
1174 kill_switch)) { 1191 kill_switch)) {
1175 // The kill switch is whitelisted hence we whitelist all URLs. 1192 // The kill switch is whitelisted hence we whitelist all URLs.
1176 CsdWhitelistAllUrls(); 1193 CsdWhitelistAllUrls();
1177 } else { 1194 } else {
1178 base::AutoLock locked(lookup_lock_); 1195 base::AutoLock locked(lookup_lock_);
1179 csd_whitelist_all_urls_ = false; 1196 csd_whitelist_all_urls_ = false;
1180 csd_whitelist_.swap(new_csd_whitelist); 1197 csd_whitelist_.swap(new_csd_whitelist);
1181 } 1198 }
1182 } 1199 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698