From: Andrew Kryczka Date: Sat, 17 Dec 2016 01:31:15 +0000 (-0800) Subject: Reduce compaction iterator status checks X-Git-Tag: rocksdb-4.13.5~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ddabcd8b88b3ceaadd2221f6fdc273f1d8fa30b7;p=rocksdb.git Reduce compaction iterator status checks Summary: seems it's expensive to check status since the underlying merge iterator checks status of all its children. so only do it when it's really necessary to get the status before invoking Next(), i.e., when we're advancing to get the first key in the next file. Closes https://github.com/facebook/rocksdb/pull/1691 Differential Revision: D4343446 Pulled By: siying fbshipit-source-id: 70ab315 --- diff --git a/db/compaction_job.cc b/db/compaction_job.cc index 9cdd6dd9..ee469e5b 100644 --- a/db/compaction_job.cc +++ b/db/compaction_job.cc @@ -849,9 +849,6 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) { } } - Status input_status = input->status(); - c_iter->Next(); - // Close output file if it is big enough // TODO(aekmekji): determine if file should be closed earlier than this // during subcompactions (i.e. if output size, estimated by input size, is @@ -860,6 +857,9 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) { if (sub_compact->compaction->output_level() != 0 && sub_compact->current_output_file_size >= sub_compact->compaction->max_output_file_size()) { + Status input_status = input->status(); + c_iter->Next(); + const Slice* next_key = nullptr; if (c_iter->Valid()) { next_key = &c_iter->key(); @@ -871,6 +871,8 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) { // files. sub_compact->compression_dict = std::move(compression_dict); } + } else { + c_iter->Next(); } }