OptionChangeMigration() to support FIFO compaction

Summary: OptionChangeMigration() to support FIFO compaction. If the DB before migration is using FIFO compaction, nothing should be done. If the desitnation option is FIFO options, compact to one single L0 file if the source has more than one levels.

Test Plan: Run option_change_migration_test

Reviewers: andrewkr, IslamAbdelRahman

Reviewed By: IslamAbdelRahman

Subscribers: leveldb, andrewkr, dhruba

Differential Revision: https://reviews.facebook.net/D65289
This commit is contained in:
sdong 2016-10-24 13:16:54 -07:00
parent 74bcb5ed20
commit 21fb8c0733
2 changed files with 43 additions and 34 deletions

View File

@ -72,7 +72,8 @@ Status CompactToLevel(const Options& options, const std::string& dbname,
Status MigrateToUniversal(std::string dbname, const Options& old_opts, Status MigrateToUniversal(std::string dbname, const Options& old_opts,
const Options& new_opts) { const Options& new_opts) {
if (old_opts.num_levels <= new_opts.num_levels) { if (old_opts.num_levels <= new_opts.num_levels ||
old_opts.compaction_style == CompactionStyle::kCompactionStyleFIFO) {
return Status::OK(); return Status::OK();
} else { } else {
bool need_compact = false; bool need_compact = false;
@ -132,11 +133,18 @@ Status MigrateToLevelBase(std::string dbname, const Options& old_opts,
Status OptionChangeMigration(std::string dbname, const Options& old_opts, Status OptionChangeMigration(std::string dbname, const Options& old_opts,
const Options& new_opts) { const Options& new_opts) {
if (new_opts.compaction_style == CompactionStyle::kCompactionStyleUniversal) { if (old_opts.compaction_style == CompactionStyle::kCompactionStyleFIFO) {
// LSM generated by FIFO compation can be opened by any compaction.
return Status::OK();
} else if (new_opts.compaction_style ==
CompactionStyle::kCompactionStyleUniversal) {
return MigrateToUniversal(dbname, old_opts, new_opts); return MigrateToUniversal(dbname, old_opts, new_opts);
} else if (new_opts.compaction_style == } else if (new_opts.compaction_style ==
CompactionStyle::kCompactionStyleLevel) { CompactionStyle::kCompactionStyleLevel) {
return MigrateToLevelBase(dbname, old_opts, new_opts); return MigrateToLevelBase(dbname, old_opts, new_opts);
} else if (new_opts.compaction_style ==
CompactionStyle::kCompactionStyleFIFO) {
return CompactToLevel(old_opts, dbname, 0, true);
} else { } else {
return Status::NotSupported( return Status::NotSupported(
"Do not how to migrate to this compaction style"); "Do not how to migrate to this compaction style");

View File

@ -16,16 +16,16 @@ namespace rocksdb {
class DBOptionChangeMigrationTest class DBOptionChangeMigrationTest
: public DBTestBase, : public DBTestBase,
public testing::WithParamInterface< public testing::WithParamInterface<
std::tuple<int, bool, bool, int, bool, bool>> { std::tuple<int, int, bool, int, int, bool>> {
public: public:
DBOptionChangeMigrationTest() DBOptionChangeMigrationTest()
: DBTestBase("/db_option_change_migration_test") { : DBTestBase("/db_option_change_migration_test") {
level1_ = std::get<0>(GetParam()); level1_ = std::get<0>(GetParam());
is_universal1_ = std::get<1>(GetParam()); compaction_style1_ = std::get<1>(GetParam());
is_dynamic1_ = std::get<2>(GetParam()); is_dynamic1_ = std::get<2>(GetParam());
level2_ = std::get<3>(GetParam()); level2_ = std::get<3>(GetParam());
is_universal2_ = std::get<4>(GetParam()); compaction_style2_ = std::get<4>(GetParam());
is_dynamic2_ = std::get<5>(GetParam()); is_dynamic2_ = std::get<5>(GetParam());
} }
@ -34,23 +34,23 @@ class DBOptionChangeMigrationTest
static void TearDownTestCase() {} static void TearDownTestCase() {}
int level1_; int level1_;
bool is_universal1_; int compaction_style1_;
bool is_dynamic1_; bool is_dynamic1_;
int level2_; int level2_;
bool is_universal2_; int compaction_style2_;
bool is_dynamic2_; bool is_dynamic2_;
}; };
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
TEST_P(DBOptionChangeMigrationTest, Migrate1) { TEST_P(DBOptionChangeMigrationTest, Migrate1) {
Options old_options = CurrentOptions(); Options old_options = CurrentOptions();
if (is_universal1_) { old_options.compaction_style =
old_options.compaction_style = CompactionStyle::kCompactionStyleUniversal; static_cast<CompactionStyle>(compaction_style1_);
} else { if (old_options.compaction_style == CompactionStyle::kCompactionStyleLevel) {
old_options.compaction_style = CompactionStyle::kCompactionStyleLevel;
old_options.level_compaction_dynamic_level_bytes = is_dynamic1_; old_options.level_compaction_dynamic_level_bytes = is_dynamic1_;
} }
old_options.level0_file_num_compaction_trigger = 3; old_options.level0_file_num_compaction_trigger = 3;
old_options.write_buffer_size = 64 * 1024; old_options.write_buffer_size = 64 * 1024;
old_options.target_file_size_base = 128 * 1024; old_options.target_file_size_base = 128 * 1024;
@ -83,10 +83,9 @@ TEST_P(DBOptionChangeMigrationTest, Migrate1) {
Close(); Close();
Options new_options = old_options; Options new_options = old_options;
if (is_universal2_) { new_options.compaction_style =
new_options.compaction_style = CompactionStyle::kCompactionStyleUniversal; static_cast<CompactionStyle>(compaction_style2_);
} else { if (new_options.compaction_style == CompactionStyle::kCompactionStyleLevel) {
new_options.compaction_style = CompactionStyle::kCompactionStyleLevel;
new_options.level_compaction_dynamic_level_bytes = is_dynamic2_; new_options.level_compaction_dynamic_level_bytes = is_dynamic2_;
} }
new_options.target_file_size_base = 256 * 1024; new_options.target_file_size_base = 256 * 1024;
@ -115,10 +114,9 @@ TEST_P(DBOptionChangeMigrationTest, Migrate1) {
TEST_P(DBOptionChangeMigrationTest, Migrate2) { TEST_P(DBOptionChangeMigrationTest, Migrate2) {
Options old_options = CurrentOptions(); Options old_options = CurrentOptions();
if (is_universal2_) { old_options.compaction_style =
old_options.compaction_style = CompactionStyle::kCompactionStyleUniversal; static_cast<CompactionStyle>(compaction_style2_);
} else { if (old_options.compaction_style == CompactionStyle::kCompactionStyleLevel) {
old_options.compaction_style = CompactionStyle::kCompactionStyleLevel;
old_options.level_compaction_dynamic_level_bytes = is_dynamic2_; old_options.level_compaction_dynamic_level_bytes = is_dynamic2_;
} }
old_options.level0_file_num_compaction_trigger = 3; old_options.level0_file_num_compaction_trigger = 3;
@ -154,10 +152,9 @@ TEST_P(DBOptionChangeMigrationTest, Migrate2) {
Close(); Close();
Options new_options = old_options; Options new_options = old_options;
if (is_universal1_) { new_options.compaction_style =
new_options.compaction_style = CompactionStyle::kCompactionStyleUniversal; static_cast<CompactionStyle>(compaction_style1_);
} else { if (new_options.compaction_style == CompactionStyle::kCompactionStyleLevel) {
new_options.compaction_style = CompactionStyle::kCompactionStyleLevel;
new_options.level_compaction_dynamic_level_bytes = is_dynamic1_; new_options.level_compaction_dynamic_level_bytes = is_dynamic1_;
} }
new_options.target_file_size_base = 256 * 1024; new_options.target_file_size_base = 256 * 1024;
@ -185,17 +182,21 @@ TEST_P(DBOptionChangeMigrationTest, Migrate2) {
INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P(
DBOptionChangeMigrationTest, DBOptionChangeMigrationTest, DBOptionChangeMigrationTest, DBOptionChangeMigrationTest,
::testing::Values(std::make_tuple(3, false, false, 4, false, false), ::testing::Values(std::make_tuple(3, 0, false, 4, 0, false),
std::make_tuple(3, false, true, 4, false, true), std::make_tuple(3, 0, true, 4, 0, true),
std::make_tuple(3, false, true, 4, false, false), std::make_tuple(3, 0, true, 4, 0, false),
std::make_tuple(3, false, false, 4, false, true), std::make_tuple(3, 0, false, 4, 0, true),
std::make_tuple(3, true, false, 4, true, false), std::make_tuple(3, 1, false, 4, 1, false),
std::make_tuple(1, true, false, 4, true, false), std::make_tuple(1, 1, false, 4, 1, false),
std::make_tuple(3, false, false, 4, true, false), std::make_tuple(3, 0, false, 4, 1, false),
std::make_tuple(3, false, false, 1, true, false), std::make_tuple(3, 0, false, 1, 1, false),
std::make_tuple(3, false, true, 4, true, false), std::make_tuple(3, 0, true, 4, 1, false),
std::make_tuple(3, false, true, 1, true, false), std::make_tuple(3, 0, true, 1, 1, false),
std::make_tuple(1, true, false, 4, false, false))); std::make_tuple(1, 1, false, 4, 0, false),
std::make_tuple(4, 0, false, 1, 2, false),
std::make_tuple(3, 0, true, 2, 2, false),
std::make_tuple(3, 1, false, 3, 2, false),
std::make_tuple(1, 1, false, 4, 2, false)));
#endif // ROCKSDB_LITE #endif // ROCKSDB_LITE
} // namespace rocksdb } // namespace rocksdb