Commit b134ed34 authored by tburkard@chromium.org's avatar tburkard@chromium.org

Update visit analysis code:

-- limit visit history considered to 100k entries to avoid out of memory crashes
-- exclude backforward/homepage/intermediate pages in redirect chain
-- reduce minimum spacing of pages considered from 1s to 500ms
-- collect histogram of core transition type of qualifying page views
R=brettw, dominich
Review URL: https://chromiumcodereview.appspot.com/9572021

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124779 0039d316-1c4b-4281-b951-d872f2087c98
parent 39465779
...@@ -75,15 +75,32 @@ class VisitDatabase::VisitAnalysis { ...@@ -75,15 +75,32 @@ class VisitDatabase::VisitAnalysis {
private: private:
enum VA_EVENTS { enum VA_EVENTS {
VA_VISIT = 0, VA_VISIT = 10,
VA_PRERENDER_STARTED_1 = 1, VA_VISIT_EXCLUDE_BACK_FORWARD = 11,
VA_PRERENDER_USED_1 = 2, VA_VISIT_EXCLUDE_HOME_PAGE = 12,
VA_PRERENDER_STARTED_3 = 3, VA_VISIT_EXCLUDE_REDIRECT_CHAIN = 13,
VA_PRERENDER_USED_3 = 4, VA_PRERENDER_STARTED_1 = 14,
VA_PRERENDER_STARTED_5 = 5, VA_PRERENDER_USED_1 = 15,
VA_PRERENDER_USED_5 = 6, VA_PRERENDER_STARTED_3 = 16,
VA_EVENT_MAX = 7 VA_PRERENDER_USED_3 = 17,
VA_PRERENDER_STARTED_5 = 18,
VA_PRERENDER_USED_5 = 19,
VA_EVENT_MAX = 20
}; };
bool IsBackForward(content::PageTransition transition) {
return (transition & content::PAGE_TRANSITION_FORWARD_BACK) != 0;
}
bool IsHomePage(content::PageTransition transition) {
return (transition & content::PAGE_TRANSITION_HOME_PAGE) != 0;
}
bool IsIntermediateRedirect(content::PageTransition transition) {
return (transition & content::PAGE_TRANSITION_CHAIN_END) == 0;
}
bool ShouldExcludeTransitionForPrediction(
content::PageTransition transition) {
return IsBackForward(transition) || IsHomePage(transition) ||
IsIntermediateRedirect(transition);
}
void RecordEvent(VA_EVENTS event, base::Time timestamp) { void RecordEvent(VA_EVENTS event, base::Time timestamp) {
int64 ts = timestamp.ToInternalValue(); int64 ts = timestamp.ToInternalValue();
if (time_event_bitmaps_.count(ts) < 1) if (time_event_bitmaps_.count(ts) < 1)
...@@ -183,7 +200,23 @@ class VisitDatabase::VisitAnalysis { ...@@ -183,7 +200,23 @@ class VisitDatabase::VisitAnalysis {
}; };
void ProcessVisit(const VisitRow& visit) { void ProcessVisit(const VisitRow& visit) {
VLOG(1) << "processing visit to " << visit.url_id; VLOG(1) << "processing visit to " << visit.url_id;
if (IsBackForward(visit.transition)) {
RecordEvent(VA_VISIT_EXCLUDE_BACK_FORWARD, visit.visit_time);
return;
}
if (IsHomePage(visit.transition)) {
RecordEvent(VA_VISIT_EXCLUDE_HOME_PAGE, visit.visit_time);
return;
}
if (IsIntermediateRedirect(visit.transition)) {
RecordEvent(VA_VISIT_EXCLUDE_REDIRECT_CHAIN, visit.visit_time);
return;
}
RecordEvent(VA_VISIT, visit.visit_time); RecordEvent(VA_VISIT, visit.visit_time);
UMA_HISTOGRAM_ENUMERATION(
"Prerender.LocalVisitCoreTransition",
visit.transition & content::PAGE_TRANSITION_CORE_MASK,
content::PAGE_TRANSITION_LAST_CORE + 1);
for (int i = 0; i < static_cast<int>(emulated_prerender_managers_.size()); for (int i = 0; i < static_cast<int>(emulated_prerender_managers_.size());
i++) { i++) {
emulated_prerender_managers_[i]->MaybeRecordPrerenderUsed(visit); emulated_prerender_managers_[i]->MaybeRecordPrerenderUsed(visit);
...@@ -199,19 +232,23 @@ class VisitDatabase::VisitAnalysis { ...@@ -199,19 +232,23 @@ class VisitDatabase::VisitAnalysis {
URLID best_prerender = 0; URLID best_prerender = 0;
int best_count = 0; int best_count = 0;
for (int i = 0; i < static_cast<int>(visits_.size()); i++) { for (int i = 0; i < static_cast<int>(visits_.size()); i++) {
VLOG(1) << visits_[i].visit_time.ToInternalValue()/1000000 << " " if (!ShouldExcludeTransitionForPrediction(visits_[i].transition)) {
<< visits_[i].url_id; VLOG(1) << visits_[i].visit_time.ToInternalValue()/1000000 << " "
if (visits_[i].url_id == visit.url_id) { << visits_[i].url_id;
VLOG(1) << "****"; if (visits_[i].url_id == visit.url_id) {
last_started = visits_[i].visit_time; VLOG(1) << "****";
num_occurrences++; last_started = visits_[i].visit_time;
currently_found.clear(); num_occurrences++;
continue; currently_found.clear();
} continue;
if (last_started > visits_[i].visit_time - max_age && }
last_started < visits_[i].visit_time - min_age) { if (last_started > visits_[i].visit_time - max_age &&
currently_found.insert(visits_[i].url_id); last_started < visits_[i].visit_time - min_age) {
VLOG(1) << "OK"; currently_found.insert(visits_[i].url_id);
VLOG(1) << "OK";
}
} else {
VLOG(1) << i << " (skipping)";
} }
if (i == static_cast<int>(visits_.size()) - 1 || if (i == static_cast<int>(visits_.size()) - 1 ||
visits_[i+1].url_id == visit.url_id) { visits_[i+1].url_id == visit.url_id) {
...@@ -263,8 +300,8 @@ class VisitDatabase::VisitAnalysis { ...@@ -263,8 +300,8 @@ class VisitDatabase::VisitAnalysis {
} }
void FetchHistory() { void FetchHistory() {
VLOG(1) << "VDB: fetching history"; VLOG(1) << "VDB: fetching history";
visit_database_->GetAllVisitsInRange(base::Time(), base::Time(), 0, visit_database_->GetAllVisitsInRange(base::Time(), base::Time(),
&visits_); kMaxVisitRecords, &visits_);
VLOG(1) << "READ visits " << visits_.size(); VLOG(1) << "READ visits " << visits_.size();
if (logging::GetVlogVerbosity() >= 1) { if (logging::GetVlogVerbosity() >= 1) {
for (int i = 0; i < static_cast<int>(visits_.size()); i++) { for (int i = 0; i < static_cast<int>(visits_.size()); i++) {
...@@ -277,9 +314,10 @@ class VisitDatabase::VisitAnalysis { ...@@ -277,9 +314,10 @@ class VisitDatabase::VisitAnalysis {
visits_fetched_ = true; visits_fetched_ = true;
MaybeProcessVisits(); MaybeProcessVisits();
} }
static const int kMaxVisitRecords = 100 * 1000;
static const int kFetchDelayMs = 30 * 1000; static const int kFetchDelayMs = 30 * 1000;
static const int kPrerenderExpirationSeconds = 300; static const int kPrerenderExpirationSeconds = 300;
static const int kMinSpacingMilliseconds = 1000; static const int kMinSpacingMilliseconds = 500;
VisitDatabase* visit_database_; VisitDatabase* visit_database_;
base::OneShotTimer<VisitAnalysis> timer_; base::OneShotTimer<VisitAnalysis> timer_;
VisitVector visits_; VisitVector visits_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment