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

Unified Diff: chrome/browser/predictors/resource_prefetch_predictor_tables.cc

Issue 2321343002: Redirect handling in resource prefetch predictor (Closed)
Patch Set: test Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/predictors/resource_prefetch_predictor_tables.cc
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc
index 75cfb3942947b5820fb761d5309cb80159e00c25..9202271649c123c8d00c60bb03331157274a2e20 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc
@@ -24,6 +24,8 @@ using sql::Statement;
namespace {
using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow;
+using RedirectStatRow =
+ predictors::ResourcePrefetchPredictorTables::RedirectStatRow;
const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
@@ -68,6 +70,12 @@ void BindResourceRowToStatement(const ResourceRow& row,
statement->BindBlob(2, &proto_buffer[0], size);
}
+void BindRedirectStatRowToStatement(const RedirectStatRow& row,
+ const std::string& primary_key,
+ Statement* statement) {
+
+}
+
bool StepAndInitializeResourceRow(Statement* statement,
ResourceRow* row,
std::string* primary_key) {
@@ -231,27 +239,61 @@ bool ResourcePrefetchPredictorTables::PrefetchData::operator==(
resources == rhs.resources;
}
+RedirectStatRow::RedirectStatRow()
+ : number_of_hits(0),
+ number_of_misses(0),
+ consecutive_misses(0) {}
+
+RedirectStatRow::RedirectStatRow(const RedirectStatRow& other)
+ : final_redirect(other.final_redirect),
+ number_of_hits(other.number_of_hits),
+ number_of_misses(other.number_of_misses),
+ consecutive_misses(other.consecutive_misses) {}
+
+ResourcePrefetchPredictorTables::RedirectData::RedirectData(
+ PrefetchKeyType i_key_type,
+ const std::string& i_primary_key)
+ : key_type(i_key_type),
+ primary_key(i_primary_key) {}
+
+ResourcePrefetchPredictorTables::RedirectData::RedirectData(
+ const RedirectData& other)
+ : key_type(other.key_type),
+ primary_key(other.primary_key),
+ last_visit(other.last_visit),
+ redirect_stats(other.redirect_stats) {}
+
+ResourcePrefetchPredictorTables::RedirectData::~RedirectData() {
+}
+
void ResourcePrefetchPredictorTables::GetAllData(
PrefetchDataMap* url_data_map,
- PrefetchDataMap* host_data_map) {
+ PrefetchDataMap* host_data_map,
+ RedirectDataMap* url_redirect_data_map,
+ RedirectDataMap* host_redirect_data_map) {
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
DCHECK(url_data_map);
DCHECK(host_data_map);
+ DCHECK(url_redirect_data_map);
+ DCHECK(host_redirect_data_map);
url_data_map->clear();
host_data_map->clear();
+ url_redirect_data_map->clear();
+ host_redirect_data_map->clear();
std::vector<std::string> urls_to_delete, hosts_to_delete;
GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete);
GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete);
+ // TODO: get data from redirect tables
if (!urls_to_delete.empty() || !hosts_to_delete.empty())
DeleteData(urls_to_delete, hosts_to_delete);
}
-void ResourcePrefetchPredictorTables::UpdateData(
+void ResourcePrefetchPredictorTables::UpdatePrefetchData(
const PrefetchData& url_data,
const PrefetchData& host_data) {
DCHECK_CURRENTLY_ON(BrowserThread::DB);
@@ -263,7 +305,8 @@ void ResourcePrefetchPredictorTables::UpdateData(
DB()->BeginTransaction();
- bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) &&
+ bool success =
+ (url_data.primary_key.empty() || UpdatePrefetchDataHelper(url_data)) &&
(host_data.primary_key.empty() || UpdateDataHelper(host_data));
if (!success)
DB()->RollbackTransaction();
@@ -271,6 +314,21 @@ void ResourcePrefetchPredictorTables::UpdateData(
DB()->CommitTransaction();
}
+void ResourcePrefetchPredictorTables::UpdateRedirectData(
+ const RedirectData& redirect_data) {
+ DCHECK_CURRENTLY_ON(BrowserThread::DB);
+ if (CantAccessDatabase())
+ return;
+
+ DB()->BeginTransaction();
+
+ bool success = UpdateRedirectDataHelper(redirect_data);
+ if (!success)
+ DB()->RollbackTransaction();
+
+ DB()->CommitTransaction();
+}
+
void ResourcePrefetchPredictorTables::DeleteData(
const std::vector<std::string>& urls,
const std::vector<std::string>& hosts) {
@@ -364,7 +422,7 @@ void ResourcePrefetchPredictorTables::GetAllDataHelper(
}
}
-bool ResourcePrefetchPredictorTables::UpdateDataHelper(
+bool ResourcePrefetchPredictorTables::UpdatePrefetchDataHelper(
const PrefetchData& data) {
DCHECK(!data.primary_key.empty());
@@ -409,6 +467,36 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper(
return true;
}
+bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper(
+ const RedirectData& data) {
+ DCHECK(!data.primary_key.empty());
+
+ if (!StringsAreSmallerThanDBLimit(data)) {
+ // TODO: UMA?
mattcary 2016/09/09 13:19:21 Yes!
+ return false;
+ }
+
+ // Delete the older data from the table.
+ std::unique_ptr<Statement> deleter(data.is_host()
+ ? GetHostRedirectStatDeleteStatement()
+ : GetUrlRedirectStatDeleteStatement());
+ deleter->BindString(0, data.primary_key);
+ if (!deleter->Run())
+ return false;
+
+ // Add the new data to the table.
+ for (const RedirectStatRow& row : data.redirect_stats) {
+ std::unique_ptr<Statement> row_inserter(
+ data.is_host() ? GetHostRedirectStatUpdateStatement()
+ : GetUrlRedirectStatUpdateStatement());
+ BindRedirectStatRowToStatement(row, data.primary_key, row_inserter.get());
+ if (!row_inserter->Run())
+ return false;
+ }
+
+ return true;
+}
+
void ResourcePrefetchPredictorTables::DeleteDataHelper(
PrefetchKeyType key_type,
const std::vector<std::string>& keys) {
@@ -442,6 +530,19 @@ bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit(
}
// static
+bool ResourcePrefetchPredictorTables::StringAreSmallerThanDBLimit(
+ const RedirectData& data) {
+ if (data.primary_key.length() > kMaxStringLength)
+ return false;
+
+ for (const RedirectStatRow& row : data.redirect_stats) {
+ if (row.final_redirect.length() > kMaxStringLength)
+ return false;
+ }
+ return true;
+}
+
+// static
bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
sql::Connection* db) {
int version = GetDatabaseVersion(db);

Powered by Google App Engine
This is Rietveld 408576698