OLD | NEW |
1 // Copyright (c) 2011 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 #include <iterator> | 8 #include <iterator> |
9 | 9 |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 PREFIX_SET_EVENT_HIT, | 214 PREFIX_SET_EVENT_HIT, |
215 PREFIX_SET_EVENT_BLOOM_HIT, | 215 PREFIX_SET_EVENT_BLOOM_HIT, |
216 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT, | 216 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT, |
217 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID, | 217 PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID, |
218 PREFIX_SET_GETPREFIXES_BROKEN, | 218 PREFIX_SET_GETPREFIXES_BROKEN, |
219 PREFIX_SET_GETPREFIXES_BROKEN_SIZE, | 219 PREFIX_SET_GETPREFIXES_BROKEN_SIZE, |
220 PREFIX_SET_GETPREFIXES_FIRST_BROKEN, | 220 PREFIX_SET_GETPREFIXES_FIRST_BROKEN, |
221 PREFIX_SET_SBPREFIX_WAS_BROKEN, | 221 PREFIX_SET_SBPREFIX_WAS_BROKEN, |
222 PREFIX_SET_GETPREFIXES_BROKEN_SORTING, | 222 PREFIX_SET_GETPREFIXES_BROKEN_SORTING, |
223 PREFIX_SET_GETPREFIXES_BROKEN_DUPLICATION, | 223 PREFIX_SET_GETPREFIXES_BROKEN_DUPLICATION, |
| 224 PREFIX_SET_GETPREFIX_UNSORTED_IS_DELTA, |
| 225 PREFIX_SET_GETPREFIX_UNSORTED_IS_INDEX, |
224 | 226 |
225 // Memory space for histograms is determined by the max. ALWAYS ADD | 227 // Memory space for histograms is determined by the max. ALWAYS ADD |
226 // NEW VALUES BEFORE THIS ONE. | 228 // NEW VALUES BEFORE THIS ONE. |
227 PREFIX_SET_EVENT_MAX | 229 PREFIX_SET_EVENT_MAX |
228 }; | 230 }; |
229 | 231 |
230 void RecordPrefixSetInfo(PrefixSetEvent event_type) { | 232 void RecordPrefixSetInfo(PrefixSetEvent event_type) { |
231 UMA_HISTOGRAM_ENUMERATION("SB2.PrefixSetEvent", event_type, | 233 UMA_HISTOGRAM_ENUMERATION("SB2.PrefixSetEvent", event_type, |
232 PREFIX_SET_EVENT_MAX); | 234 PREFIX_SET_EVENT_MAX); |
233 } | 235 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 logged_broken = true; | 280 logged_broken = true; |
279 } | 281 } |
280 | 282 |
281 // This seems so very very unlikely. But if it ever were true, then | 283 // This seems so very very unlikely. But if it ever were true, then |
282 // it could explain why GetPrefixes() seemed broken. | 284 // it could explain why GetPrefixes() seemed broken. |
283 if (sizeof(int) != sizeof(int32)) | 285 if (sizeof(int) != sizeof(int32)) |
284 RecordPrefixSetInfo(PREFIX_SET_SBPREFIX_WAS_BROKEN); | 286 RecordPrefixSetInfo(PREFIX_SET_SBPREFIX_WAS_BROKEN); |
285 | 287 |
286 // Check whether |restored| is unsorted, or has duplication. | 288 // Check whether |restored| is unsorted, or has duplication. |
287 if (restored.size()) { | 289 if (restored.size()) { |
288 bool unsorted = false; | 290 size_t unsorted_count = 0; |
289 bool duplicates = false; | 291 bool duplicates = false; |
290 std::vector<SBPrefix>::const_iterator prev = restored.begin(); | 292 SBPrefix prev = restored[0]; |
291 for (std::vector<SBPrefix>::const_iterator iter = prev + 1; | 293 for (size_t i = 0; i < restored.size(); prev = restored[i], ++i) { |
292 iter != restored.end(); prev = iter, ++iter) { | 294 if (prev > restored[i]) { |
293 if (*prev > *iter) | 295 unsorted_count++; |
294 unsorted = true; | 296 UMA_HISTOGRAM_COUNTS("SB2.PrefixSetUnsortedDifference", |
295 if (*prev == *iter) | 297 prev - restored[i]); |
| 298 |
| 299 // When unsorted, how big is the set, and how far are we into |
| 300 // it. If the set is very small or large, that might inform |
| 301 // pursuit of a degenerate case. If the percentage is close |
| 302 // to 0%, 100%, or 50%, then there might be an interesting |
| 303 // degenerate case to explore. |
| 304 UMA_HISTOGRAM_COUNTS("SB2.PrefixSetUnsortedSize", restored.size()); |
| 305 UMA_HISTOGRAM_PERCENTAGE("SB2.PrefixSetUnsortedPercent", |
| 306 i * 100 / restored.size()); |
| 307 |
| 308 if (prefix_set->IsDeltaAt(i)) { |
| 309 RecordPrefixSetInfo(PREFIX_SET_GETPREFIX_UNSORTED_IS_DELTA); |
| 310 |
| 311 // Histograms require memory on the order of the number of |
| 312 // buckets, making high-precision logging expensive. For |
| 313 // now aim for a sense of the range of the problem. |
| 314 UMA_HISTOGRAM_CUSTOM_COUNTS("SB2.PrefixSetUnsortedDelta", |
| 315 prefix_set->DeltaAt(i), 1, 0xFFFF, 50); |
| 316 } else { |
| 317 RecordPrefixSetInfo(PREFIX_SET_GETPREFIX_UNSORTED_IS_INDEX); |
| 318 } |
| 319 } |
| 320 if (prev == restored[i]) |
296 duplicates = true; | 321 duplicates = true; |
297 } | 322 } |
298 | 323 |
299 // Record findings. | 324 // Record findings. |
300 if (unsorted) | 325 if (unsorted_count) { |
301 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN_SORTING); | 326 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN_SORTING); |
| 327 UMA_HISTOGRAM_COUNTS_100("SB2.PrefixSetUnsorted", unsorted_count); |
| 328 } |
302 if (duplicates) | 329 if (duplicates) |
303 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN_DUPLICATION); | 330 RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN_DUPLICATION); |
304 | 331 |
305 // Fix the problems noted. If |restored| was unsorted, then | 332 // Fix the problems noted. If |restored| was unsorted, then |
306 // |duplicates| may give a false negative. | 333 // |duplicates| may give a false negative. |
307 if (unsorted) | 334 if (unsorted_count) |
308 std::sort(restored.begin(), restored.end()); | 335 std::sort(restored.begin(), restored.end()); |
309 if (unsorted || duplicates) | 336 if (unsorted_count || duplicates) |
310 restored.erase(std::unique(restored.begin(), restored.end()), | 337 restored.erase(std::unique(restored.begin(), restored.end()), |
311 restored.end()); | 338 restored.end()); |
312 } | 339 } |
313 | 340 |
314 // NOTE(shess): The following could be done using a single | 341 // NOTE(shess): The following could be done using a single |
315 // uber-loop, but it's complicated by needing multiple parallel | 342 // uber-loop, but it's complicated by needing multiple parallel |
316 // iterators. Didn't seem worthwhile for something that will only | 343 // iterators. Didn't seem worthwhile for something that will only |
317 // live for a short period and only fires for one in a million | 344 // live for a short period and only fires for one in a million |
318 // updates. | 345 // updates. |
319 | 346 |
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1252 if (std::binary_search(new_csd_whitelist.begin(), new_csd_whitelist.end(), | 1279 if (std::binary_search(new_csd_whitelist.begin(), new_csd_whitelist.end(), |
1253 kill_switch)) { | 1280 kill_switch)) { |
1254 // The kill switch is whitelisted hence we whitelist all URLs. | 1281 // The kill switch is whitelisted hence we whitelist all URLs. |
1255 CsdWhitelistAllUrls(); | 1282 CsdWhitelistAllUrls(); |
1256 } else { | 1283 } else { |
1257 base::AutoLock locked(lookup_lock_); | 1284 base::AutoLock locked(lookup_lock_); |
1258 csd_whitelist_all_urls_ = false; | 1285 csd_whitelist_all_urls_ = false; |
1259 csd_whitelist_.swap(new_csd_whitelist); | 1286 csd_whitelist_.swap(new_csd_whitelist); |
1260 } | 1287 } |
1261 } | 1288 } |
OLD | NEW |