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

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor_tables.cc

Issue 2738613003: predictors: Add Manifest table to ResourcePrefetchPredictor. (Closed)
Patch Set: Add caution message. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/predictors/resource_prefetch_predictor_tables.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/strings/stringprintf.h" 12 #include "base/strings/stringprintf.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "sql/statement.h" 15 #include "sql/statement.h"
16 16
17 using google::protobuf::MessageLite; 17 using google::protobuf::MessageLite;
18 18
19 namespace { 19 namespace {
20 20
21 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; 21 const char kMetadataTableName[] = "resource_prefetch_predictor_metadata";
22 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 22 const char kUrlResourceTableName[] = "resource_prefetch_predictor_url";
23 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; 23 const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
24 const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 24 const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
25 const char kHostRedirectTableName[] = 25 const char kHostRedirectTableName[] =
26 "resource_prefetch_predictor_host_redirect"; 26 "resource_prefetch_predictor_host_redirect";
27 const char kManifestTableName[] = "resource_prefetch_predictor_manifest";
27 28
28 const char kCreateGlobalMetadataStatementTemplate[] = 29 const char kCreateGlobalMetadataStatementTemplate[] =
29 "CREATE TABLE %s ( " 30 "CREATE TABLE %s ( "
30 "key TEXT, value INTEGER, " 31 "key TEXT, value INTEGER, "
31 "PRIMARY KEY (key))"; 32 "PRIMARY KEY (key))";
32 const char kCreateProtoTableStatementTemplate[] = 33 const char kCreateProtoTableStatementTemplate[] =
33 "CREATE TABLE %s ( " 34 "CREATE TABLE %s ( "
34 "key TEXT, " 35 "key TEXT, "
35 "proto BLOB, " 36 "proto BLOB, "
36 "PRIMARY KEY(key))"; 37 "PRIMARY KEY(key))";
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 return x.consecutive_misses() >= max_consecutive_misses; 106 return x.consecutive_misses() >= max_consecutive_misses;
106 }); 107 });
107 data->mutable_redirect_endpoints()->erase( 108 data->mutable_redirect_endpoints()->erase(
108 new_end, data->mutable_redirect_endpoints()->end()); 109 new_end, data->mutable_redirect_endpoints()->end());
109 } 110 }
110 111
111 void ResourcePrefetchPredictorTables::GetAllData( 112 void ResourcePrefetchPredictorTables::GetAllData(
112 PrefetchDataMap* url_data_map, 113 PrefetchDataMap* url_data_map,
113 PrefetchDataMap* host_data_map, 114 PrefetchDataMap* host_data_map,
114 RedirectDataMap* url_redirect_data_map, 115 RedirectDataMap* url_redirect_data_map,
115 RedirectDataMap* host_redirect_data_map) { 116 RedirectDataMap* host_redirect_data_map,
117 ManifestDataMap* manifest_map) {
116 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData"); 118 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData");
117 DCHECK_CURRENTLY_ON(BrowserThread::DB); 119 DCHECK_CURRENTLY_ON(BrowserThread::DB);
118 if (CantAccessDatabase()) 120 if (CantAccessDatabase())
119 return; 121 return;
120 122
121 DCHECK(url_data_map); 123 DCHECK(url_data_map);
122 DCHECK(host_data_map); 124 DCHECK(host_data_map);
123 DCHECK(url_redirect_data_map); 125 DCHECK(url_redirect_data_map);
124 DCHECK(host_redirect_data_map); 126 DCHECK(host_redirect_data_map);
125 url_data_map->clear(); 127 url_data_map->clear();
126 host_data_map->clear(); 128 host_data_map->clear();
127 url_redirect_data_map->clear(); 129 url_redirect_data_map->clear();
128 host_redirect_data_map->clear(); 130 host_redirect_data_map->clear();
131 manifest_map->clear();
129 132
130 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); 133 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map);
131 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); 134 GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map);
132 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); 135 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
133 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); 136 GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
137 GetAllManifestDataHelper(manifest_map);
134 } 138 }
135 139
136 void ResourcePrefetchPredictorTables::UpdateData( 140 void ResourcePrefetchPredictorTables::UpdateData(
137 const PrefetchData& url_data, 141 const PrefetchData& url_data,
138 const PrefetchData& host_data, 142 const PrefetchData& host_data,
139 const RedirectData& url_redirect_data, 143 const RedirectData& url_redirect_data,
140 const RedirectData& host_redirect_data) { 144 const RedirectData& host_redirect_data) {
141 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData"); 145 TRACE_EVENT0("browser", "ResourcePrefetchPredictor::UpdateData");
142 DCHECK_CURRENTLY_ON(BrowserThread::DB); 146 DCHECK_CURRENTLY_ON(BrowserThread::DB);
143 if (CantAccessDatabase()) 147 if (CantAccessDatabase())
(...skipping 17 matching lines...) Expand all
161 url_redirect_data.primary_key(), url_redirect_data)) && 165 url_redirect_data.primary_key(), url_redirect_data)) &&
162 (!host_redirect_data.has_primary_key() || 166 (!host_redirect_data.has_primary_key() ||
163 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT, 167 UpdateDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::REDIRECT,
164 host_redirect_data.primary_key(), host_redirect_data)); 168 host_redirect_data.primary_key(), host_redirect_data));
165 if (!success) 169 if (!success)
166 DB()->RollbackTransaction(); 170 DB()->RollbackTransaction();
167 else 171 else
168 DB()->CommitTransaction(); 172 DB()->CommitTransaction();
169 } 173 }
170 174
175 void ResourcePrefetchPredictorTables::UpdateManifestData(
176 const std::string& host,
177 const precache::PrecacheManifest& manifest_data) {
178 DCHECK_CURRENTLY_ON(BrowserThread::DB);
179 if (CantAccessDatabase())
180 return;
181
182 DB()->BeginTransaction();
183 bool success = UpdateDataHelper(
184 PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data);
185
186 if (!success)
187 DB()->RollbackTransaction();
188 else
189 DB()->CommitTransaction();
190 }
191
171 void ResourcePrefetchPredictorTables::DeleteResourceData( 192 void ResourcePrefetchPredictorTables::DeleteResourceData(
172 const std::vector<std::string>& urls, 193 const std::vector<std::string>& urls,
173 const std::vector<std::string>& hosts) { 194 const std::vector<std::string>& hosts) {
174 DCHECK_CURRENTLY_ON(BrowserThread::DB); 195 DCHECK_CURRENTLY_ON(BrowserThread::DB);
175 if (CantAccessDatabase()) 196 if (CantAccessDatabase())
176 return; 197 return;
177 198
178 DCHECK(!urls.empty() || !hosts.empty()); 199 DCHECK(!urls.empty() || !hosts.empty());
179 200
180 if (!urls.empty()) 201 if (!urls.empty())
(...skipping 30 matching lines...) Expand all
211 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( 232 void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint(
212 const std::string& key, 233 const std::string& key,
213 PrefetchKeyType key_type) { 234 PrefetchKeyType key_type) {
214 DCHECK_CURRENTLY_ON(BrowserThread::DB); 235 DCHECK_CURRENTLY_ON(BrowserThread::DB);
215 if (CantAccessDatabase()) 236 if (CantAccessDatabase())
216 return; 237 return;
217 238
218 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); 239 DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key});
219 } 240 }
220 241
242 void ResourcePrefetchPredictorTables::DeleteManifestData(
243 const std::vector<std::string>& hosts) {
244 DCHECK_CURRENTLY_ON(BrowserThread::DB);
245 if (CantAccessDatabase())
246 return;
247
248 DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts);
249 }
250
221 void ResourcePrefetchPredictorTables::DeleteAllData() { 251 void ResourcePrefetchPredictorTables::DeleteAllData() {
222 DCHECK_CURRENTLY_ON(BrowserThread::DB); 252 DCHECK_CURRENTLY_ON(BrowserThread::DB);
223 if (CantAccessDatabase()) 253 if (CantAccessDatabase())
224 return; 254 return;
225 255
226 sql::Statement deleter; 256 sql::Statement deleter;
227 for (const char* table_name : 257 for (const char* table_name :
228 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName, 258 {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName,
229 kHostRedirectTableName}) { 259 kHostRedirectTableName, kManifestTableName}) {
230 deleter.Assign(DB()->GetUniqueStatement( 260 deleter.Assign(DB()->GetUniqueStatement(
231 base::StringPrintf("DELETE FROM %s", table_name).c_str())); 261 base::StringPrintf("DELETE FROM %s", table_name).c_str()));
232 deleter.Run(); 262 deleter.Run();
233 } 263 }
234 } 264 }
235 265
236 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {} 266 ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() {}
237 267
238 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {} 268 ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() {}
239 269
(...skipping 27 matching lines...) Expand all
267 base::StringPrintf("SELECT * FROM %s", table_name).c_str())); 297 base::StringPrintf("SELECT * FROM %s", table_name).c_str()));
268 298
269 RedirectData data; 299 RedirectData data;
270 std::string key; 300 std::string key;
271 while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) { 301 while (StepAndInitializeProtoData(&redirect_reader, &key, &data)) {
272 data_map->insert(std::make_pair(key, data)); 302 data_map->insert(std::make_pair(key, data));
273 DCHECK_EQ(data.primary_key(), key); 303 DCHECK_EQ(data.primary_key(), key);
274 } 304 }
275 } 305 }
276 306
307 void ResourcePrefetchPredictorTables::GetAllManifestDataHelper(
308 ManifestDataMap* manifest_map) {
309 sql::Statement manifest_reader(DB()->GetUniqueStatement(
310 base::StringPrintf("SELECT * FROM %s", kManifestTableName).c_str()));
311
312 precache::PrecacheManifest data;
313 std::string key;
314 while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) {
315 manifest_map->insert(std::make_pair(key, data));
316 }
317 }
318
277 bool ResourcePrefetchPredictorTables::UpdateDataHelper( 319 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
278 PrefetchKeyType key_type, 320 PrefetchKeyType key_type,
279 PrefetchDataType data_type, 321 PrefetchDataType data_type,
280 const std::string& key, 322 const std::string& key,
281 const MessageLite& data) { 323 const MessageLite& data) {
282 // Delete the older data from the table. 324 // Delete the older data from the table.
283 std::unique_ptr<sql::Statement> deleter( 325 std::unique_ptr<sql::Statement> deleter(
284 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); 326 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE));
285 deleter->BindString(0, key); 327 deleter->BindString(0, key);
286 if (!deleter->Run()) 328 if (!deleter->Run())
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 402
361 // These are deprecated tables but they still have to be removed if present. 403 // These are deprecated tables but they still have to be removed if present.
362 static const char kUrlMetadataTableName[] = 404 static const char kUrlMetadataTableName[] =
363 "resource_prefetch_predictor_url_metadata"; 405 "resource_prefetch_predictor_url_metadata";
364 static const char kHostMetadataTableName[] = 406 static const char kHostMetadataTableName[] =
365 "resource_prefetch_predictor_host_metadata"; 407 "resource_prefetch_predictor_host_metadata";
366 408
367 if (incompatible_version) { 409 if (incompatible_version) {
368 for (const char* table_name : 410 for (const char* table_name :
369 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, 411 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
370 kUrlRedirectTableName, kHostRedirectTableName, kUrlMetadataTableName, 412 kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName,
371 kHostMetadataTableName}) { 413 kUrlMetadataTableName, kHostMetadataTableName}) {
372 success = 414 success =
373 success && 415 success &&
374 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) 416 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
375 .c_str()); 417 .c_str());
376 } 418 }
377 } 419 }
378 420
379 if (incompatible_version) { 421 if (incompatible_version) {
380 success = 422 success =
381 success && 423 success &&
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 if (CantAccessDatabase()) 460 if (CantAccessDatabase())
419 return; 461 return;
420 462
421 // Database initialization is all-or-nothing. 463 // Database initialization is all-or-nothing.
422 sql::Connection* db = DB(); 464 sql::Connection* db = DB();
423 bool success = db->BeginTransaction(); 465 bool success = db->BeginTransaction();
424 success = success && DropTablesIfOutdated(db); 466 success = success && DropTablesIfOutdated(db);
425 467
426 for (const char* table_name : 468 for (const char* table_name :
427 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName, 469 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName,
428 kHostRedirectTableName}) { 470 kHostRedirectTableName, kManifestTableName}) {
429 success = success && 471 success = success &&
430 (db->DoesTableExist(table_name) || 472 (db->DoesTableExist(table_name) ||
431 db->Execute(base::StringPrintf( 473 db->Execute(base::StringPrintf(
432 kCreateProtoTableStatementTemplate, table_name) 474 kCreateProtoTableStatementTemplate, table_name)
433 .c_str())); 475 .c_str()));
434 } 476 }
435 477
436 if (success) 478 if (success)
437 success = db->CommitTransaction(); 479 success = db->CommitTransaction();
438 else 480 else
(...skipping 22 matching lines...) Expand all
461 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount2", 503 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount2",
462 statement.ColumnInt(0)); 504 statement.ColumnInt(0));
463 } 505 }
464 506
465 std::unique_ptr<sql::Statement> 507 std::unique_ptr<sql::Statement>
466 ResourcePrefetchPredictorTables::GetTableUpdateStatement( 508 ResourcePrefetchPredictorTables::GetTableUpdateStatement(
467 PrefetchKeyType key_type, 509 PrefetchKeyType key_type,
468 PrefetchDataType data_type, 510 PrefetchDataType data_type,
469 TableOperationType op_type) { 511 TableOperationType op_type) {
470 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | 512 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
471 (static_cast<int>(op_type) << 2)); 513 (static_cast<int>(op_type) << 3));
472 const char* statement_template = (op_type == TableOperationType::REMOVE 514 const char* statement_template = (op_type == TableOperationType::REMOVE
473 ? kDeleteProtoTableStatementTemplate 515 ? kDeleteProtoTableStatementTemplate
474 : kInsertProtoTableStatementTemplate); 516 : kInsertProtoTableStatementTemplate);
475 const char* table_name = GetTableName(key_type, data_type); 517 const char* table_name = GetTableName(key_type, data_type);
476 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement( 518 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement(
477 id, base::StringPrintf(statement_template, table_name).c_str())); 519 id, base::StringPrintf(statement_template, table_name).c_str()));
478 } 520 }
479 521
480 // static 522 // static
481 const char* ResourcePrefetchPredictorTables::GetTableName( 523 const char* ResourcePrefetchPredictorTables::GetTableName(
482 PrefetchKeyType key_type, 524 PrefetchKeyType key_type,
483 PrefetchDataType data_type) { 525 PrefetchDataType data_type) {
484 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 526 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
485 switch (data_type) { 527 switch (data_type) {
486 case PrefetchDataType::RESOURCE: 528 case PrefetchDataType::RESOURCE:
487 return is_host ? kHostResourceTableName : kUrlResourceTableName; 529 return is_host ? kHostResourceTableName : kUrlResourceTableName;
488 case PrefetchDataType::REDIRECT: 530 case PrefetchDataType::REDIRECT:
489 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; 531 return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
532 case PrefetchDataType::MANIFEST:
533 return kManifestTableName;
490 } 534 }
491 535
492 NOTREACHED(); 536 NOTREACHED();
493 return nullptr; 537 return nullptr;
494 } 538 }
495 539
496 } // namespace predictors 540 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698