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

Unified Diff: content/browser/indexed_db/indexed_db_backing_store.cc

Issue 902503003: IndexedDB: Address performance regression with blob journals (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « no previous file | content/test/data/indexeddb/corrupted_open_db_detection.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/indexed_db/indexed_db_backing_store.cc
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index f4b6f8d5a17d6495977450805c41d6d5748cef95..51f52c378bbd2a5ed31158cd37e261788ab217f4 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -4131,10 +4131,11 @@ leveldb::Status IndexedDBBackingStore::Transaction::CommitPhaseTwo() {
DCHECK_GT(backing_store_->committing_transaction_count_, 0UL);
--backing_store_->committing_transaction_count_;
- // Read the persisted states of the primary/live blob journals,
- // so that they can be updated correctly by the transaction.
- BlobJournalType primary_journal, live_journal;
- {
+ BlobJournalType primary_journal, live_journal, saved_primary_journal,
+ dead_blobs;
+ if (!blob_change_map_.empty()) {
+ // Read the persisted states of the primary/live blob journals,
+ // so that they can be updated correctly by the transaction.
scoped_refptr<LevelDBTransaction> journal_transaction =
IndexedDBClassFactory::Get()->CreateLevelDBTransaction(
backing_store_->db_.get());
@@ -4144,30 +4145,29 @@ leveldb::Status IndexedDBBackingStore::Transaction::CommitPhaseTwo() {
s = GetLiveBlobJournal(journal_transaction.get(), &live_journal);
if (!s.ok())
return s;
- }
- // Remove newly added blobs from the journal - they will be accounted
- // for in blob entry tables in the transaction.
- {
+ // Remove newly added blobs from the journal - they will be accounted
+ // for in blob entry tables in the transaction.
std::sort(primary_journal.begin(), primary_journal.end());
std::sort(blobs_to_write_.begin(), blobs_to_write_.end());
BlobJournalType new_journal = base::STLSetDifference<BlobJournalType>(
primary_journal, blobs_to_write_);
primary_journal.swap(new_journal);
- }
- // Append newly deleted blobs to appropriate primary/live journals.
- BlobJournalType saved_primary_journal = primary_journal;
- BlobJournalType dead_blobs, live_blobs;
- if (!blobs_to_remove_.empty()) {
- DCHECK(!backing_store_->is_incognito());
- PartitionBlobsToRemove(&dead_blobs, &live_blobs);
+ // Append newly deleted blobs to appropriate primary/live journals.
+ saved_primary_journal = primary_journal;
+ BlobJournalType live_blobs;
+ if (!blobs_to_remove_.empty()) {
+ DCHECK(!backing_store_->is_incognito());
+ PartitionBlobsToRemove(&dead_blobs, &live_blobs);
+ }
+ primary_journal.insert(primary_journal.end(), dead_blobs.begin(),
+ dead_blobs.end());
+ live_journal.insert(live_journal.end(), live_blobs.begin(),
+ live_blobs.end());
+ UpdatePrimaryBlobJournal(transaction_.get(), primary_journal);
+ UpdateLiveBlobJournal(transaction_.get(), live_journal);
}
- primary_journal.insert(primary_journal.end(), dead_blobs.begin(),
- dead_blobs.end());
- live_journal.insert(live_journal.end(), live_blobs.begin(), live_blobs.end());
- UpdatePrimaryBlobJournal(transaction_.get(), primary_journal);
- UpdateLiveBlobJournal(transaction_.get(), live_journal);
// Actually commit. If this succeeds, the journals will appropriately
// reflect pending blob work - dead files that should be deleted
@@ -4203,6 +4203,8 @@ leveldb::Status IndexedDBBackingStore::Transaction::CommitPhaseTwo() {
if (dead_blobs.empty())
return leveldb::Status::OK();
+ DCHECK(!blob_change_map_.empty());
+
s = backing_store_->CleanUpBlobJournalEntries(dead_blobs);
if (!s.ok()) {
INTERNAL_WRITE_ERROR_UNTESTED(TRANSACTION_COMMIT_METHOD);
« no previous file with comments | « no previous file | content/test/data/indexeddb/corrupted_open_db_detection.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698