| Index: chrome/browser/net/sqlite_server_bound_cert_store.cc
|
| diff --git a/chrome/browser/net/sqlite_server_bound_cert_store.cc b/chrome/browser/net/sqlite_server_bound_cert_store.cc
|
| index b85e939e7c66890a790421e2cfb5a33c6099b3f1..c4a004c3030cda10598390f93d2d05bf59790540 100644
|
| --- a/chrome/browser/net/sqlite_server_bound_cert_store.cc
|
| +++ b/chrome/browser/net/sqlite_server_bound_cert_store.cc
|
| @@ -41,9 +41,8 @@ class SQLiteServerBoundCertStore::Backend
|
| clear_on_exit_policy_(clear_on_exit_policy) {
|
| }
|
|
|
| - // Creates or load the SQLite database.
|
| - bool Load(
|
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs);
|
| + // Creates or loads the SQLite database.
|
| + void Load(const LoadedCallback& loaded_callback);
|
|
|
| // Batch a server bound cert addition.
|
| void AddServerBoundCert(
|
| @@ -63,6 +62,10 @@ class SQLiteServerBoundCertStore::Backend
|
| void SetForceKeepSessionState();
|
|
|
| private:
|
| + void LoadOnDBThreadAndNotify(const LoadedCallback& loaded_callback);
|
| + void LoadOnDBThread(
|
| + std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs);
|
| +
|
| friend class base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend>;
|
|
|
| // You should call Close() before destructing this object.
|
| @@ -155,15 +158,36 @@ bool InitTable(sql::Connection* db) {
|
|
|
| } // namespace
|
|
|
| -bool SQLiteServerBoundCertStore::Backend::Load(
|
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) {
|
| +void SQLiteServerBoundCertStore::Backend::Load(
|
| + const LoadedCallback& loaded_callback) {
|
| // This function should be called only once per instance.
|
| DCHECK(!db_.get());
|
|
|
| - // TODO(paivanof@gmail.com): We do a lot of disk access in this function,
|
| - // thus we do an exception to allow IO on the UI thread. This code will be
|
| - // moved to the DB thread as part of http://crbug.com/89665.
|
| - base::ThreadRestrictions::ScopedAllowIO allow_io;
|
| + BrowserThread::PostTask(
|
| + BrowserThread::DB, FROM_HERE,
|
| + base::Bind(&Backend::LoadOnDBThreadAndNotify, this, loaded_callback));
|
| +}
|
| +
|
| +void SQLiteServerBoundCertStore::Backend::LoadOnDBThreadAndNotify(
|
| + const LoadedCallback& loaded_callback) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| + scoped_ptr<ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> >
|
| + certs(new ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>(
|
| + ));
|
| +
|
| + LoadOnDBThread(&certs->get());
|
| +
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(loaded_callback, base::Passed(&certs)));
|
| +}
|
| +
|
| +void SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
|
| + std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
|
| +
|
| + // This method should be called only once per instance.
|
| + DCHECK(!db_.get());
|
|
|
| base::TimeTicks start = base::TimeTicks::Now();
|
|
|
| @@ -171,7 +195,7 @@ bool SQLiteServerBoundCertStore::Backend::Load(
|
| // from it.
|
| const FilePath dir = path_.DirName();
|
| if (!file_util::PathExists(dir) && !file_util::CreateDirectory(dir))
|
| - return false;
|
| + return;
|
|
|
| int64 db_size = 0;
|
| if (file_util::GetFileSize(path_, &db_size))
|
| @@ -181,13 +205,13 @@ bool SQLiteServerBoundCertStore::Backend::Load(
|
| if (!db_->Open(path_)) {
|
| NOTREACHED() << "Unable to open cert DB.";
|
| db_.reset();
|
| - return false;
|
| + return;
|
| }
|
|
|
| if (!EnsureDatabaseVersion() || !InitTable(db_.get())) {
|
| NOTREACHED() << "Unable to open cert DB.";
|
| db_.reset();
|
| - return false;
|
| + return;
|
| }
|
|
|
| db_->Preload();
|
| @@ -198,7 +222,7 @@ bool SQLiteServerBoundCertStore::Backend::Load(
|
| "creation_time FROM origin_bound_certs"));
|
| if (!smt.is_valid()) {
|
| db_.reset();
|
| - return false;
|
| + return;
|
| }
|
|
|
| while (smt.Step()) {
|
| @@ -218,12 +242,14 @@ bool SQLiteServerBoundCertStore::Backend::Load(
|
| }
|
|
|
| UMA_HISTOGRAM_COUNTS_10000("DomainBoundCerts.DBLoadedCount", certs->size());
|
| + base::TimeDelta load_time = base::TimeTicks::Now() - start;
|
| UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.DBLoadTime",
|
| - base::TimeTicks::Now() - start,
|
| + load_time,
|
| base::TimeDelta::FromMilliseconds(1),
|
| base::TimeDelta::FromMinutes(1),
|
| 50);
|
| - return true;
|
| + DVLOG(1) << "loaded " << certs->size() << " in " << load_time.InMilliseconds()
|
| + << " ms";
|
| }
|
|
|
| bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
|
| @@ -544,9 +570,9 @@ SQLiteServerBoundCertStore::SQLiteServerBoundCertStore(
|
| : backend_(new Backend(path, clear_on_exit_policy)) {
|
| }
|
|
|
| -bool SQLiteServerBoundCertStore::Load(
|
| - std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) {
|
| - return backend_->Load(certs);
|
| +void SQLiteServerBoundCertStore::Load(
|
| + const LoadedCallback& loaded_callback) {
|
| + backend_->Load(loaded_callback);
|
| }
|
|
|
| void SQLiteServerBoundCertStore::AddServerBoundCert(
|
|
|