Skip to content

Commit 394f2bb

Browse files
mrambacherfacebook-github-bot
authored andcommitted
Add OptionTypeInfo::Enum and related methods (facebook#6423)
Summary: Add methods and constructors for handling enums to the OptionTypeInfo. This change allows enums to be converted/compared without adding a special "type" to the OptionType. This change addresses a couple of issues: - It allows new enumerated types to be added to the options without editing the OptionType base class (and related methods) - It standardizes the procedure for adding enumerated types to the options, reducing potential mistakes - It moves the enum maps to the location where they are used, allowing them to be static file members rather than global values - It reduces the number of types and cases that need to be handled in the various OptionType methods Pull Request resolved: facebook#6423 Reviewed By: siying Differential Revision: D21408713 Pulled By: zhichao-cao fbshipit-source-id: fc492af285d011822578b95d186a0fce25d35626
1 parent a96461d commit 394f2bb

File tree

7 files changed

+257
-198
lines changed

7 files changed

+257
-198
lines changed

db/db_wal_test.cc

+5-2
Original file line numberDiff line numberDiff line change
@@ -1422,8 +1422,11 @@ TEST_F(DBWALTest, RecoverFromCorruptedWALWithoutFlush) {
14221422
delete iter;
14231423
return data;
14241424
};
1425-
for (auto& mode : wal_recovery_mode_string_map) {
1426-
options.wal_recovery_mode = mode.second;
1425+
for (auto& mode : {WALRecoveryMode::kTolerateCorruptedTailRecords,
1426+
WALRecoveryMode::kAbsoluteConsistency,
1427+
WALRecoveryMode::kPointInTimeRecovery,
1428+
WALRecoveryMode::kSkipAnyCorruptedRecords}) {
1429+
options.wal_recovery_mode = mode;
14271430
for (auto trunc : {true, false}) {
14281431
for (int i = 0; i < 4; i++) {
14291432
for (int j = jstart; j < jend; j++) {

options/db_options.cc

+32-10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,29 @@
2020

2121
namespace ROCKSDB_NAMESPACE {
2222
#ifndef ROCKSDB_LITE
23+
static std::unordered_map<std::string, WALRecoveryMode>
24+
wal_recovery_mode_string_map = {
25+
{"kTolerateCorruptedTailRecords",
26+
WALRecoveryMode::kTolerateCorruptedTailRecords},
27+
{"kAbsoluteConsistency", WALRecoveryMode::kAbsoluteConsistency},
28+
{"kPointInTimeRecovery", WALRecoveryMode::kPointInTimeRecovery},
29+
{"kSkipAnyCorruptedRecords",
30+
WALRecoveryMode::kSkipAnyCorruptedRecords}};
31+
32+
static std::unordered_map<std::string, DBOptions::AccessHint>
33+
access_hint_string_map = {{"NONE", DBOptions::AccessHint::NONE},
34+
{"NORMAL", DBOptions::AccessHint::NORMAL},
35+
{"SEQUENTIAL", DBOptions::AccessHint::SEQUENTIAL},
36+
{"WILLNEED", DBOptions::AccessHint::WILLNEED}};
37+
38+
static std::unordered_map<std::string, InfoLogLevel> info_log_level_string_map =
39+
{{"DEBUG_LEVEL", InfoLogLevel::DEBUG_LEVEL},
40+
{"INFO_LEVEL", InfoLogLevel::INFO_LEVEL},
41+
{"WARN_LEVEL", InfoLogLevel::WARN_LEVEL},
42+
{"ERROR_LEVEL", InfoLogLevel::ERROR_LEVEL},
43+
{"FATAL_LEVEL", InfoLogLevel::FATAL_LEVEL},
44+
{"HEADER_LEVEL", InfoLogLevel::HEADER_LEVEL}};
45+
2346
std::unordered_map<std::string, OptionTypeInfo>
2447
OptionsHelper::db_options_type_info = {
2548
/*
@@ -247,10 +270,9 @@ std::unordered_map<std::string, OptionTypeInfo>
247270
{offsetof(struct DBOptions, allow_concurrent_memtable_write),
248271
OptionType::kBoolean, OptionVerificationType::kNormal,
249272
OptionTypeFlags::kNone, 0}},
250-
{"wal_recovery_mode",
251-
{offsetof(struct DBOptions, wal_recovery_mode),
252-
OptionType::kWALRecoveryMode, OptionVerificationType::kNormal,
253-
OptionTypeFlags::kNone, 0}},
273+
{"wal_recovery_mode", OptionTypeInfo::Enum<WALRecoveryMode>(
274+
offsetof(struct DBOptions, wal_recovery_mode),
275+
&wal_recovery_mode_string_map)},
254276
{"enable_write_thread_adaptive_yield",
255277
{offsetof(struct DBOptions, enable_write_thread_adaptive_yield),
256278
OptionType::kBoolean, OptionVerificationType::kNormal,
@@ -268,12 +290,12 @@ std::unordered_map<std::string, OptionTypeInfo>
268290
OptionType::kUInt64T, OptionVerificationType::kNormal,
269291
OptionTypeFlags::kNone, 0}},
270292
{"access_hint_on_compaction_start",
271-
{offsetof(struct DBOptions, access_hint_on_compaction_start),
272-
OptionType::kAccessHint, OptionVerificationType::kNormal,
273-
OptionTypeFlags::kNone, 0}},
274-
{"info_log_level",
275-
{offsetof(struct DBOptions, info_log_level), OptionType::kInfoLogLevel,
276-
OptionVerificationType::kNormal, OptionTypeFlags::kNone, 0}},
293+
OptionTypeInfo::Enum<DBOptions::AccessHint>(
294+
offsetof(struct DBOptions, access_hint_on_compaction_start),
295+
&access_hint_string_map)},
296+
{"info_log_level", OptionTypeInfo::Enum<InfoLogLevel>(
297+
offsetof(struct DBOptions, info_log_level),
298+
&info_log_level_string_map)},
277299
{"dump_malloc_stats",
278300
{offsetof(struct DBOptions, dump_malloc_stats), OptionType::kBoolean,
279301
OptionVerificationType::kNormal, OptionTypeFlags::kNone, 0}},

options/options_helper.cc

-145
Original file line numberDiff line numberDiff line change
@@ -273,29 +273,6 @@ std::vector<CompressionType> GetSupportedCompressions() {
273273
#ifndef ROCKSDB_LITE
274274

275275
namespace {
276-
template <typename T>
277-
bool ParseEnum(const std::unordered_map<std::string, T>& type_map,
278-
const std::string& type, T* value) {
279-
auto iter = type_map.find(type);
280-
if (iter != type_map.end()) {
281-
*value = iter->second;
282-
return true;
283-
}
284-
return false;
285-
}
286-
287-
template <typename T>
288-
bool SerializeEnum(const std::unordered_map<std::string, T>& type_map,
289-
const T& type, std::string* value) {
290-
for (const auto& pair : type_map) {
291-
if (pair.second == type) {
292-
*value = pair.first;
293-
return true;
294-
}
295-
}
296-
return false;
297-
}
298-
299276
bool SerializeVectorCompressionType(const std::vector<CompressionType>& types,
300277
std::string* value) {
301278
std::stringstream ss;
@@ -535,36 +512,10 @@ bool ParseOptionHelper(char* opt_address, const OptionType& opt_type,
535512
return ParseEnum<ChecksumType>(
536513
checksum_type_string_map, value,
537514
reinterpret_cast<ChecksumType*>(opt_address));
538-
case OptionType::kBlockBasedTableIndexType:
539-
return ParseEnum<BlockBasedTableOptions::IndexType>(
540-
block_base_table_index_type_string_map, value,
541-
reinterpret_cast<BlockBasedTableOptions::IndexType*>(opt_address));
542-
case OptionType::kBlockBasedTableDataBlockIndexType:
543-
return ParseEnum<BlockBasedTableOptions::DataBlockIndexType>(
544-
block_base_table_data_block_index_type_string_map, value,
545-
reinterpret_cast<BlockBasedTableOptions::DataBlockIndexType*>(
546-
opt_address));
547-
case OptionType::kBlockBasedTableIndexShorteningMode:
548-
return ParseEnum<BlockBasedTableOptions::IndexShorteningMode>(
549-
block_base_table_index_shortening_mode_string_map, value,
550-
reinterpret_cast<BlockBasedTableOptions::IndexShorteningMode*>(
551-
opt_address));
552515
case OptionType::kEncodingType:
553516
return ParseEnum<EncodingType>(
554517
encoding_type_string_map, value,
555518
reinterpret_cast<EncodingType*>(opt_address));
556-
case OptionType::kWALRecoveryMode:
557-
return ParseEnum<WALRecoveryMode>(
558-
wal_recovery_mode_string_map, value,
559-
reinterpret_cast<WALRecoveryMode*>(opt_address));
560-
case OptionType::kAccessHint:
561-
return ParseEnum<DBOptions::AccessHint>(
562-
access_hint_string_map, value,
563-
reinterpret_cast<DBOptions::AccessHint*>(opt_address));
564-
case OptionType::kInfoLogLevel:
565-
return ParseEnum<InfoLogLevel>(
566-
info_log_level_string_map, value,
567-
reinterpret_cast<InfoLogLevel*>(opt_address));
568519
case OptionType::kCompactionOptionsFIFO: {
569520
if (!FIFOCompactionOptionsSpecialCase(
570521
value, reinterpret_cast<CompactionOptionsFIFO*>(opt_address))) {
@@ -729,24 +680,6 @@ bool SerializeSingleOptionHelper(const char* opt_address,
729680
return SerializeEnum<ChecksumType>(
730681
checksum_type_string_map,
731682
*reinterpret_cast<const ChecksumType*>(opt_address), value);
732-
case OptionType::kBlockBasedTableIndexType:
733-
return SerializeEnum<BlockBasedTableOptions::IndexType>(
734-
block_base_table_index_type_string_map,
735-
*reinterpret_cast<const BlockBasedTableOptions::IndexType*>(
736-
opt_address),
737-
value);
738-
case OptionType::kBlockBasedTableDataBlockIndexType:
739-
return SerializeEnum<BlockBasedTableOptions::DataBlockIndexType>(
740-
block_base_table_data_block_index_type_string_map,
741-
*reinterpret_cast<const BlockBasedTableOptions::DataBlockIndexType*>(
742-
opt_address),
743-
value);
744-
case OptionType::kBlockBasedTableIndexShorteningMode:
745-
return SerializeEnum<BlockBasedTableOptions::IndexShorteningMode>(
746-
block_base_table_index_shortening_mode_string_map,
747-
*reinterpret_cast<const BlockBasedTableOptions::IndexShorteningMode*>(
748-
opt_address),
749-
value);
750683
case OptionType::kFlushBlockPolicyFactory: {
751684
const auto* ptr =
752685
reinterpret_cast<const std::shared_ptr<FlushBlockPolicyFactory>*>(
@@ -758,18 +691,6 @@ bool SerializeSingleOptionHelper(const char* opt_address,
758691
return SerializeEnum<EncodingType>(
759692
encoding_type_string_map,
760693
*reinterpret_cast<const EncodingType*>(opt_address), value);
761-
case OptionType::kWALRecoveryMode:
762-
return SerializeEnum<WALRecoveryMode>(
763-
wal_recovery_mode_string_map,
764-
*reinterpret_cast<const WALRecoveryMode*>(opt_address), value);
765-
case OptionType::kAccessHint:
766-
return SerializeEnum<DBOptions::AccessHint>(
767-
access_hint_string_map,
768-
*reinterpret_cast<const DBOptions::AccessHint*>(opt_address), value);
769-
case OptionType::kInfoLogLevel:
770-
return SerializeEnum<InfoLogLevel>(
771-
info_log_level_string_map,
772-
*reinterpret_cast<const InfoLogLevel*>(opt_address), value);
773694
case OptionType::kCompactionOptionsFIFO:
774695
return SerializeStruct(opt_address, value,
775696
fifo_compaction_options_type_info);
@@ -1231,32 +1152,6 @@ Status GetTableFactoryFromMap(
12311152
return Status::OK();
12321153
}
12331154

1234-
std::unordered_map<std::string, BlockBasedTableOptions::IndexType>
1235-
OptionsHelper::block_base_table_index_type_string_map = {
1236-
{"kBinarySearch", BlockBasedTableOptions::IndexType::kBinarySearch},
1237-
{"kHashSearch", BlockBasedTableOptions::IndexType::kHashSearch},
1238-
{"kTwoLevelIndexSearch",
1239-
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch},
1240-
{"kBinarySearchWithFirstKey",
1241-
BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey}};
1242-
1243-
std::unordered_map<std::string, BlockBasedTableOptions::DataBlockIndexType>
1244-
OptionsHelper::block_base_table_data_block_index_type_string_map = {
1245-
{"kDataBlockBinarySearch",
1246-
BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinarySearch},
1247-
{"kDataBlockBinaryAndHash",
1248-
BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinaryAndHash}};
1249-
1250-
std::unordered_map<std::string, BlockBasedTableOptions::IndexShorteningMode>
1251-
OptionsHelper::block_base_table_index_shortening_mode_string_map = {
1252-
{"kNoShortening",
1253-
BlockBasedTableOptions::IndexShorteningMode::kNoShortening},
1254-
{"kShortenSeparators",
1255-
BlockBasedTableOptions::IndexShorteningMode::kShortenSeparators},
1256-
{"kShortenSeparatorsAndSuccessor",
1257-
BlockBasedTableOptions::IndexShorteningMode::
1258-
kShortenSeparatorsAndSuccessor}};
1259-
12601155
std::unordered_map<std::string, EncodingType>
12611156
OptionsHelper::encoding_type_string_map = {{"kPlain", kPlain},
12621157
{"kPrefix", kPrefix}};
@@ -1275,31 +1170,6 @@ std::unordered_map<std::string, CompactionPri>
12751170
{"kOldestSmallestSeqFirst", kOldestSmallestSeqFirst},
12761171
{"kMinOverlappingRatio", kMinOverlappingRatio}};
12771172

1278-
std::unordered_map<std::string, WALRecoveryMode>
1279-
OptionsHelper::wal_recovery_mode_string_map = {
1280-
{"kTolerateCorruptedTailRecords",
1281-
WALRecoveryMode::kTolerateCorruptedTailRecords},
1282-
{"kAbsoluteConsistency", WALRecoveryMode::kAbsoluteConsistency},
1283-
{"kPointInTimeRecovery", WALRecoveryMode::kPointInTimeRecovery},
1284-
{"kSkipAnyCorruptedRecords",
1285-
WALRecoveryMode::kSkipAnyCorruptedRecords}};
1286-
1287-
std::unordered_map<std::string, DBOptions::AccessHint>
1288-
OptionsHelper::access_hint_string_map = {
1289-
{"NONE", DBOptions::AccessHint::NONE},
1290-
{"NORMAL", DBOptions::AccessHint::NORMAL},
1291-
{"SEQUENTIAL", DBOptions::AccessHint::SEQUENTIAL},
1292-
{"WILLNEED", DBOptions::AccessHint::WILLNEED}};
1293-
1294-
std::unordered_map<std::string, InfoLogLevel>
1295-
OptionsHelper::info_log_level_string_map = {
1296-
{"DEBUG_LEVEL", InfoLogLevel::DEBUG_LEVEL},
1297-
{"INFO_LEVEL", InfoLogLevel::INFO_LEVEL},
1298-
{"WARN_LEVEL", InfoLogLevel::WARN_LEVEL},
1299-
{"ERROR_LEVEL", InfoLogLevel::ERROR_LEVEL},
1300-
{"FATAL_LEVEL", InfoLogLevel::FATAL_LEVEL},
1301-
{"HEADER_LEVEL", InfoLogLevel::HEADER_LEVEL}};
1302-
13031173
LRUCacheOptions OptionsHelper::dummy_lru_cache_options;
13041174
CompactionOptionsUniversal OptionsHelper::dummy_comp_options_universal;
13051175
CompactionOptionsFIFO OptionsHelper::dummy_comp_options;
@@ -1510,21 +1380,6 @@ static bool AreOptionsEqual(OptionType type, const char* this_offset,
15101380
return IsOptionEqual<ChecksumType>(this_offset, that_offset);
15111381
case OptionType::kEncodingType:
15121382
return IsOptionEqual<EncodingType>(this_offset, that_offset);
1513-
case OptionType::kBlockBasedTableIndexType:
1514-
return IsOptionEqual<BlockBasedTableOptions::IndexType>(this_offset,
1515-
that_offset);
1516-
case OptionType::kBlockBasedTableDataBlockIndexType:
1517-
return IsOptionEqual<BlockBasedTableOptions::DataBlockIndexType>(
1518-
this_offset, that_offset);
1519-
case OptionType::kBlockBasedTableIndexShorteningMode:
1520-
return IsOptionEqual<BlockBasedTableOptions::IndexShorteningMode>(
1521-
this_offset, that_offset);
1522-
case OptionType::kWALRecoveryMode:
1523-
return IsOptionEqual<WALRecoveryMode>(this_offset, that_offset);
1524-
case OptionType::kAccessHint:
1525-
return IsOptionEqual<DBOptions::AccessHint>(this_offset, that_offset);
1526-
case OptionType::kInfoLogLevel:
1527-
return IsOptionEqual<InfoLogLevel>(this_offset, that_offset);
15281383
case OptionType::kCompactionOptionsFIFO: {
15291384
CompactionOptionsFIFO lhs =
15301385
*reinterpret_cast<const CompactionOptionsFIFO*>(this_offset);

options/options_helper.h

-25
Original file line numberDiff line numberDiff line change
@@ -107,25 +107,11 @@ struct OptionsHelper {
107107
static std::unordered_map<std::string, OptionTypeInfo> db_options_type_info;
108108
static std::unordered_map<std::string, OptionTypeInfo>
109109
lru_cache_options_type_info;
110-
static std::unordered_map<std::string, BlockBasedTableOptions::IndexType>
111-
block_base_table_index_type_string_map;
112-
static std::unordered_map<std::string,
113-
BlockBasedTableOptions::DataBlockIndexType>
114-
block_base_table_data_block_index_type_string_map;
115-
static std::unordered_map<std::string,
116-
BlockBasedTableOptions::IndexShorteningMode>
117-
block_base_table_index_shortening_mode_string_map;
118110
static std::unordered_map<std::string, EncodingType> encoding_type_string_map;
119111
static std::unordered_map<std::string, CompactionStyle>
120112
compaction_style_string_map;
121113
static std::unordered_map<std::string, CompactionPri>
122114
compaction_pri_string_map;
123-
static std::unordered_map<std::string, WALRecoveryMode>
124-
wal_recovery_mode_string_map;
125-
static std::unordered_map<std::string, DBOptions::AccessHint>
126-
access_hint_string_map;
127-
static std::unordered_map<std::string, InfoLogLevel>
128-
info_log_level_string_map;
129115
static ColumnFamilyOptions dummy_cf_options;
130116
static CompactionOptionsFIFO dummy_comp_options;
131117
static LRUCacheOptions dummy_lru_cache_options;
@@ -153,22 +139,11 @@ static auto& lru_cache_options_type_info =
153139
OptionsHelper::lru_cache_options_type_info;
154140
static auto& compression_type_string_map =
155141
OptionsHelper::compression_type_string_map;
156-
static auto& block_base_table_index_type_string_map =
157-
OptionsHelper::block_base_table_index_type_string_map;
158-
static auto& block_base_table_data_block_index_type_string_map =
159-
OptionsHelper::block_base_table_data_block_index_type_string_map;
160-
static auto& block_base_table_index_shortening_mode_string_map =
161-
OptionsHelper::block_base_table_index_shortening_mode_string_map;
162142
static auto& encoding_type_string_map = OptionsHelper::encoding_type_string_map;
163143
static auto& compaction_style_string_map =
164144
OptionsHelper::compaction_style_string_map;
165145
static auto& compaction_pri_string_map =
166146
OptionsHelper::compaction_pri_string_map;
167-
static auto& wal_recovery_mode_string_map =
168-
OptionsHelper::wal_recovery_mode_string_map;
169-
static auto& access_hint_string_map = OptionsHelper::access_hint_string_map;
170-
static auto& info_log_level_string_map =
171-
OptionsHelper::info_log_level_string_map;
172147
#endif // !ROCKSDB_LITE
173148

174149
} // namespace ROCKSDB_NAMESPACE

0 commit comments

Comments
 (0)