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

Side by Side Diff: chrome/browser/net/sqlite_server_bound_cert_store.cc

Issue 11742037: Make ServerBoundCertStore interface async, move SQLiteServerBoundCertStore load onto DB thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/net/sqlite_server_bound_cert_store.h" 5 #include "chrome/browser/net/sqlite_server_bound_cert_store.h"
6 6
7 #include <list> 7 #include <list>
8 #include <set> 8 #include <set>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 23 matching lines...) Expand all
34 : public base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend> { 34 : public base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend> {
35 public: 35 public:
36 Backend(const FilePath& path, ClearOnExitPolicy* clear_on_exit_policy) 36 Backend(const FilePath& path, ClearOnExitPolicy* clear_on_exit_policy)
37 : path_(path), 37 : path_(path),
38 db_(NULL), 38 db_(NULL),
39 num_pending_(0), 39 num_pending_(0),
40 force_keep_session_state_(false), 40 force_keep_session_state_(false),
41 clear_on_exit_policy_(clear_on_exit_policy) { 41 clear_on_exit_policy_(clear_on_exit_policy) {
42 } 42 }
43 43
44 // Creates or load the SQLite database. 44 // Creates or loads the SQLite database.
45 bool Load( 45 void Load(const LoadedCallback& loaded_callback);
46 std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs);
47 46
48 // Batch a server bound cert addition. 47 // Batch a server bound cert addition.
49 void AddServerBoundCert( 48 void AddServerBoundCert(
50 const net::DefaultServerBoundCertStore::ServerBoundCert& cert); 49 const net::DefaultServerBoundCertStore::ServerBoundCert& cert);
51 50
52 // Batch a server bound cert deletion. 51 // Batch a server bound cert deletion.
53 void DeleteServerBoundCert( 52 void DeleteServerBoundCert(
54 const net::DefaultServerBoundCertStore::ServerBoundCert& cert); 53 const net::DefaultServerBoundCertStore::ServerBoundCert& cert);
55 54
56 // Commit pending operations as soon as possible. 55 // Commit pending operations as soon as possible.
57 void Flush(const base::Closure& completion_task); 56 void Flush(const base::Closure& completion_task);
58 57
59 // Commit any pending operations and close the database. This must be called 58 // Commit any pending operations and close the database. This must be called
60 // before the object is destructed. 59 // before the object is destructed.
61 void Close(); 60 void Close();
62 61
63 void SetForceKeepSessionState(); 62 void SetForceKeepSessionState();
64 63
65 private: 64 private:
65 bool LoadOnDBThread(
66 std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs);
67
66 friend class base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend>; 68 friend class base::RefCountedThreadSafe<SQLiteServerBoundCertStore::Backend>;
67 69
68 // You should call Close() before destructing this object. 70 // You should call Close() before destructing this object.
69 ~Backend() { 71 ~Backend() {
70 DCHECK(!db_.get()) << "Close should have already been called."; 72 DCHECK(!db_.get()) << "Close should have already been called.";
71 DCHECK(num_pending_ == 0 && pending_.empty()); 73 DCHECK(num_pending_ == 0 && pending_.empty());
72 } 74 }
73 75
74 // Database upgrade statements. 76 // Database upgrade statements.
75 bool EnsureDatabaseVersion(); 77 bool EnsureDatabaseVersion();
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 "expiration_time INTEGER," 150 "expiration_time INTEGER,"
149 "creation_time INTEGER)")) 151 "creation_time INTEGER)"))
150 return false; 152 return false;
151 } 153 }
152 154
153 return true; 155 return true;
154 } 156 }
155 157
156 } // namespace 158 } // namespace
157 159
158 bool SQLiteServerBoundCertStore::Backend::Load( 160 void SQLiteServerBoundCertStore::Backend::Load(
159 std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) { 161 const LoadedCallback& loaded_callback) {
160 // This function should be called only once per instance. 162 // This function should be called only once per instance.
161 DCHECK(!db_.get()); 163 DCHECK(!db_.get());
162 164
163 // TODO(paivanof@gmail.com): We do a lot of disk access in this function, 165 scoped_ptr<ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert> >
164 // thus we do an exception to allow IO on the UI thread. This code will be 166 certs(new ScopedVector<net::DefaultServerBoundCertStore::ServerBoundCert>(
165 // moved to the DB thread as part of http://crbug.com/89665. 167 ));
166 base::ThreadRestrictions::ScopedAllowIO allow_io; 168 BrowserThread::PostTaskAndReply(
169 BrowserThread::DB, FROM_HERE,
170 base::Bind(base::IgnoreResult(&Backend::LoadOnDBThread), this,
171 &certs->get()),
172 base::Bind(loaded_callback, base::Passed(&certs)));
173 }
174
175 bool SQLiteServerBoundCertStore::Backend::LoadOnDBThread(
erikwright (departed) 2013/01/04 19:20:10 why keep the bool exit code? Also, consider simpl
mattm 2013/01/08 04:53:21 removed.
erikwright (departed) 2013/01/10 22:03:30 I see your point. I don't mind either way.
176 std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
178
179 // This method should be called only once per instance.
180 DCHECK(!db_.get());
167 181
168 base::TimeTicks start = base::TimeTicks::Now(); 182 base::TimeTicks start = base::TimeTicks::Now();
169 183
170 // Ensure the parent directory for storing certs is created before reading 184 // Ensure the parent directory for storing certs is created before reading
171 // from it. 185 // from it.
172 const FilePath dir = path_.DirName(); 186 const FilePath dir = path_.DirName();
173 if (!file_util::PathExists(dir) && !file_util::CreateDirectory(dir)) 187 if (!file_util::PathExists(dir) && !file_util::CreateDirectory(dir))
174 return false; 188 return false;
175 189
176 int64 db_size = 0; 190 int64 db_size = 0;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 static_cast<net::SSLClientCertType>(smt.ColumnInt(3)), 225 static_cast<net::SSLClientCertType>(smt.ColumnInt(3)),
212 base::Time::FromInternalValue(smt.ColumnInt64(5)), 226 base::Time::FromInternalValue(smt.ColumnInt64(5)),
213 base::Time::FromInternalValue(smt.ColumnInt64(4)), 227 base::Time::FromInternalValue(smt.ColumnInt64(4)),
214 private_key_from_db, 228 private_key_from_db,
215 cert_from_db)); 229 cert_from_db));
216 cert_origins_.insert(cert->server_identifier()); 230 cert_origins_.insert(cert->server_identifier());
217 certs->push_back(cert.release()); 231 certs->push_back(cert.release());
218 } 232 }
219 233
220 UMA_HISTOGRAM_COUNTS_10000("DomainBoundCerts.DBLoadedCount", certs->size()); 234 UMA_HISTOGRAM_COUNTS_10000("DomainBoundCerts.DBLoadedCount", certs->size());
235 base::TimeDelta load_time = base::TimeTicks::Now() - start;
221 UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.DBLoadTime", 236 UMA_HISTOGRAM_CUSTOM_TIMES("DomainBoundCerts.DBLoadTime",
222 base::TimeTicks::Now() - start, 237 load_time,
223 base::TimeDelta::FromMilliseconds(1), 238 base::TimeDelta::FromMilliseconds(1),
224 base::TimeDelta::FromMinutes(1), 239 base::TimeDelta::FromMinutes(1),
225 50); 240 50);
241 DVLOG(1) << "loaded " << certs->size() << " in " << load_time.InMilliseconds()
242 << " ms";
226 return true; 243 return true;
227 } 244 }
228 245
229 bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() { 246 bool SQLiteServerBoundCertStore::Backend::EnsureDatabaseVersion() {
230 // Version check. 247 // Version check.
231 if (!meta_table_.Init( 248 if (!meta_table_.Init(
232 db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) { 249 db_.get(), kCurrentVersionNumber, kCompatibleVersionNumber)) {
233 return false; 250 return false;
234 } 251 }
235 252
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 base::AutoLock locked(lock_); 554 base::AutoLock locked(lock_);
538 force_keep_session_state_ = true; 555 force_keep_session_state_ = true;
539 } 556 }
540 557
541 SQLiteServerBoundCertStore::SQLiteServerBoundCertStore( 558 SQLiteServerBoundCertStore::SQLiteServerBoundCertStore(
542 const FilePath& path, 559 const FilePath& path,
543 ClearOnExitPolicy* clear_on_exit_policy) 560 ClearOnExitPolicy* clear_on_exit_policy)
544 : backend_(new Backend(path, clear_on_exit_policy)) { 561 : backend_(new Backend(path, clear_on_exit_policy)) {
545 } 562 }
546 563
547 bool SQLiteServerBoundCertStore::Load( 564 void SQLiteServerBoundCertStore::Load(
548 std::vector<net::DefaultServerBoundCertStore::ServerBoundCert*>* certs) { 565 const LoadedCallback& loaded_callback) {
549 return backend_->Load(certs); 566 backend_->Load(loaded_callback);
550 } 567 }
551 568
552 void SQLiteServerBoundCertStore::AddServerBoundCert( 569 void SQLiteServerBoundCertStore::AddServerBoundCert(
553 const net::DefaultServerBoundCertStore::ServerBoundCert& cert) { 570 const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
554 if (backend_.get()) 571 if (backend_.get())
555 backend_->AddServerBoundCert(cert); 572 backend_->AddServerBoundCert(cert);
556 } 573 }
557 574
558 void SQLiteServerBoundCertStore::DeleteServerBoundCert( 575 void SQLiteServerBoundCertStore::DeleteServerBoundCert(
559 const net::DefaultServerBoundCertStore::ServerBoundCert& cert) { 576 const net::DefaultServerBoundCertStore::ServerBoundCert& cert) {
(...skipping 14 matching lines...) Expand all
574 } 591 }
575 592
576 SQLiteServerBoundCertStore::~SQLiteServerBoundCertStore() { 593 SQLiteServerBoundCertStore::~SQLiteServerBoundCertStore() {
577 if (backend_.get()) { 594 if (backend_.get()) {
578 backend_->Close(); 595 backend_->Close();
579 // Release our reference, it will probably still have a reference if the 596 // Release our reference, it will probably still have a reference if the
580 // background thread has not run Close() yet. 597 // background thread has not run Close() yet.
581 backend_ = NULL; 598 backend_ = NULL;
582 } 599 }
583 } 600 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698