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 |