options.cc 26 KB

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