Commit 6090964f authored by alexilin's avatar alexilin Committed by Commit bot

predictors: Refactor UpdateData() function.

This CL splits UpdateData() function into UpdateResourceData() and
UpdateRedirectData() with less number of arguments.
ResourcePrefetchPredictor uses UpdateData() to update only one of the tables
at the same time so there is no need to pass extra arguments each time.

BUG=631966

Review-Url: https://codereview.chromium.org/2804283002
Cr-Commit-Position: refs/heads/master@{#464323}
parent 245e999d
......@@ -1205,8 +1205,6 @@ void ResourcePrefetchPredictor::OnVisitCountLookup(
UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl",
url_visit_count);
// TODO(alexilin): make only one request to DB thread.
if (config_.is_url_learning_enabled) {
// URL level data - merge only if we already saved the data, or it
// meets the cutoff requirement.
......@@ -1387,16 +1385,10 @@ void ResourcePrefetchPredictor::LearnNavigation(
&ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint,
tables_, key, key_type));
} else {
PrefetchData empty_data;
RedirectData empty_redirect_data;
bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
const PrefetchData& host_data = is_host ? data : empty_data;
const PrefetchData& url_data = is_host ? empty_data : data;
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE,
base::Bind(&ResourcePrefetchPredictorTables::UpdateData, tables_,
url_data, host_data, empty_redirect_data,
empty_redirect_data));
base::Bind(&ResourcePrefetchPredictorTables::UpdateResourceData,
tables_, data, key_type));
}
// Predictor learns about both redirected and non-redirected destinations to
......@@ -1464,18 +1456,10 @@ void ResourcePrefetchPredictor::LearnRedirect(const std::string& key,
&ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint,
tables_, key, key_type));
} else {
RedirectData empty_redirect_data;
PrefetchData empty_data;
bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
const RedirectData& host_redirect_data =
is_host ? data : empty_redirect_data;
const RedirectData& url_redirect_data =
is_host ? empty_redirect_data : data;
BrowserThread::PostTask(
BrowserThread::DB, FROM_HERE,
base::Bind(&ResourcePrefetchPredictorTables::UpdateData, tables_,
empty_data, empty_data, url_redirect_data,
host_redirect_data));
base::Bind(&ResourcePrefetchPredictorTables::UpdateRedirectData,
tables_, data, key_type));
}
}
......
......@@ -165,73 +165,51 @@ void ResourcePrefetchPredictorTables::GetAllData(
GetAllOriginDataHelper(origin_data_map);
}
void ResourcePrefetchPredictorTables::UpdateData(
const PrefetchData& url_data,
const PrefetchData& host_data,
const RedirectData& url_redirect_data,
const RedirectData& host_redirect_data) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData");
void ResourcePrefetchPredictorTables::UpdateResourceData(
const PrefetchData& data,
PrefetchKeyType key_type) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateResourceData");
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
DCHECK(url_data.has_primary_key() || host_data.has_primary_key() ||
url_redirect_data.has_primary_key() ||
host_redirect_data.has_primary_key());
UpdateDataHelper(key_type, PrefetchDataType::RESOURCE, data.primary_key(),
data);
}
DB()->BeginTransaction();
void ResourcePrefetchPredictorTables::UpdateRedirectData(
const RedirectData& data,
PrefetchKeyType key_type) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateRedirectData");
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
bool success =
(!url_data.has_primary_key() ||
UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::RESOURCE,
url_data.primary_key(), url_data)) &&
(!host_data.has_primary_key() ||
UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::RESOURCE,
host_data.primary_key(), host_data)) &&
(!url_redirect_data.has_primary_key() ||
UpdateDataHelper(PREFETCH_KEY_TYPE_URL, PrefetchDataType::REDIRECT,
url_redirect_data.primary_key(), url_redirect_data)) &&
(!host_redirect_data.has_primary_key() ||
UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT,
host_redirect_data.primary_key(), host_redirect_data));
if (!success)
DB()->RollbackTransaction();
else
DB()->CommitTransaction();
UpdateDataHelper(key_type, PrefetchDataType::REDIRECT, data.primary_key(),
data);
}
void ResourcePrefetchPredictorTables::UpdateManifestData(
const std::string& host,
const precache::PrecacheManifest& manifest_data) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateManifestData");
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
DB()->BeginTransaction();
bool success = UpdateDataHelper(
PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data);
if (!success)
DB()->RollbackTransaction();
else
DB()->CommitTransaction();
UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host,
manifest_data);
}
void ResourcePrefetchPredictorTables::UpdateOriginData(
const OriginData& origin_data) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateOriginData");
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
std::string host = origin_data.host();
DB()->BeginTransaction();
bool success = UpdateDataHelper(PREFETCH_KEY_TYPE_HOST,
PrefetchDataType::ORIGIN, host, origin_data);
if (!success)
DB()->RollbackTransaction();
else
DB()->CommitTransaction();
UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::ORIGIN,
origin_data.host(), origin_data);
}
void ResourcePrefetchPredictorTables::DeleteResourceData(
......@@ -385,23 +363,31 @@ void ResourcePrefetchPredictorTables::GetAllOriginDataHelper(
}
}
bool ResourcePrefetchPredictorTables::UpdateDataHelper(
void ResourcePrefetchPredictorTables::UpdateDataHelper(
PrefetchKeyType key_type,
PrefetchDataType data_type,
const std::string& key,
const MessageLite& data) {
DB()->BeginTransaction();
// Delete the older data from the table.
std::unique_ptr<sql::Statement> deleter(
GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE));
deleter->BindString(0, key);
if (!deleter->Run())
return false;
bool success = deleter->Run();
if (success) {
// Add the new data to the table.
std::unique_ptr<sql::Statement> inserter(GetTableUpdateStatement(
key_type, data_type, TableOperationType::INSERT));
BindProtoDataToStatement(key, data, inserter.get());
success = inserter->Run();
}
// Add the new data to the table.
std::unique_ptr<sql::Statement> inserter(
GetTableUpdateStatement(key_type, data_type, TableOperationType::INSERT));
BindProtoDataToStatement(key, data, inserter.get());
return inserter->Run();
if (!success)
DB()->RollbackTransaction();
else
DB()->CommitTransaction();
}
void ResourcePrefetchPredictorTables::DeleteDataHelper(
......
......@@ -51,13 +51,17 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
ManifestDataMap* manifest_map,
OriginDataMap* origin_data_map);
// Updates data for a Url and a host. If any of the arguments has an empty
// primary key, it will be ignored.
// Note that all the keys should be less |kMaxStringLength| in length.
virtual void UpdateData(const PrefetchData& url_data,
const PrefetchData& host_data,
const RedirectData& url_redirect_data,
const RedirectData& host_redirect_data);
// Updates resource data for the input |data|.
// Note that the primary key in |data| should be less than |kMaxStringLength|
// in length.
virtual void UpdateResourceData(const PrefetchData& data,
PrefetchKeyType key_type);
// Updates redirect data for the input |data|.
// Note that the primary key in |data| should be less than |kMaxStringLength|
// in length.
virtual void UpdateRedirectData(const RedirectData& data,
PrefetchKeyType key_type);
// Updates manifest data for the input |host|.
virtual void UpdateManifestData(
......@@ -150,7 +154,7 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
void GetAllManifestDataHelper(ManifestDataMap* manifest_map);
void GetAllOriginDataHelper(OriginDataMap* manifest_map);
bool UpdateDataHelper(PrefetchKeyType key_type,
void UpdateDataHelper(PrefetchKeyType key_type,
PrefetchDataType data_type,
const std::string& key,
const google::protobuf::MessageLite& data);
......
......@@ -291,22 +291,28 @@ void ResourcePrefetchPredictorTablesTest::TestUpdateData() {
google.add_resources(), "http://www.resources.google.com/script.js",
content::RESOURCE_TYPE_SCRIPT, 12, 0, 0, 8.5, net::MEDIUM, true, true);
tables_->UpdateResourceData(google, PREFETCH_KEY_TYPE_URL);
PrefetchData yahoo = CreatePrefetchData("www.yahoo.com", 7);
InitializeResourceData(
yahoo.add_resources(), "http://www.yahoo.com/image.png",
content::RESOURCE_TYPE_IMAGE, 120, 1, 1, 10.0, net::MEDIUM, true, false);
tables_->UpdateResourceData(yahoo, PREFETCH_KEY_TYPE_HOST);
RedirectData facebook = CreateRedirectData("http://fb.com/google", 20);
InitializeRedirectStat(facebook.add_redirect_endpoints(),
"https://facebook.fr/google", 4, 2, 1);
tables_->UpdateRedirectData(facebook, PREFETCH_KEY_TYPE_URL);
RedirectData microsoft = CreateRedirectData("microsoft.com", 21);
InitializeRedirectStat(microsoft.add_redirect_endpoints(), "m.microsoft.com",
5, 7, 1);
InitializeRedirectStat(microsoft.add_redirect_endpoints(), "microsoft.org", 7,
2, 0);
tables_->UpdateData(google, yahoo, facebook, microsoft);
tables_->UpdateRedirectData(microsoft, PREFETCH_KEY_TYPE_HOST);
precache::PrecacheManifest theverge;
InitializePrecacheResource(theverge.add_resource(),
......@@ -589,9 +595,6 @@ void ResourcePrefetchPredictorTablesTest::AddKey(OriginDataMap* m,
}
void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
PrefetchData empty_resource_data;
RedirectData empty_redirect_data;
{ // Url data.
PrefetchData google = CreatePrefetchData("http://www.google.com", 1);
InitializeResourceData(google.add_resources(),
......@@ -632,12 +635,9 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
test_url_data_.insert(std::make_pair(reddit.primary_key(), reddit));
test_url_data_.insert(std::make_pair(yahoo.primary_key(), yahoo));
tables_->UpdateData(google, empty_resource_data, empty_redirect_data,
empty_redirect_data);
tables_->UpdateData(reddit, empty_resource_data, empty_redirect_data,
empty_redirect_data);
tables_->UpdateData(yahoo, empty_resource_data, empty_redirect_data,
empty_redirect_data);
tables_->UpdateResourceData(google, PREFETCH_KEY_TYPE_URL);
tables_->UpdateResourceData(reddit, PREFETCH_KEY_TYPE_URL);
tables_->UpdateResourceData(yahoo, PREFETCH_KEY_TYPE_URL);
}
{ // Host data.
......@@ -671,10 +671,8 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
test_host_data_.insert(std::make_pair(facebook.primary_key(), facebook));
test_host_data_.insert(std::make_pair(yahoo.primary_key(), yahoo));
tables_->UpdateData(empty_resource_data, facebook, empty_redirect_data,
empty_redirect_data);
tables_->UpdateData(empty_resource_data, yahoo, empty_redirect_data,
empty_redirect_data);
tables_->UpdateResourceData(facebook, PREFETCH_KEY_TYPE_HOST);
tables_->UpdateResourceData(yahoo, PREFETCH_KEY_TYPE_HOST);
}
{ // Url redirect data.
......@@ -700,12 +698,9 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
test_url_redirect_data_.insert(
std::make_pair(google.primary_key(), google));
tables_->UpdateData(empty_resource_data, empty_resource_data, facebook,
empty_redirect_data);
tables_->UpdateData(empty_resource_data, empty_resource_data, nytimes,
empty_redirect_data);
tables_->UpdateData(empty_resource_data, empty_resource_data, google,
empty_redirect_data);
tables_->UpdateRedirectData(facebook, PREFETCH_KEY_TYPE_URL);
tables_->UpdateRedirectData(nytimes, PREFETCH_KEY_TYPE_URL);
tables_->UpdateRedirectData(google, PREFETCH_KEY_TYPE_URL);
}
{ // Host redirect data.
......@@ -723,10 +718,9 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
test_host_redirect_data_.insert(std::make_pair(bbc.primary_key(), bbc));
test_host_redirect_data_.insert(
std::make_pair(microsoft.primary_key(), microsoft));
tables_->UpdateData(empty_resource_data, empty_resource_data,
empty_redirect_data, bbc);
tables_->UpdateData(empty_resource_data, empty_resource_data,
empty_redirect_data, microsoft);
tables_->UpdateRedirectData(bbc, PREFETCH_KEY_TYPE_HOST);
tables_->UpdateRedirectData(microsoft, PREFETCH_KEY_TYPE_HOST);
}
{ // Manifest data.
......
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