Fixed compaction-related errors where number of input levels are hard-coded.

Summary:
Fixed compaction-related errors where number of input levels are hard-coded.
It's a bug found in compaction branch.
This diff will be pushed into master.

Test Plan:
export ROCKSDB_TESTS=Compact
make db_test -j32
./db_test
also passed the tests in compaction branch

Reviewers: igor, sdong, ljin

Reviewed By: ljin

Subscribers: leveldb

Differential Revision: https://reviews.facebook.net/D20577
This commit is contained in:
Yueh-Hsuan Chiang 2014-07-24 17:06:00 -07:00
parent f780f35b06
commit 6480717a26
2 changed files with 6 additions and 4 deletions

View File

@ -82,8 +82,8 @@ Compaction::~Compaction() {
} }
void Compaction::GenerateFileLevels() { void Compaction::GenerateFileLevels() {
input_levels_.resize(2); input_levels_.resize(num_input_levels());
for (int which = 0; which < 2; which++) { for (int which = 0; which < num_input_levels(); which++) {
DoGenerateFileLevel(&input_levels_[which], inputs_[which].files, &arena_); DoGenerateFileLevel(&input_levels_[which], inputs_[which].files, &arena_);
} }
} }

View File

@ -2825,10 +2825,12 @@ Iterator* VersionSet::MakeInputIterator(Compaction* c) {
// Level-0 files have to be merged together. For other levels, // Level-0 files have to be merged together. For other levels,
// we will make a concatenating iterator per level. // we will make a concatenating iterator per level.
// TODO(opt): use concatenating iterator for level-0 if there is no overlap // TODO(opt): use concatenating iterator for level-0 if there is no overlap
const int space = (c->level() == 0 ? c->input_levels(0)->num_files + 1 : 2); const int space = (c->level() == 0 ?
c->input_levels(0)->num_files + c->num_input_levels() - 1:
c->num_input_levels());
Iterator** list = new Iterator*[space]; Iterator** list = new Iterator*[space];
int num = 0; int num = 0;
for (int which = 0; which < 2; which++) { for (int which = 0; which < c->num_input_levels(); which++) {
if (c->input_levels(which)->num_files != 0) { if (c->input_levels(which)->num_files != 0) {
if (c->level(which) == 0) { if (c->level(which) == 0) {
const FileLevel* flevel = c->input_levels(which); const FileLevel* flevel = c->input_levels(which);