OLD | NEW |
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 "net/extras/sqlite/sqlite_channel_id_store.h" | 5 #include "net/extras/sqlite/sqlite_channel_id_store.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 | 93 |
94 // Post background delete of all channel ids for |server_identifiers|. | 94 // Post background delete of all channel ids for |server_identifiers|. |
95 void DeleteAllInList(const std::list<std::string>& server_identifiers); | 95 void DeleteAllInList(const std::list<std::string>& server_identifiers); |
96 | 96 |
97 // Commit any pending operations and close the database. This must be called | 97 // Commit any pending operations and close the database. This must be called |
98 // before the object is destructed. | 98 // before the object is destructed. |
99 void Close(); | 99 void Close(); |
100 | 100 |
101 void SetForceKeepSessionState(); | 101 void SetForceKeepSessionState(); |
102 | 102 |
| 103 // Commit our pending operations to the database. |
| 104 void Commit(); |
| 105 |
103 private: | 106 private: |
104 friend class base::RefCountedThreadSafe<SQLiteChannelIDStore::Backend>; | 107 friend class base::RefCountedThreadSafe<SQLiteChannelIDStore::Backend>; |
105 | 108 |
106 // You should call Close() before destructing this object. | 109 // You should call Close() before destructing this object. |
107 virtual ~Backend() { | 110 virtual ~Backend() { |
108 DCHECK(!db_.get()) << "Close should have already been called."; | 111 DCHECK(!db_.get()) << "Close should have already been called."; |
109 DCHECK_EQ(0u, num_pending_); | 112 DCHECK_EQ(0u, num_pending_); |
110 DCHECK(pending_.empty()); | 113 DCHECK(pending_.empty()); |
111 } | 114 } |
112 | 115 |
(...skipping 23 matching lines...) Expand all Loading... |
136 }; | 139 }; |
137 | 140 |
138 private: | 141 private: |
139 // Batch a channel id operation (add or delete). | 142 // Batch a channel id operation (add or delete). |
140 void BatchOperation(PendingOperation::OperationType op, | 143 void BatchOperation(PendingOperation::OperationType op, |
141 const DefaultChannelIDStore::ChannelID& channel_id); | 144 const DefaultChannelIDStore::ChannelID& channel_id); |
142 // Prunes the list of pending operations to remove any operations for an | 145 // Prunes the list of pending operations to remove any operations for an |
143 // identifier in |server_identifiers|. | 146 // identifier in |server_identifiers|. |
144 void PrunePendingOperationsForDeletes( | 147 void PrunePendingOperationsForDeletes( |
145 const std::list<std::string>& server_identifiers); | 148 const std::list<std::string>& server_identifiers); |
146 // Commit our pending operations to the database. | |
147 void Commit(); | |
148 // Close() executed on the background task runner. | 149 // Close() executed on the background task runner. |
149 void InternalBackgroundClose(); | 150 void InternalBackgroundClose(); |
150 | 151 |
151 void BackgroundDeleteAllInList( | 152 void BackgroundDeleteAllInList( |
152 const std::list<std::string>& server_identifiers); | 153 const std::list<std::string>& server_identifiers); |
153 | 154 |
154 void DatabaseErrorCallback(int error, sql::Statement* stmt); | 155 void DatabaseErrorCallback(int error, sql::Statement* stmt); |
155 void KillDatabase(); | 156 void KillDatabase(); |
156 | 157 |
157 const base::FilePath path_; | 158 const base::FilePath path_; |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 // Perform deletion on background task runner. | 475 // Perform deletion on background task runner. |
475 background_task_runner_->PostTask( | 476 background_task_runner_->PostTask( |
476 FROM_HERE, | 477 FROM_HERE, |
477 base::Bind( | 478 base::Bind( |
478 &Backend::BackgroundDeleteAllInList, this, server_identifiers)); | 479 &Backend::BackgroundDeleteAllInList, this, server_identifiers)); |
479 } | 480 } |
480 | 481 |
481 void SQLiteChannelIDStore::Backend::BatchOperation( | 482 void SQLiteChannelIDStore::Backend::BatchOperation( |
482 PendingOperation::OperationType op, | 483 PendingOperation::OperationType op, |
483 const DefaultChannelIDStore::ChannelID& channel_id) { | 484 const DefaultChannelIDStore::ChannelID& channel_id) { |
484 // These thresholds used to be 30 seconds or 512 outstanding operations (the | 485 // Commit every 30 seconds. |
485 // same values used in CookieMonster). Since cookies can be bound to Channel | 486 static const int kCommitIntervalMs = 30 * 1000; |
486 // IDs, it's possible for a cookie to get committed to the cookie database | 487 // Commit right away if we have more than 512 outstanding operations. |
487 // before the Channel ID it is bound to gets committed. Decreasing these | 488 static const size_t kCommitAfterBatchSize = 512; |
488 // thresholds increases the chance that the Channel ID will be committed | |
489 // before or at the same time as the cookie. | |
490 | |
491 // Commit every 2 seconds. | |
492 static const int kCommitIntervalMs = 2 * 1000; | |
493 // Commit right away if we have more than 3 outstanding operations. | |
494 static const size_t kCommitAfterBatchSize = 3; | |
495 | 489 |
496 // We do a full copy of the cert here, and hopefully just here. | 490 // We do a full copy of the cert here, and hopefully just here. |
497 std::unique_ptr<PendingOperation> po(new PendingOperation(op, channel_id)); | 491 std::unique_ptr<PendingOperation> po(new PendingOperation(op, channel_id)); |
498 | 492 |
499 PendingOperationsList::size_type num_pending; | 493 PendingOperationsList::size_type num_pending; |
500 { | 494 { |
501 base::AutoLock locked(lock_); | 495 base::AutoLock locked(lock_); |
502 pending_.push_back(po.release()); | 496 pending_.push_back(po.release()); |
503 num_pending = ++num_pending_; | 497 num_pending = ++num_pending_; |
504 } | 498 } |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
680 | 674 |
681 void SQLiteChannelIDStore::DeleteAllInList( | 675 void SQLiteChannelIDStore::DeleteAllInList( |
682 const std::list<std::string>& server_identifiers) { | 676 const std::list<std::string>& server_identifiers) { |
683 backend_->DeleteAllInList(server_identifiers); | 677 backend_->DeleteAllInList(server_identifiers); |
684 } | 678 } |
685 | 679 |
686 void SQLiteChannelIDStore::SetForceKeepSessionState() { | 680 void SQLiteChannelIDStore::SetForceKeepSessionState() { |
687 backend_->SetForceKeepSessionState(); | 681 backend_->SetForceKeepSessionState(); |
688 } | 682 } |
689 | 683 |
| 684 void SQLiteChannelIDStore::Flush() { |
| 685 backend_->Commit(); |
| 686 } |
| 687 |
690 SQLiteChannelIDStore::~SQLiteChannelIDStore() { | 688 SQLiteChannelIDStore::~SQLiteChannelIDStore() { |
691 backend_->Close(); | 689 backend_->Close(); |
692 // We release our reference to the Backend, though it will probably still have | 690 // We release our reference to the Backend, though it will probably still have |
693 // a reference if the background task runner has not run Close() yet. | 691 // a reference if the background task runner has not run Close() yet. |
694 } | 692 } |
695 | 693 |
696 } // namespace net | 694 } // namespace net |
OLD | NEW |