diff options
author | noelutz@google.com <noelutz@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-03 21:47:06 +0000 |
---|---|---|
committer | noelutz@google.com <noelutz@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-03 21:47:06 +0000 |
commit | 8e1c5a3616e15f83e05766cb94093e8e9710f661 (patch) | |
tree | 3e8b7c2538975447e6355eb2c7e3d937e698f471 /chrome | |
parent | 7f15369ce670b984dcede7498de03793d6fa00fe (diff) | |
download | chromium_src-8e1c5a3616e15f83e05766cb94093e8e9710f661.zip chromium_src-8e1c5a3616e15f83e05766cb94093e8e9710f661.tar.gz chromium_src-8e1c5a3616e15f83e05766cb94093e8e9710f661.tar.bz2 |
Add tracking for scorer creation failures.
BUG=None
TEST=None
Review URL: http://codereview.chromium.org/6910008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@83969 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/renderer/safe_browsing/scorer.cc | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/chrome/renderer/safe_browsing/scorer.cc b/chrome/renderer/safe_browsing/scorer.cc index 677e244..636d1b4 100644 --- a/chrome/renderer/safe_browsing/scorer.cc +++ b/chrome/renderer/safe_browsing/scorer.cc @@ -9,10 +9,30 @@ #include "base/file_util_proxy.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" +#include "base/metrics/histogram.h" #include "base/string_piece.h" #include "chrome/renderer/safe_browsing/client_model.pb.h" #include "chrome/renderer/safe_browsing/features.h" +namespace { +// Enum used to keep stats about the status of the Scorer creation. +enum ScorerCreationStatus { + SCORER_SUCCESS, + SCORER_FAIL_MODEL_OPEN_FAIL, + SCORER_FAIL_MODEL_FILE_EMPTY, + SCORER_FAIL_MODEL_FILE_TOO_LARGE, + SCORER_FAIL_MODEL_PARSE_ERROR, + SCORER_FAIL_MODEL_MISSING_FIELDS, + SCORER_STATUS_MAX // Always add new values before this one. +}; + +void RecordScorerCreationStatus(ScorerCreationStatus status) { + UMA_HISTOGRAM_ENUMERATION("SBClientPhishing.ScorerCreationStatus", + status, + SCORER_STATUS_MAX); +} +} // namespace + namespace safe_browsing { const int Scorer::kMaxPhishingModelSizeBytes = 70 * 1024; @@ -67,10 +87,13 @@ class ScorerLoader { Scorer* scorer = NULL; if (error_code != base::PLATFORM_FILE_OK) { DLOG(ERROR) << "Error reading phishing model file: " << error_code; + RecordScorerCreationStatus(SCORER_FAIL_MODEL_OPEN_FAIL); } else if (bytes_read <= 0) { DLOG(ERROR) << "Empty phishing model file"; + RecordScorerCreationStatus(SCORER_FAIL_MODEL_FILE_EMPTY); } else if (bytes_read == Scorer::kMaxPhishingModelSizeBytes) { DLOG(ERROR) << "Phishing model is too large, ignoring"; + RecordScorerCreationStatus(SCORER_FAIL_MODEL_FILE_TOO_LARGE); } else { memcpy(buffer_, data, bytes_read); scorer = Scorer::Create(base::StringPiece(buffer_, bytes_read)); @@ -101,12 +124,19 @@ Scorer::~Scorer() {} Scorer* Scorer::Create(const base::StringPiece& model_str) { scoped_ptr<Scorer> scorer(new Scorer()); ClientSideModel& model = scorer->model_; - if (!model.ParseFromArray(model_str.data(), model_str.size()) || - !model.IsInitialized()) { + if (!model.ParseFromArray(model_str.data(), model_str.size())) { DLOG(ERROR) << "Unable to parse phishing model. This Scorer object is " << "invalid."; + RecordScorerCreationStatus(SCORER_FAIL_MODEL_PARSE_ERROR); + return NULL; + } + if (!model.IsInitialized()) { + DLOG(ERROR) << "Unable to parse phishing model. The model is missing " + << "some required fields. Maybe the .proto file changed?"; + RecordScorerCreationStatus(SCORER_FAIL_MODEL_MISSING_FIELDS); return NULL; } + RecordScorerCreationStatus(SCORER_SUCCESS); for (int i = 0; i < model.page_term_size(); ++i) { scorer->page_terms_.insert(model.hashes(model.page_term(i))); } |