|
17 | 17 |
|
18 | 18 | namespace ROCKSDB_NAMESPACE { |
19 | 19 |
|
20 | | -static const std::vector<std::pair<CompressionType, const char*>> |
21 | | - kCompressions = { |
22 | | - {CompressionType::kNoCompression, "kNoCompression"}, |
23 | | - {CompressionType::kSnappyCompression, "kSnappyCompression"}, |
24 | | - {CompressionType::kZlibCompression, "kZlibCompression"}, |
25 | | - {CompressionType::kBZip2Compression, "kBZip2Compression"}, |
26 | | - {CompressionType::kLZ4Compression, "kLZ4Compression"}, |
27 | | - {CompressionType::kLZ4HCCompression, "kLZ4HCCompression"}, |
28 | | - {CompressionType::kXpressCompression, "kXpressCompression"}, |
29 | | - {CompressionType::kZSTD, "kZSTD"}}; |
30 | | - |
31 | 20 | namespace { |
32 | 21 |
|
33 | 22 | void print_help(bool to_stderr) { |
@@ -98,10 +87,15 @@ void print_help(bool to_stderr) { |
98 | 87 | be used when trying different compression algorithms |
99 | 88 |
|
100 | 89 | --compression_types=<comma-separated list of CompressionType members, e.g., |
101 | | - kSnappyCompression> |
| 90 | + kSnappyCompression or kCustomCompressionC4> |
102 | 91 | Can be combined with --command=recompress to run recompression for this |
103 | 92 | list of compression types |
104 | | - Supported compression types: %s |
| 93 | + Supported built-in compression types: %s |
| 94 | +
|
| 95 | + --compression_manager=<compression manager string> |
| 96 | + Used with --command=recompress to specify a compression manager to use |
| 97 | + instead of the built-in compression manager, which may support a |
| 98 | + different set of compression types. |
105 | 99 |
|
106 | 100 | --parse_internal_key=<0xKEY> |
107 | 101 | Convenience option to parse an internal key on the command line. Dumps the |
@@ -178,7 +172,8 @@ int SSTDumpTool::Run(int argc, char const* const* argv, Options options) { |
178 | 172 | std::string compression_level_to_str; |
179 | 173 | size_t block_size = 0; |
180 | 174 | size_t readahead_size = 2 * 1024 * 1024; |
181 | | - std::vector<std::pair<CompressionType, const char*>> compression_types; |
| 175 | + std::vector<CompressionType> compression_types; |
| 176 | + std::shared_ptr<CompressionManager> compression_manager; |
182 | 177 | uint64_t total_num_files = 0; |
183 | 178 | uint64_t total_num_data_blocks = 0; |
184 | 179 | uint64_t total_data_block_size = 0; |
@@ -244,19 +239,36 @@ int SSTDumpTool::Run(int argc, char const* const* argv, Options options) { |
244 | 239 | std::istringstream iss(compression_types_csv); |
245 | 240 | std::string compression_type; |
246 | 241 | has_specified_compression_types = true; |
| 242 | + |
247 | 243 | while (std::getline(iss, compression_type, ',')) { |
248 | | - auto iter = std::find_if( |
249 | | - kCompressions.begin(), kCompressions.end(), |
250 | | - [&compression_type](std::pair<CompressionType, const char*> curr) { |
251 | | - return curr.second == compression_type; |
252 | | - }); |
253 | | - if (iter == kCompressions.end()) { |
| 244 | + auto iter = |
| 245 | + OptionsHelper::compression_type_string_map.find(compression_type); |
| 246 | + if (iter == OptionsHelper::compression_type_string_map.end()) { |
254 | 247 | fprintf(stderr, "%s is not a valid CompressionType\n", |
255 | 248 | compression_type.c_str()); |
256 | 249 | exit(1); |
257 | 250 | } |
258 | | - compression_types.emplace_back(*iter); |
| 251 | + compression_types.emplace_back(iter->second); |
| 252 | + } |
| 253 | + } else if (strncmp(argv[i], "--compression_manager=", 22) == 0) { |
| 254 | + std::string compression_manager_str = argv[i] + 22; |
| 255 | + ConfigOptions config_options; |
| 256 | + config_options.ignore_unsupported_options = false; |
| 257 | + Status s = CompressionManager::CreateFromString( |
| 258 | + config_options, compression_manager_str, &compression_manager); |
| 259 | + if (!s.ok()) { |
| 260 | + fprintf(stderr, "Failed to create compression manager: %s\n", |
| 261 | + s.ToString().c_str()); |
| 262 | + exit(1); |
| 263 | + } |
| 264 | + if (compression_manager == nullptr) { |
| 265 | + fprintf(stderr, "No compression manager created: %s\n", |
| 266 | + compression_manager_str.c_str()); |
| 267 | + exit(1); |
259 | 268 | } |
| 269 | + options.compression_manager = compression_manager; |
| 270 | + printf("Using compression manager: %s\n", |
| 271 | + compression_manager->GetId().c_str()); |
260 | 272 | } else if (strncmp(argv[i], "--parse_internal_key=", 21) == 0) { |
261 | 273 | std::string in_key(argv[i] + 21); |
262 | 274 | try { |
@@ -450,9 +462,12 @@ int SSTDumpTool::Run(int argc, char const* const* argv, Options options) { |
450 | 462 | } |
451 | 463 |
|
452 | 464 | if (command == "recompress") { |
| 465 | + // TODO: consider getting supported compressions from the compression |
| 466 | + // manager |
453 | 467 | st = dumper.ShowAllCompressionSizes( |
454 | 468 | set_block_size ? block_size : 16384, |
455 | | - compression_types.empty() ? kCompressions : compression_types, |
| 469 | + compression_types.empty() ? GetSupportedCompressions() |
| 470 | + : compression_types, |
456 | 471 | compress_level_from, compress_level_to, compression_max_dict_bytes, |
457 | 472 | compression_zstd_max_train_bytes, compression_max_dict_buffer_bytes, |
458 | 473 | !compression_use_zstd_finalize_dict); |
|
0 commit comments