From 76f6c7c7c402d0f9f814718ed3b516b12c74453f Mon Sep 17 00:00:00 2001 From: maurice barnum Date: Wed, 5 Nov 2014 05:31:11 +0000 Subject: [PATCH] CompactionFilterV2: eliminate an often unnecessary allocation. If a compaction filter implementation is simply filtering values, then allocating the "changed values" bitmap is an extra memory allocation that adds no value. Additionally, the compaction implementation has to do marginally more work to calculate the offset into the bitmap (vector specialization) for each record the filter did not mark for deletion. Explicitly handle the case where compact_->value_changed_buf_ is empty. --- db/compaction_job.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/db/compaction_job.cc b/db/compaction_job.cc index 5db087b3c..5c0d95e12 100644 --- a/db/compaction_job.cc +++ b/db/compaction_job.cc @@ -890,7 +890,8 @@ void CompactionJob::CallCompactionFilterV2( assert(compact_->to_delete_buf_.size() == compact_->key_str_buf_.size()); assert(compact_->to_delete_buf_.size() == compact_->existing_value_str_buf_.size()); - assert(compact_->to_delete_buf_.size() == + assert(compact_->value_changed_buf_.empty() || + compact_->to_delete_buf_.size() == compact_->value_changed_buf_.size()); int new_value_idx = 0; @@ -905,7 +906,8 @@ void CompactionJob::CallCompactionFilterV2( // no value associated with delete compact_->existing_value_str_buf_[i].clear(); RecordTick(stats_, COMPACTION_KEY_DROP_USER); - } else if (compact_->value_changed_buf_[i]) { + } else if (!compact_->value_changed_buf_.empty() && + compact_->value_changed_buf_[i]) { compact_->existing_value_str_buf_[i] = compact_->new_value_buf_[new_value_idx++]; }