Chromium Code Reviews| Index: content/browser/indexed_db/leveldb/leveldb_database.cc | 
| diff --git a/content/browser/indexed_db/leveldb/leveldb_database.cc b/content/browser/indexed_db/leveldb/leveldb_database.cc | 
| index 7eaa89405cb23782b5c070ca97947a64edb9f3ef..c521d33bb374ce2a317ebccc08b88a16d678ae0f 100644 | 
| --- a/content/browser/indexed_db/leveldb/leveldb_database.cc | 
| +++ b/content/browser/indexed_db/leveldb/leveldb_database.cc | 
| @@ -41,6 +41,7 @@ | 
| using base::StringPiece; | 
| namespace content { | 
| +static const size_t kMaxOpenIteratorsPerDatabase = 50; | 
| 
 
jsbell
2017/03/21 00:15:48
We should get UMA stats on this. It may be that we
 
dmurph
2017/03/21 20:13:25
Hm... so I'll keep track of the max, and then repo
 
 | 
| // Forcing flushes to disk at the end of a transaction guarantees that the | 
| // data hit disk, but drastically impacts throughput when the filesystem is | 
| @@ -92,7 +93,8 @@ LevelDBSnapshot::LevelDBSnapshot(LevelDBDatabase* db) | 
| LevelDBSnapshot::~LevelDBSnapshot() { db_->ReleaseSnapshot(snapshot_); } | 
| -LevelDBDatabase::LevelDBDatabase() {} | 
| +LevelDBDatabase::LevelDBDatabase() | 
| + : iterator_lru_(kMaxOpenIteratorsPerDatabase) {} | 
| LevelDBDatabase::~LevelDBDatabase() { | 
| base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 
| @@ -479,4 +481,22 @@ bool LevelDBDatabase::OnMemoryDump( | 
| return true; | 
| } | 
| +void LevelDBDatabase::NotifyIteratorUsed(LevelDBIterator* iter) { | 
| + if (iterator_lru_.size() == iterator_lru_.max_size()) { | 
| + auto to_evict_iter = iterator_lru_.rbegin(); | 
| + LevelDBIterator* to_evict = to_evict_iter->first; | 
| + to_evict->EvictWorkingMemory(); | 
| + iterator_lru_.Erase(to_evict_iter); | 
| + } | 
| + iterator_lru_.Put(iter, iter); | 
| +} | 
| + | 
| +void LevelDBDatabase::NotifyIteratorDestroyed(LevelDBIterator* iter) { | 
| + auto it = iterator_lru_.Get(iter); | 
| + if (it == iterator_lru_.end()) { | 
| 
 
jsbell
2017/03/21 00:15:48
nit: no need for {}
 
dmurph
2017/03/21 20:13:25
Done.
 
 | 
| + return; | 
| + } | 
| + iterator_lru_.Erase(it); | 
| + LOG(ERROR) << "iterator erased"; | 
| 
 
jsbell
2017/03/21 00:15:48
nit: obviously remove before landing. :)
 
dmurph
2017/03/21 20:13:25
Done.
 
 | 
| +} | 
| } // namespace content |