options.cc 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. //
  6. // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  7. // Use of this source code is governed by a BSD-style license that can be
  8. // found in the LICENSE file. See the AUTHORS file for names of contributors.
  9. #include "rocksdb/options.h"
  10. #include <cinttypes>
  11. #include <limits>
  12. #include "logging/logging.h"
  13. #include "monitoring/statistics_impl.h"
  14. #include "options/db_options.h"
  15. #include "options/options_helper.h"
  16. #include "rocksdb/cache.h"
  17. #include "rocksdb/compaction_filter.h"
  18. #include "rocksdb/comparator.h"
  19. #include "rocksdb/env.h"
  20. #include "rocksdb/filter_policy.h"
  21. #include "rocksdb/memtablerep.h"
  22. #include "rocksdb/merge_operator.h"
  23. #include "rocksdb/slice.h"
  24. #include "rocksdb/slice_transform.h"
  25. #include "rocksdb/sst_file_manager.h"
  26. #include "rocksdb/sst_partitioner.h"
  27. #include "rocksdb/table.h"
  28. #include "rocksdb/table_properties.h"
  29. #include "rocksdb/wal_filter.h"
  30. #include "table/block_based/block_based_table_factory.h"
  31. #include "util/compression.h"
  32. namespace ROCKSDB_NAMESPACE {
  33. AdvancedColumnFamilyOptions::AdvancedColumnFamilyOptions() {
  34. assert(memtable_factory.get() != nullptr);
  35. }
  36. AdvancedColumnFamilyOptions::AdvancedColumnFamilyOptions(const Options& options)
  37. : max_write_buffer_number(options.max_write_buffer_number),
  38. min_write_buffer_number_to_merge(
  39. options.min_write_buffer_number_to_merge),
  40. max_write_buffer_size_to_maintain(
  41. options.max_write_buffer_size_to_maintain),
  42. inplace_update_support(options.inplace_update_support),
  43. inplace_update_num_locks(options.inplace_update_num_locks),
  44. experimental_mempurge_threshold(options.experimental_mempurge_threshold),
  45. inplace_callback(options.inplace_callback),
  46. memtable_prefix_bloom_size_ratio(
  47. options.memtable_prefix_bloom_size_ratio),
  48. memtable_whole_key_filtering(options.memtable_whole_key_filtering),
  49. memtable_huge_page_size(options.memtable_huge_page_size),
  50. memtable_insert_with_hint_prefix_extractor(
  51. options.memtable_insert_with_hint_prefix_extractor),
  52. bloom_locality(options.bloom_locality),
  53. arena_block_size(options.arena_block_size),
  54. compression_per_level(options.compression_per_level),
  55. num_levels(options.num_levels),
  56. level0_slowdown_writes_trigger(options.level0_slowdown_writes_trigger),
  57. level0_stop_writes_trigger(options.level0_stop_writes_trigger),
  58. target_file_size_base(options.target_file_size_base),
  59. target_file_size_multiplier(options.target_file_size_multiplier),
  60. level_compaction_dynamic_level_bytes(
  61. options.level_compaction_dynamic_level_bytes),
  62. max_bytes_for_level_multiplier(options.max_bytes_for_level_multiplier),
  63. max_bytes_for_level_multiplier_additional(
  64. options.max_bytes_for_level_multiplier_additional),
  65. max_compaction_bytes(options.max_compaction_bytes),
  66. soft_pending_compaction_bytes_limit(
  67. options.soft_pending_compaction_bytes_limit),
  68. hard_pending_compaction_bytes_limit(
  69. options.hard_pending_compaction_bytes_limit),
  70. compaction_style(options.compaction_style),
  71. compaction_pri(options.compaction_pri),
  72. compaction_options_universal(options.compaction_options_universal),
  73. compaction_options_fifo(options.compaction_options_fifo),
  74. max_sequential_skip_in_iterations(
  75. options.max_sequential_skip_in_iterations),
  76. memtable_factory(options.memtable_factory),
  77. table_properties_collector_factories(
  78. options.table_properties_collector_factories),
  79. max_successive_merges(options.max_successive_merges),
  80. strict_max_successive_merges(options.strict_max_successive_merges),
  81. optimize_filters_for_hits(options.optimize_filters_for_hits),
  82. paranoid_file_checks(options.paranoid_file_checks),
  83. force_consistency_checks(options.force_consistency_checks),
  84. report_bg_io_stats(options.report_bg_io_stats),
  85. disallow_memtable_writes(options.disallow_memtable_writes),
  86. ttl(options.ttl),
  87. periodic_compaction_seconds(options.periodic_compaction_seconds),
  88. sample_for_compression(options.sample_for_compression),
  89. last_level_temperature(options.last_level_temperature),
  90. default_write_temperature(options.default_write_temperature),
  91. default_temperature(options.default_temperature),
  92. preclude_last_level_data_seconds(
  93. options.preclude_last_level_data_seconds),
  94. preserve_internal_time_seconds(options.preserve_internal_time_seconds),
  95. enable_blob_files(options.enable_blob_files),
  96. min_blob_size(options.min_blob_size),
  97. blob_file_size(options.blob_file_size),
  98. blob_compression_type(options.blob_compression_type),
  99. enable_blob_garbage_collection(options.enable_blob_garbage_collection),
  100. blob_garbage_collection_age_cutoff(
  101. options.blob_garbage_collection_age_cutoff),
  102. blob_garbage_collection_force_threshold(
  103. options.blob_garbage_collection_force_threshold),
  104. blob_compaction_readahead_size(options.blob_compaction_readahead_size),
  105. blob_file_starting_level(options.blob_file_starting_level),
  106. blob_cache(options.blob_cache),
  107. prepopulate_blob_cache(options.prepopulate_blob_cache),
  108. persist_user_defined_timestamps(options.persist_user_defined_timestamps),
  109. memtable_op_scan_flush_trigger(options.memtable_op_scan_flush_trigger),
  110. memtable_avg_op_scan_flush_trigger(
  111. options.memtable_avg_op_scan_flush_trigger) {
  112. assert(memtable_factory.get() != nullptr);
  113. if (max_bytes_for_level_multiplier_additional.size() <
  114. static_cast<unsigned int>(num_levels)) {
  115. max_bytes_for_level_multiplier_additional.resize(num_levels, 1);
  116. }
  117. }
  118. ColumnFamilyOptions::ColumnFamilyOptions()
  119. : compression(Snappy_Supported() ? kSnappyCompression : kNoCompression),
  120. table_factory(
  121. std::shared_ptr<TableFactory>(new BlockBasedTableFactory())) {}
  122. ColumnFamilyOptions::ColumnFamilyOptions(const Options& options)
  123. : ColumnFamilyOptions(*static_cast<const ColumnFamilyOptions*>(&options)) {}
  124. DBOptions::DBOptions() = default;
  125. DBOptions::DBOptions(const Options& options)
  126. : DBOptions(*static_cast<const DBOptions*>(&options)) {}
  127. void DBOptions::Dump(Logger* log) const {
  128. ImmutableDBOptions(*this).Dump(log);
  129. MutableDBOptions(*this).Dump(log);
  130. } // DBOptions::Dump
  131. void ColumnFamilyOptions::Dump(Logger* log) const {
  132. ROCKS_LOG_HEADER(log, " Options.comparator: %s",
  133. comparator->Name());
  134. if (comparator->timestamp_size() > 0) {
  135. ROCKS_LOG_HEADER(
  136. log, " Options.persist_user_defined_timestamps: %s",
  137. persist_user_defined_timestamps ? "true" : "false");
  138. }
  139. ROCKS_LOG_HEADER(log, " Options.merge_operator: %s",
  140. merge_operator ? merge_operator->Name() : "None");
  141. ROCKS_LOG_HEADER(log, " Options.compaction_filter: %s",
  142. compaction_filter ? compaction_filter->Name() : "None");
  143. ROCKS_LOG_HEADER(
  144. log, " Options.compaction_filter_factory: %s",
  145. compaction_filter_factory ? compaction_filter_factory->Name() : "None");
  146. ROCKS_LOG_HEADER(
  147. log, " Options.sst_partitioner_factory: %s",
  148. sst_partitioner_factory ? sst_partitioner_factory->Name() : "None");
  149. ROCKS_LOG_HEADER(log, " Options.memtable_factory: %s",
  150. memtable_factory->Name());
  151. ROCKS_LOG_HEADER(log, " Options.table_factory: %s",
  152. table_factory->Name());
  153. ROCKS_LOG_HEADER(log, " table_factory options: %s",
  154. table_factory->GetPrintableOptions().c_str());
  155. ROCKS_LOG_HEADER(log, " Options.write_buffer_size: %" ROCKSDB_PRIszt,
  156. write_buffer_size);
  157. ROCKS_LOG_HEADER(log, " Options.max_write_buffer_number: %d",
  158. max_write_buffer_number);
  159. if (!compression_per_level.empty()) {
  160. for (unsigned int i = 0; i < compression_per_level.size(); i++) {
  161. ROCKS_LOG_HEADER(
  162. log, " Options.compression[%d]: %s", i,
  163. CompressionTypeToString(compression_per_level[i]).c_str());
  164. }
  165. } else {
  166. ROCKS_LOG_HEADER(log, " Options.compression: %s",
  167. CompressionTypeToString(compression).c_str());
  168. }
  169. ROCKS_LOG_HEADER(
  170. log, " Options.bottommost_compression: %s",
  171. bottommost_compression == kDisableCompressionOption
  172. ? "Disabled"
  173. : CompressionTypeToString(bottommost_compression).c_str());
  174. ROCKS_LOG_HEADER(
  175. log, " Options.prefix_extractor: %s",
  176. prefix_extractor == nullptr ? "nullptr" : prefix_extractor->Name());
  177. ROCKS_LOG_HEADER(log,
  178. " Options.memtable_insert_with_hint_prefix_extractor: %s",
  179. memtable_insert_with_hint_prefix_extractor == nullptr
  180. ? "nullptr"
  181. : memtable_insert_with_hint_prefix_extractor->Name());
  182. ROCKS_LOG_HEADER(log, " Options.num_levels: %d", num_levels);
  183. ROCKS_LOG_HEADER(log, " Options.min_write_buffer_number_to_merge: %d",
  184. min_write_buffer_number_to_merge);
  185. ROCKS_LOG_HEADER(log,
  186. " Options.max_write_buffer_size_to_maintain: %" PRIu64,
  187. max_write_buffer_size_to_maintain);
  188. ROCKS_LOG_HEADER(
  189. log, " Options.bottommost_compression_opts.window_bits: %d",
  190. bottommost_compression_opts.window_bits);
  191. ROCKS_LOG_HEADER(
  192. log, " Options.bottommost_compression_opts.level: %d",
  193. bottommost_compression_opts.level);
  194. ROCKS_LOG_HEADER(
  195. log, " Options.bottommost_compression_opts.strategy: %d",
  196. bottommost_compression_opts.strategy);
  197. ROCKS_LOG_HEADER(
  198. log,
  199. " Options.bottommost_compression_opts.max_dict_bytes: "
  200. "%" PRIu32,
  201. bottommost_compression_opts.max_dict_bytes);
  202. ROCKS_LOG_HEADER(
  203. log,
  204. " Options.bottommost_compression_opts.zstd_max_train_bytes: "
  205. "%" PRIu32,
  206. bottommost_compression_opts.zstd_max_train_bytes);
  207. ROCKS_LOG_HEADER(
  208. log,
  209. " Options.bottommost_compression_opts.parallel_threads: "
  210. "%" PRIu32,
  211. bottommost_compression_opts.parallel_threads);
  212. ROCKS_LOG_HEADER(
  213. log, " Options.bottommost_compression_opts.enabled: %s",
  214. bottommost_compression_opts.enabled ? "true" : "false");
  215. ROCKS_LOG_HEADER(
  216. log,
  217. " Options.bottommost_compression_opts.max_dict_buffer_bytes: "
  218. "%" PRIu64,
  219. bottommost_compression_opts.max_dict_buffer_bytes);
  220. ROCKS_LOG_HEADER(
  221. log,
  222. " Options.bottommost_compression_opts.use_zstd_dict_trainer: %s",
  223. bottommost_compression_opts.use_zstd_dict_trainer ? "true" : "false");
  224. ROCKS_LOG_HEADER(log, " Options.compression_opts.window_bits: %d",
  225. compression_opts.window_bits);
  226. ROCKS_LOG_HEADER(log, " Options.compression_opts.level: %d",
  227. compression_opts.level);
  228. ROCKS_LOG_HEADER(log, " Options.compression_opts.strategy: %d",
  229. compression_opts.strategy);
  230. ROCKS_LOG_HEADER(log,
  231. " Options.compression_opts.max_dict_bytes: %" PRIu32,
  232. compression_opts.max_dict_bytes);
  233. ROCKS_LOG_HEADER(log,
  234. " Options.compression_opts.zstd_max_train_bytes: "
  235. "%" PRIu32,
  236. compression_opts.zstd_max_train_bytes);
  237. ROCKS_LOG_HEADER(log,
  238. " Options.compression_opts.use_zstd_dict_trainer: %s",
  239. compression_opts.use_zstd_dict_trainer ? "true" : "false");
  240. ROCKS_LOG_HEADER(log,
  241. " Options.compression_opts.parallel_threads: "
  242. "%" PRIu32,
  243. compression_opts.parallel_threads);
  244. ROCKS_LOG_HEADER(log, " Options.compression_opts.enabled: %s",
  245. compression_opts.enabled ? "true" : "false");
  246. ROCKS_LOG_HEADER(log,
  247. " Options.compression_opts.max_dict_buffer_bytes: "
  248. "%" PRIu64,
  249. compression_opts.max_dict_buffer_bytes);
  250. ROCKS_LOG_HEADER(log, " Options.level0_file_num_compaction_trigger: %d",
  251. level0_file_num_compaction_trigger);
  252. ROCKS_LOG_HEADER(log, " Options.level0_slowdown_writes_trigger: %d",
  253. level0_slowdown_writes_trigger);
  254. ROCKS_LOG_HEADER(log, " Options.level0_stop_writes_trigger: %d",
  255. level0_stop_writes_trigger);
  256. ROCKS_LOG_HEADER(log,
  257. " Options.target_file_size_base: %" PRIu64,
  258. target_file_size_base);
  259. ROCKS_LOG_HEADER(log, " Options.target_file_size_multiplier: %d",
  260. target_file_size_multiplier);
  261. ROCKS_LOG_HEADER(log,
  262. " Options.max_bytes_for_level_base: %" PRIu64,
  263. max_bytes_for_level_base);
  264. ROCKS_LOG_HEADER(log, "Options.level_compaction_dynamic_level_bytes: %d",
  265. level_compaction_dynamic_level_bytes);
  266. ROCKS_LOG_HEADER(log, " Options.max_bytes_for_level_multiplier: %f",
  267. max_bytes_for_level_multiplier);
  268. for (size_t i = 0; i < max_bytes_for_level_multiplier_additional.size();
  269. i++) {
  270. ROCKS_LOG_HEADER(
  271. log,
  272. "Options.max_bytes_for_level_multiplier_addtl[%" ROCKSDB_PRIszt "]: %d",
  273. i, max_bytes_for_level_multiplier_additional[i]);
  274. }
  275. ROCKS_LOG_HEADER(log,
  276. " Options.max_sequential_skip_in_iterations: %" PRIu64,
  277. max_sequential_skip_in_iterations);
  278. ROCKS_LOG_HEADER(log,
  279. " Options.memtable_op_scan_flush_trigger: %" PRIu32,
  280. memtable_op_scan_flush_trigger);
  281. ROCKS_LOG_HEADER(log,
  282. " Options.memtable_avg_op_scan_flush_trigger: %" PRIu32,
  283. memtable_avg_op_scan_flush_trigger);
  284. ROCKS_LOG_HEADER(log,
  285. " Options.max_compaction_bytes: %" PRIu64,
  286. max_compaction_bytes);
  287. ROCKS_LOG_HEADER(
  288. log, " Options.arena_block_size: %" ROCKSDB_PRIszt,
  289. arena_block_size);
  290. ROCKS_LOG_HEADER(log,
  291. " Options.soft_pending_compaction_bytes_limit: %" PRIu64,
  292. soft_pending_compaction_bytes_limit);
  293. ROCKS_LOG_HEADER(log,
  294. " Options.hard_pending_compaction_bytes_limit: %" PRIu64,
  295. hard_pending_compaction_bytes_limit);
  296. ROCKS_LOG_HEADER(log, " Options.disable_auto_compactions: %d",
  297. disable_auto_compactions);
  298. const auto& it_compaction_style =
  299. compaction_style_to_string.find(compaction_style);
  300. std::string str_compaction_style;
  301. if (it_compaction_style == compaction_style_to_string.end()) {
  302. assert(false);
  303. str_compaction_style = "unknown_" + std::to_string(compaction_style);
  304. } else {
  305. str_compaction_style = it_compaction_style->second;
  306. }
  307. ROCKS_LOG_HEADER(log, " Options.compaction_style: %s",
  308. str_compaction_style.c_str());
  309. const auto& it_compaction_pri = compaction_pri_to_string.find(compaction_pri);
  310. std::string str_compaction_pri;
  311. if (it_compaction_pri == compaction_pri_to_string.end()) {
  312. assert(false);
  313. str_compaction_pri = "unknown_" + std::to_string(compaction_pri);
  314. } else {
  315. str_compaction_pri = it_compaction_pri->second;
  316. }
  317. ROCKS_LOG_HEADER(log, " Options.compaction_pri: %s",
  318. str_compaction_pri.c_str());
  319. ROCKS_LOG_HEADER(log, "Options.compaction_options_universal.size_ratio: %u",
  320. compaction_options_universal.size_ratio);
  321. ROCKS_LOG_HEADER(log,
  322. "Options.compaction_options_universal.min_merge_width: %u",
  323. compaction_options_universal.min_merge_width);
  324. ROCKS_LOG_HEADER(log,
  325. "Options.compaction_options_universal.max_merge_width: %u",
  326. compaction_options_universal.max_merge_width);
  327. ROCKS_LOG_HEADER(log,
  328. "Options.compaction_options_universal."
  329. "max_size_amplification_percent: %u",
  330. compaction_options_universal.max_size_amplification_percent);
  331. ROCKS_LOG_HEADER(
  332. log, "Options.compaction_options_universal.compression_size_percent: %d",
  333. compaction_options_universal.compression_size_percent);
  334. const auto& it_compaction_stop_style = compaction_stop_style_to_string.find(
  335. compaction_options_universal.stop_style);
  336. std::string str_compaction_stop_style;
  337. if (it_compaction_stop_style == compaction_stop_style_to_string.end()) {
  338. assert(false);
  339. str_compaction_stop_style =
  340. "unknown_" + std::to_string(compaction_options_universal.stop_style);
  341. } else {
  342. str_compaction_stop_style = it_compaction_stop_style->second;
  343. }
  344. ROCKS_LOG_HEADER(log, "Options.compaction_options_universal.stop_style: %s",
  345. str_compaction_stop_style.c_str());
  346. ROCKS_LOG_HEADER(log, "Options.compaction_options_universal.max_read_amp: %d",
  347. compaction_options_universal.max_read_amp);
  348. ROCKS_LOG_HEADER(
  349. log, "Options.compaction_options_universal.reduce_file_locking: %d",
  350. compaction_options_universal.reduce_file_locking);
  351. ROCKS_LOG_HEADER(
  352. log, "Options.compaction_options_fifo.max_table_files_size: %" PRIu64,
  353. compaction_options_fifo.max_table_files_size);
  354. ROCKS_LOG_HEADER(log, "Options.compaction_options_fifo.allow_compaction: %d",
  355. compaction_options_fifo.allow_compaction);
  356. std::ostringstream collector_info;
  357. for (const auto& collector_factory : table_properties_collector_factories) {
  358. collector_info << collector_factory->ToString() << ';';
  359. }
  360. ROCKS_LOG_HEADER(log,
  361. " Options.table_properties_collectors: %s",
  362. collector_info.str().c_str());
  363. ROCKS_LOG_HEADER(log, " Options.inplace_update_support: %d",
  364. inplace_update_support);
  365. ROCKS_LOG_HEADER(
  366. log, " Options.inplace_update_num_locks: %" ROCKSDB_PRIszt,
  367. inplace_update_num_locks);
  368. // TODO: easier config for bloom (maybe based on avg key/value size)
  369. ROCKS_LOG_HEADER(log,
  370. " Options.memtable_prefix_bloom_size_ratio: %f",
  371. memtable_prefix_bloom_size_ratio);
  372. ROCKS_LOG_HEADER(log,
  373. " Options.memtable_whole_key_filtering: %d",
  374. memtable_whole_key_filtering);
  375. ROCKS_LOG_HEADER(log, " Options.memtable_huge_page_size: %" ROCKSDB_PRIszt,
  376. memtable_huge_page_size);
  377. ROCKS_LOG_HEADER(log, " Options.bloom_locality: %d",
  378. bloom_locality);
  379. ROCKS_LOG_HEADER(
  380. log, " Options.max_successive_merges: %" ROCKSDB_PRIszt,
  381. max_successive_merges);
  382. ROCKS_LOG_HEADER(log, " Options.strict_max_successive_merges: %d",
  383. strict_max_successive_merges);
  384. ROCKS_LOG_HEADER(log, " Options.optimize_filters_for_hits: %d",
  385. optimize_filters_for_hits);
  386. ROCKS_LOG_HEADER(log, " Options.paranoid_file_checks: %d",
  387. paranoid_file_checks);
  388. ROCKS_LOG_HEADER(log, " Options.force_consistency_checks: %d",
  389. force_consistency_checks);
  390. ROCKS_LOG_HEADER(log, " Options.report_bg_io_stats: %d",
  391. report_bg_io_stats);
  392. ROCKS_LOG_HEADER(log, " Options.disallow_memtable_writes: %d",
  393. disallow_memtable_writes);
  394. ROCKS_LOG_HEADER(log, " Options.ttl: %" PRIu64,
  395. ttl);
  396. ROCKS_LOG_HEADER(log,
  397. " Options.periodic_compaction_seconds: %" PRIu64,
  398. periodic_compaction_seconds);
  399. const auto& it_temp = temperature_to_string.find(default_temperature);
  400. std::string str_default_temperature;
  401. if (it_temp == temperature_to_string.end()) {
  402. assert(false);
  403. str_default_temperature = "unknown_temperature";
  404. } else {
  405. str_default_temperature = it_temp->second;
  406. }
  407. ROCKS_LOG_HEADER(log,
  408. " Options.default_temperature: %s",
  409. str_default_temperature.c_str());
  410. ROCKS_LOG_HEADER(log, " Options.preclude_last_level_data_seconds: %" PRIu64,
  411. preclude_last_level_data_seconds);
  412. ROCKS_LOG_HEADER(log, " Options.preserve_internal_time_seconds: %" PRIu64,
  413. preserve_internal_time_seconds);
  414. ROCKS_LOG_HEADER(log, " Options.enable_blob_files: %s",
  415. enable_blob_files ? "true" : "false");
  416. ROCKS_LOG_HEADER(log,
  417. " Options.min_blob_size: %" PRIu64,
  418. min_blob_size);
  419. ROCKS_LOG_HEADER(log,
  420. " Options.blob_file_size: %" PRIu64,
  421. blob_file_size);
  422. ROCKS_LOG_HEADER(log, " Options.blob_compression_type: %s",
  423. CompressionTypeToString(blob_compression_type).c_str());
  424. ROCKS_LOG_HEADER(log, " Options.enable_blob_garbage_collection: %s",
  425. enable_blob_garbage_collection ? "true" : "false");
  426. ROCKS_LOG_HEADER(log, " Options.blob_garbage_collection_age_cutoff: %f",
  427. blob_garbage_collection_age_cutoff);
  428. ROCKS_LOG_HEADER(log, "Options.blob_garbage_collection_force_threshold: %f",
  429. blob_garbage_collection_force_threshold);
  430. ROCKS_LOG_HEADER(log,
  431. " Options.blob_compaction_readahead_size: %" PRIu64,
  432. blob_compaction_readahead_size);
  433. ROCKS_LOG_HEADER(log, " Options.blob_file_starting_level: %d",
  434. blob_file_starting_level);
  435. if (blob_cache) {
  436. ROCKS_LOG_HEADER(log, " Options.blob_cache: %s",
  437. blob_cache->Name());
  438. ROCKS_LOG_HEADER(log, " blob_cache options: %s",
  439. blob_cache->GetPrintableOptions().c_str());
  440. ROCKS_LOG_HEADER(log,
  441. " blob_cache prepopulated: %s",
  442. prepopulate_blob_cache == PrepopulateBlobCache::kFlushOnly
  443. ? "flush only"
  444. : "disabled");
  445. }
  446. ROCKS_LOG_HEADER(log, " Options.experimental_mempurge_threshold: %f",
  447. experimental_mempurge_threshold);
  448. ROCKS_LOG_HEADER(log, " Options.memtable_max_range_deletions: %d",
  449. memtable_max_range_deletions);
  450. ROCKS_LOG_HEADER(log, " Options.cf_allow_ingest_behind: %s",
  451. cf_allow_ingest_behind ? "true" : "false");
  452. } // ColumnFamilyOptions::Dump
  453. void Options::Dump(Logger* log) const {
  454. DBOptions::Dump(log);
  455. ColumnFamilyOptions::Dump(log);
  456. } // Options::Dump
  457. void Options::DumpCFOptions(Logger* log) const {
  458. ColumnFamilyOptions::Dump(log);
  459. } // Options::DumpCFOptions
  460. //
  461. // The goal of this method is to create a configuration that
  462. // allows an application to write all files into L0 and
  463. // then do a single compaction to output all files into L1.
  464. Options* Options::PrepareForBulkLoad() {
  465. // never slowdown ingest.
  466. level0_file_num_compaction_trigger = (1 << 30);
  467. level0_slowdown_writes_trigger = (1 << 30);
  468. level0_stop_writes_trigger = (1 << 30);
  469. soft_pending_compaction_bytes_limit = 0;
  470. hard_pending_compaction_bytes_limit = 0;
  471. // no auto compactions please. The application should issue a
  472. // manual compaction after all data is loaded into L0.
  473. disable_auto_compactions = true;
  474. // A manual compaction run should pick all files in L0 in
  475. // a single compaction run.
  476. max_compaction_bytes = (static_cast<uint64_t>(1) << 60);
  477. // It is better to have only 2 levels, otherwise a manual
  478. // compaction would compact at every possible level, thereby
  479. // increasing the total time needed for compactions.
  480. num_levels = 2;
  481. // Need to allow more write buffers to allow more parallism
  482. // of flushes.
  483. max_write_buffer_number = 6;
  484. min_write_buffer_number_to_merge = 1;
  485. // When compaction is disabled, more parallel flush threads can
  486. // help with write throughput.
  487. max_background_flushes = 4;
  488. // Prevent a memtable flush to automatically promote files
  489. // to L1. This is helpful so that all files that are
  490. // input to the manual compaction are all at L0.
  491. max_background_compactions = 2;
  492. // The compaction would create large files in L1.
  493. target_file_size_base = 256 * 1024 * 1024;
  494. return this;
  495. }
  496. Options* Options::OptimizeForSmallDb() {
  497. // 16MB block cache
  498. std::shared_ptr<Cache> cache = NewLRUCache(16 << 20);
  499. ColumnFamilyOptions::OptimizeForSmallDb(&cache);
  500. DBOptions::OptimizeForSmallDb(&cache);
  501. return this;
  502. }
  503. Options* Options::DisableExtraChecks() {
  504. // See https://github.com/facebook/rocksdb/issues/9354
  505. force_consistency_checks = false;
  506. // Considered but no clear performance impact seen:
  507. // * paranoid_checks
  508. // * flush_verify_memtable_count
  509. // By current API contract, not including
  510. // * verify_checksums
  511. // because checking storage data integrity is a more standard practice.
  512. return this;
  513. }
  514. Options* Options::OldDefaults(int rocksdb_major_version,
  515. int rocksdb_minor_version) {
  516. ColumnFamilyOptions::OldDefaults(rocksdb_major_version,
  517. rocksdb_minor_version);
  518. DBOptions::OldDefaults(rocksdb_major_version, rocksdb_minor_version);
  519. return this;
  520. }
  521. DBOptions* DBOptions::OldDefaults(int rocksdb_major_version,
  522. int rocksdb_minor_version) {
  523. if (rocksdb_major_version < 4 ||
  524. (rocksdb_major_version == 4 && rocksdb_minor_version < 7)) {
  525. max_file_opening_threads = 1;
  526. table_cache_numshardbits = 4;
  527. }
  528. if (rocksdb_major_version < 5 ||
  529. (rocksdb_major_version == 5 && rocksdb_minor_version < 2)) {
  530. delayed_write_rate = 2 * 1024U * 1024U;
  531. } else if (rocksdb_major_version < 5 ||
  532. (rocksdb_major_version == 5 && rocksdb_minor_version < 6)) {
  533. delayed_write_rate = 16 * 1024U * 1024U;
  534. }
  535. max_open_files = 5000;
  536. wal_recovery_mode = WALRecoveryMode::kTolerateCorruptedTailRecords;
  537. return this;
  538. }
  539. ColumnFamilyOptions* ColumnFamilyOptions::OldDefaults(
  540. int rocksdb_major_version, int rocksdb_minor_version) {
  541. if (rocksdb_major_version < 5 ||
  542. (rocksdb_major_version == 5 && rocksdb_minor_version <= 18)) {
  543. compaction_pri = CompactionPri::kByCompensatedSize;
  544. }
  545. if (rocksdb_major_version < 4 ||
  546. (rocksdb_major_version == 4 && rocksdb_minor_version < 7)) {
  547. write_buffer_size = 4 << 20;
  548. target_file_size_base = 2 * 1048576;
  549. max_bytes_for_level_base = 10 * 1048576;
  550. soft_pending_compaction_bytes_limit = 0;
  551. hard_pending_compaction_bytes_limit = 0;
  552. }
  553. if (rocksdb_major_version < 5) {
  554. level0_stop_writes_trigger = 24;
  555. } else if (rocksdb_major_version == 5 && rocksdb_minor_version < 2) {
  556. level0_stop_writes_trigger = 30;
  557. }
  558. return this;
  559. }
  560. // Optimization functions
  561. DBOptions* DBOptions::OptimizeForSmallDb(std::shared_ptr<Cache>* cache) {
  562. max_file_opening_threads = 1;
  563. max_open_files = 5000;
  564. // Cost memtable to block cache too.
  565. std::shared_ptr<ROCKSDB_NAMESPACE::WriteBufferManager> wbm =
  566. std::make_shared<ROCKSDB_NAMESPACE::WriteBufferManager>(
  567. 0, (cache != nullptr) ? *cache : std::shared_ptr<Cache>());
  568. write_buffer_manager = wbm;
  569. return this;
  570. }
  571. ColumnFamilyOptions* ColumnFamilyOptions::OptimizeForSmallDb(
  572. std::shared_ptr<Cache>* cache) {
  573. write_buffer_size = 2 << 20;
  574. target_file_size_base = 2 * 1048576;
  575. max_bytes_for_level_base = 10 * 1048576;
  576. soft_pending_compaction_bytes_limit = 256 * 1048576;
  577. hard_pending_compaction_bytes_limit = 1073741824ul;
  578. BlockBasedTableOptions table_options;
  579. table_options.block_cache =
  580. (cache != nullptr) ? *cache : std::shared_ptr<Cache>();
  581. table_options.cache_index_and_filter_blocks = true;
  582. // Two level iterator to avoid LRU cache imbalance
  583. table_options.index_type =
  584. BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
  585. table_factory.reset(new BlockBasedTableFactory(table_options));
  586. return this;
  587. }
  588. ColumnFamilyOptions* ColumnFamilyOptions::OptimizeForPointLookup(
  589. uint64_t block_cache_size_mb) {
  590. BlockBasedTableOptions block_based_options;
  591. block_based_options.data_block_index_type =
  592. BlockBasedTableOptions::kDataBlockBinaryAndHash;
  593. block_based_options.data_block_hash_table_util_ratio = 0.75;
  594. block_based_options.filter_policy.reset(NewBloomFilterPolicy(10));
  595. block_based_options.block_cache =
  596. NewLRUCache(static_cast<size_t>(block_cache_size_mb * 1024 * 1024));
  597. table_factory.reset(new BlockBasedTableFactory(block_based_options));
  598. memtable_prefix_bloom_size_ratio = 0.02;
  599. memtable_whole_key_filtering = true;
  600. return this;
  601. }
  602. ColumnFamilyOptions* ColumnFamilyOptions::OptimizeLevelStyleCompaction(
  603. uint64_t memtable_memory_budget) {
  604. write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
  605. // merge two memtables when flushing to L0
  606. min_write_buffer_number_to_merge = 2;
  607. // this means we'll use 50% extra memory in the worst case, but will reduce
  608. // write stalls.
  609. max_write_buffer_number = 6;
  610. // start flushing L0->L1 as soon as possible. each file on level0 is
  611. // (memtable_memory_budget / 2). This will flush level 0 when it's bigger than
  612. // memtable_memory_budget.
  613. level0_file_num_compaction_trigger = 2;
  614. // doesn't really matter much, but we don't want to create too many files
  615. target_file_size_base = memtable_memory_budget / 8;
  616. // make Level1 size equal to Level0 size, so that L0->L1 compactions are fast
  617. max_bytes_for_level_base = memtable_memory_budget;
  618. // level style compaction
  619. compaction_style = kCompactionStyleLevel;
  620. // only compress levels >= 2
  621. compression_per_level.resize(num_levels);
  622. for (int i = 0; i < num_levels; ++i) {
  623. if (i < 2) {
  624. compression_per_level[i] = kNoCompression;
  625. } else {
  626. compression_per_level[i] =
  627. LZ4_Supported()
  628. ? kLZ4Compression
  629. : (Snappy_Supported() ? kSnappyCompression : kNoCompression);
  630. }
  631. }
  632. return this;
  633. }
  634. ColumnFamilyOptions* ColumnFamilyOptions::OptimizeUniversalStyleCompaction(
  635. uint64_t memtable_memory_budget) {
  636. write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
  637. // merge two memtables when flushing to L0
  638. min_write_buffer_number_to_merge = 2;
  639. // this means we'll use 50% extra memory in the worst case, but will reduce
  640. // write stalls.
  641. max_write_buffer_number = 6;
  642. // universal style compaction
  643. compaction_style = kCompactionStyleUniversal;
  644. compaction_options_universal.compression_size_percent = 80;
  645. return this;
  646. }
  647. DBOptions* DBOptions::IncreaseParallelism(int total_threads) {
  648. max_background_jobs = total_threads;
  649. env->SetBackgroundThreads(total_threads, Env::LOW);
  650. env->SetBackgroundThreads(1, Env::HIGH);
  651. return this;
  652. }
  653. ReadOptions::ReadOptions(bool _verify_checksums, bool _fill_cache)
  654. : verify_checksums(_verify_checksums), fill_cache(_fill_cache) {}
  655. ReadOptions::ReadOptions(Env::IOActivity _io_activity)
  656. : io_activity(_io_activity) {}
  657. WriteOptions::WriteOptions(Env::IOActivity _io_activity)
  658. : io_activity(_io_activity) {}
  659. WriteOptions::WriteOptions(Env::IOPriority _rate_limiter_priority,
  660. Env::IOActivity _io_activity)
  661. : rate_limiter_priority(_rate_limiter_priority),
  662. io_activity(_io_activity) {}
  663. } // namespace ROCKSDB_NAMESPACE