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

Unified Diff: net/extras/sqlite/sqlite_channel_id_store.cc

Issue 1015233002: Fixes a bug where QuotaPolicyChannelIDStore would ignore some deletes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: DCHECK. Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: net/extras/sqlite/sqlite_channel_id_store.cc
diff --git a/net/extras/sqlite/sqlite_channel_id_store.cc b/net/extras/sqlite/sqlite_channel_id_store.cc
index d7edf9c170dd39710a5a46f45e71b2c6cd6e8fd3..d94708ebdd00a1f135e7dd189adb5cf698ee4b86 100644
--- a/net/extras/sqlite/sqlite_channel_id_store.cc
+++ b/net/extras/sqlite/sqlite_channel_id_store.cc
@@ -127,6 +127,10 @@ class SQLiteChannelIDStore::Backend
// Batch a channel id operation (add or delete).
void BatchOperation(PendingOperation::OperationType op,
const DefaultChannelIDStore::ChannelID& channel_id);
+ // Prunes the list of pending operations to remove any operations for an
+ // identifier in |server_identifiers|.
+ void PrunePendingOperationsForDeletes(
+ const std::list<std::string>& server_identifiers);
// Commit our pending operations to the database.
void Commit();
// Close() executed on the background task runner.
@@ -477,6 +481,28 @@ void SQLiteChannelIDStore::Backend::BatchOperation(
}
}
+void SQLiteChannelIDStore::Backend::PrunePendingOperationsForDeletes(
+ const std::list<std::string>& server_identifiers) {
+ DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
+ base::AutoLock locked(lock_);
rohitrao (ping after 24h) 2015/04/06 18:42:22 I did not see a way to avoid locking around this w
+
+ for (PendingOperationsList::iterator it = pending_.begin();
+ it != pending_.end();) {
+ bool remove =
+ std::find(server_identifiers.begin(), server_identifiers.end(),
+ (*it)->channel_id().server_identifier()) !=
+ server_identifiers.end();
+
+ if (remove) {
+ scoped_ptr<PendingOperation> po(*it);
+ it = pending_.erase(it);
+ --num_pending_;
+ } else {
+ ++it;
+ }
+ }
+}
+
void SQLiteChannelIDStore::Backend::Commit() {
DCHECK(background_task_runner_->RunsTasksOnCurrentThread());
@@ -567,6 +593,9 @@ void SQLiteChannelIDStore::Backend::BackgroundDeleteAllInList(
if (!db_.get())
return;
+ // Force a commit of any pending writes before issuing deletes.
mef 2015/04/06 20:17:44 I think this comment is stale.
rohitrao (ping after 24h) 2015/04/07 14:21:37 Done.
+ PrunePendingOperationsForDeletes(server_identifiers);
+
sql::Statement del_smt(db_->GetCachedStatement(
SQL_FROM_HERE, "DELETE FROM origin_bound_certs WHERE origin=?"));
if (!del_smt.is_valid()) {

Powered by Google App Engine
This is Rietveld 408576698