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:
parent
74bcb5ed20
commit
21fb8c0733
@ -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");
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user