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

Unified Diff: content/browser/leveldb_wrapper_impl.cc

Issue 2595183002: Don't duplicate values in LevelDBWrapperImpl::CommitBatch. (Closed)
Patch Set: Created 4 years 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 | « content/browser/leveldb_wrapper_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/leveldb_wrapper_impl.cc
diff --git a/content/browser/leveldb_wrapper_impl.cc b/content/browser/leveldb_wrapper_impl.cc
index b7cb71358edf77fa4c743f6ba965c6d4369cc624..c9c9f598eb8e87858bce4d06f721f1d2135434ba 100644
--- a/content/browser/leveldb_wrapper_impl.cc
+++ b/content/browser/leveldb_wrapper_impl.cc
@@ -34,19 +34,6 @@ base::TimeDelta LevelDBWrapperImpl::RateLimiter::ComputeDelayNeeded(
LevelDBWrapperImpl::CommitBatch::CommitBatch() : clear_all_first(false) {}
LevelDBWrapperImpl::CommitBatch::~CommitBatch() {}
-size_t LevelDBWrapperImpl::CommitBatch::GetDataSize() const {
- if (changed_values.empty())
- return 0;
-
- size_t count = 0;
- for (const auto& pair : changed_values) {
- count += pair.first.size();
- if (pair.second)
- count += pair.second->size();
- }
- return count;
-}
-
LevelDBWrapperImpl::LevelDBWrapperImpl(
leveldb::mojom::LevelDBDatabase* database,
const std::string& prefix,
@@ -122,7 +109,7 @@ void LevelDBWrapperImpl::Put(const std::vector<uint8_t>& key,
if (database_) {
CreateCommitBatchIfNeeded();
- commit_batch_->changed_values[key] = value;
+ commit_batch_->changed_keys.insert(key);
}
std::vector<uint8_t> old_value;
@@ -164,7 +151,7 @@ void LevelDBWrapperImpl::Delete(const std::vector<uint8_t>& key,
if (database_) {
CreateCommitBatchIfNeeded();
- commit_batch_->changed_values[key] = base::nullopt;
+ commit_batch_->changed_keys.insert(std::move(found->first));
}
std::vector<uint8_t> old_value(std::move(found->second));
@@ -189,7 +176,7 @@ void LevelDBWrapperImpl::DeleteAll(const std::string& source,
if (database_ && !map_->empty()) {
CreateCommitBatchIfNeeded();
commit_batch_->clear_all_first = true;
- commit_batch_->changed_values.clear();
+ commit_batch_->changed_keys.clear();
}
map_->clear();
bytes_used_ = 0;
@@ -324,11 +311,11 @@ base::TimeDelta LevelDBWrapperImpl::ComputeCommitDelay() const {
void LevelDBWrapperImpl::CommitChanges() {
DCHECK(database_);
+ DCHECK(map_);
if (!commit_batch_)
return;
commit_rate_limiter_.add_samples(1);
- data_rate_limiter_.add_samples(commit_batch_->GetDataSize());
// Commit all our changes in a single batch.
std::vector<leveldb::mojom::BatchedOperationPtr> operations;
@@ -339,22 +326,28 @@ void LevelDBWrapperImpl::CommitChanges() {
item->key = prefix_;
operations.push_back(std::move(item));
}
- for (auto& it : commit_batch_->changed_values) {
+ size_t data_size = 0;
+ for (const auto& key: commit_batch_->changed_keys) {
+ data_size += key.size();
leveldb::mojom::BatchedOperationPtr item =
leveldb::mojom::BatchedOperation::New();
- item->key.reserve(prefix_.size() + it.first.size());
+ item->key.reserve(prefix_.size() + key.size());
item->key.insert(item->key.end(), prefix_.begin(), prefix_.end());
- item->key.insert(item->key.end(), it.first.begin(), it.first.end());
- if (!it.second) {
+ item->key.insert(item->key.end(), key.begin(), key.end());
+ auto it = map_->find(key);
+ if (it == map_->end()) {
item->type = leveldb::mojom::BatchOperationType::DELETE_KEY;
} else {
item->type = leveldb::mojom::BatchOperationType::PUT_KEY;
- item->value = std::move(*(it.second));
+ item->value = it->second;
+ data_size += it->second.size();
}
operations.push_back(std::move(item));
}
commit_batch_.reset();
+ data_rate_limiter_.add_samples(data_size);
+
++commit_batches_in_flight_;
// TODO(michaeln): Currently there is no guarantee LevelDBDatabaseImp::Write
« no previous file with comments | « content/browser/leveldb_wrapper_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698