cf_options.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  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. #pragma once
  6. #include <string>
  7. #include <vector>
  8. #include "db/dbformat.h"
  9. #include "options/db_options.h"
  10. #include "rocksdb/options.h"
  11. #include "util/compression.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. // ImmutableCFOptions is a data struct used by RocksDB internal. It contains a
  14. // subset of Options that should not be changed during the entire lifetime
  15. // of DB. Raw pointers defined in this struct do not have ownership to the data
  16. // they point to. Options contains std::shared_ptr to these data.
  17. struct ImmutableCFOptions {
  18. public:
  19. static const char* kName() { return "ImmutableCFOptions"; }
  20. explicit ImmutableCFOptions();
  21. explicit ImmutableCFOptions(const ColumnFamilyOptions& cf_options);
  22. CompactionStyle compaction_style;
  23. CompactionPri compaction_pri;
  24. const Comparator* user_comparator;
  25. InternalKeyComparator internal_comparator; // Only in Immutable
  26. std::shared_ptr<MergeOperator> merge_operator;
  27. const CompactionFilter* compaction_filter;
  28. std::shared_ptr<CompactionFilterFactory> compaction_filter_factory;
  29. int min_write_buffer_number_to_merge;
  30. int64_t max_write_buffer_size_to_maintain;
  31. bool inplace_update_support;
  32. UpdateStatus (*inplace_callback)(char* existing_value,
  33. uint32_t* existing_value_size,
  34. Slice delta_value,
  35. std::string* merged_value);
  36. std::shared_ptr<MemTableRepFactory> memtable_factory;
  37. Options::TablePropertiesCollectorFactories
  38. table_properties_collector_factories;
  39. // This options is required by PlainTableReader. May need to move it
  40. // to PlainTableOptions just like bloom_bits_per_key
  41. uint32_t bloom_locality;
  42. bool level_compaction_dynamic_level_bytes;
  43. int num_levels;
  44. bool optimize_filters_for_hits;
  45. bool force_consistency_checks;
  46. bool disallow_memtable_writes;
  47. Temperature default_temperature;
  48. std::shared_ptr<const SliceTransform>
  49. memtable_insert_with_hint_prefix_extractor;
  50. std::vector<DbPath> cf_paths;
  51. std::shared_ptr<ConcurrentTaskLimiter> compaction_thread_limiter;
  52. std::shared_ptr<SstPartitionerFactory> sst_partitioner_factory;
  53. std::shared_ptr<Cache> blob_cache;
  54. bool persist_user_defined_timestamps;
  55. bool cf_allow_ingest_behind;
  56. };
  57. struct ImmutableOptions : public ImmutableDBOptions, public ImmutableCFOptions {
  58. explicit ImmutableOptions();
  59. explicit ImmutableOptions(const Options& options);
  60. ImmutableOptions(const DBOptions& db_options,
  61. const ColumnFamilyOptions& cf_options);
  62. ImmutableOptions(const ImmutableDBOptions& db_options,
  63. const ImmutableCFOptions& cf_options);
  64. ImmutableOptions(const DBOptions& db_options,
  65. const ImmutableCFOptions& cf_options);
  66. ImmutableOptions(const ImmutableDBOptions& db_options,
  67. const ColumnFamilyOptions& cf_options);
  68. };
  69. struct MutableCFOptions {
  70. static const char* kName() { return "MutableCFOptions"; }
  71. explicit MutableCFOptions(const ColumnFamilyOptions& options)
  72. : write_buffer_size(options.write_buffer_size),
  73. max_write_buffer_number(options.max_write_buffer_number),
  74. arena_block_size(options.arena_block_size),
  75. memtable_prefix_bloom_size_ratio(
  76. options.memtable_prefix_bloom_size_ratio),
  77. memtable_whole_key_filtering(options.memtable_whole_key_filtering),
  78. memtable_huge_page_size(options.memtable_huge_page_size),
  79. max_successive_merges(options.max_successive_merges),
  80. strict_max_successive_merges(options.strict_max_successive_merges),
  81. inplace_update_num_locks(options.inplace_update_num_locks),
  82. prefix_extractor(options.prefix_extractor),
  83. experimental_mempurge_threshold(
  84. options.experimental_mempurge_threshold),
  85. disable_auto_compactions(options.disable_auto_compactions),
  86. table_factory(options.table_factory),
  87. soft_pending_compaction_bytes_limit(
  88. options.soft_pending_compaction_bytes_limit),
  89. hard_pending_compaction_bytes_limit(
  90. options.hard_pending_compaction_bytes_limit),
  91. level0_file_num_compaction_trigger(
  92. options.level0_file_num_compaction_trigger),
  93. level0_slowdown_writes_trigger(options.level0_slowdown_writes_trigger),
  94. level0_stop_writes_trigger(options.level0_stop_writes_trigger),
  95. max_compaction_bytes(options.max_compaction_bytes),
  96. target_file_size_base(options.target_file_size_base),
  97. target_file_size_multiplier(options.target_file_size_multiplier),
  98. max_bytes_for_level_base(options.max_bytes_for_level_base),
  99. max_bytes_for_level_multiplier(options.max_bytes_for_level_multiplier),
  100. ttl(options.ttl),
  101. periodic_compaction_seconds(options.periodic_compaction_seconds),
  102. max_bytes_for_level_multiplier_additional(
  103. options.max_bytes_for_level_multiplier_additional),
  104. compaction_options_fifo(options.compaction_options_fifo),
  105. compaction_options_universal(options.compaction_options_universal),
  106. preclude_last_level_data_seconds(
  107. options.preclude_last_level_data_seconds),
  108. preserve_internal_time_seconds(options.preserve_internal_time_seconds),
  109. enable_blob_files(options.enable_blob_files),
  110. min_blob_size(options.min_blob_size),
  111. blob_file_size(options.blob_file_size),
  112. blob_compression_type(options.blob_compression_type),
  113. enable_blob_garbage_collection(options.enable_blob_garbage_collection),
  114. blob_garbage_collection_age_cutoff(
  115. options.blob_garbage_collection_age_cutoff),
  116. blob_garbage_collection_force_threshold(
  117. options.blob_garbage_collection_force_threshold),
  118. blob_compaction_readahead_size(options.blob_compaction_readahead_size),
  119. blob_file_starting_level(options.blob_file_starting_level),
  120. prepopulate_blob_cache(options.prepopulate_blob_cache),
  121. max_sequential_skip_in_iterations(
  122. options.max_sequential_skip_in_iterations),
  123. paranoid_file_checks(options.paranoid_file_checks),
  124. report_bg_io_stats(options.report_bg_io_stats),
  125. compression(options.compression),
  126. bottommost_compression(options.bottommost_compression),
  127. compression_opts(options.compression_opts),
  128. bottommost_compression_opts(options.bottommost_compression_opts),
  129. compression_manager(options.compression_manager),
  130. last_level_temperature(options.last_level_temperature),
  131. default_write_temperature(options.default_write_temperature),
  132. memtable_protection_bytes_per_key(
  133. options.memtable_protection_bytes_per_key),
  134. block_protection_bytes_per_key(options.block_protection_bytes_per_key),
  135. paranoid_memory_checks(options.paranoid_memory_checks),
  136. memtable_veirfy_per_key_checksum_on_seek(
  137. options.memtable_veirfy_per_key_checksum_on_seek),
  138. sample_for_compression(
  139. options.sample_for_compression), // TODO: is 0 fine here?
  140. compression_per_level(options.compression_per_level),
  141. memtable_max_range_deletions(options.memtable_max_range_deletions),
  142. bottommost_file_compaction_delay(
  143. options.bottommost_file_compaction_delay),
  144. uncache_aggressiveness(options.uncache_aggressiveness),
  145. memtable_op_scan_flush_trigger(options.memtable_op_scan_flush_trigger),
  146. memtable_avg_op_scan_flush_trigger(
  147. options.memtable_avg_op_scan_flush_trigger) {
  148. RefreshDerivedOptions(options.num_levels, options.compaction_style);
  149. }
  150. MutableCFOptions()
  151. : write_buffer_size(0),
  152. max_write_buffer_number(0),
  153. arena_block_size(0),
  154. memtable_prefix_bloom_size_ratio(0),
  155. memtable_whole_key_filtering(false),
  156. memtable_huge_page_size(0),
  157. max_successive_merges(0),
  158. strict_max_successive_merges(false),
  159. inplace_update_num_locks(0),
  160. prefix_extractor(nullptr),
  161. experimental_mempurge_threshold(0.0),
  162. disable_auto_compactions(false),
  163. soft_pending_compaction_bytes_limit(0),
  164. hard_pending_compaction_bytes_limit(0),
  165. level0_file_num_compaction_trigger(0),
  166. level0_slowdown_writes_trigger(0),
  167. level0_stop_writes_trigger(0),
  168. max_compaction_bytes(0),
  169. target_file_size_base(0),
  170. target_file_size_multiplier(0),
  171. max_bytes_for_level_base(0),
  172. max_bytes_for_level_multiplier(0),
  173. ttl(0),
  174. periodic_compaction_seconds(0),
  175. compaction_options_fifo(),
  176. preclude_last_level_data_seconds(0),
  177. preserve_internal_time_seconds(0),
  178. enable_blob_files(false),
  179. min_blob_size(0),
  180. blob_file_size(0),
  181. blob_compression_type(kNoCompression),
  182. enable_blob_garbage_collection(false),
  183. blob_garbage_collection_age_cutoff(0.0),
  184. blob_garbage_collection_force_threshold(0.0),
  185. blob_compaction_readahead_size(0),
  186. blob_file_starting_level(0),
  187. prepopulate_blob_cache(PrepopulateBlobCache::kDisable),
  188. max_sequential_skip_in_iterations(0),
  189. paranoid_file_checks(false),
  190. report_bg_io_stats(false),
  191. compression(Snappy_Supported() ? kSnappyCompression : kNoCompression),
  192. bottommost_compression(kDisableCompressionOption),
  193. last_level_temperature(Temperature::kUnknown),
  194. default_write_temperature(Temperature::kUnknown),
  195. memtable_protection_bytes_per_key(0),
  196. block_protection_bytes_per_key(0),
  197. paranoid_memory_checks(false),
  198. memtable_veirfy_per_key_checksum_on_seek(false),
  199. sample_for_compression(0),
  200. memtable_max_range_deletions(0),
  201. bottommost_file_compaction_delay(0),
  202. uncache_aggressiveness(0),
  203. memtable_op_scan_flush_trigger(0),
  204. memtable_avg_op_scan_flush_trigger(0) {}
  205. explicit MutableCFOptions(const Options& options);
  206. // Must be called after any change to MutableCFOptions
  207. void RefreshDerivedOptions(int num_levels, CompactionStyle compaction_style);
  208. void RefreshDerivedOptions(const ImmutableCFOptions& ioptions) {
  209. RefreshDerivedOptions(ioptions.num_levels, ioptions.compaction_style);
  210. }
  211. int MaxBytesMultiplerAdditional(int level) const {
  212. if (level >=
  213. static_cast<int>(max_bytes_for_level_multiplier_additional.size())) {
  214. return 1;
  215. }
  216. return max_bytes_for_level_multiplier_additional[level];
  217. }
  218. void Dump(Logger* log) const;
  219. bool operator==(const MutableCFOptions& rhs) const = default;
  220. // Memtable related options
  221. size_t write_buffer_size;
  222. int max_write_buffer_number;
  223. size_t arena_block_size;
  224. double memtable_prefix_bloom_size_ratio;
  225. bool memtable_whole_key_filtering;
  226. size_t memtable_huge_page_size;
  227. size_t max_successive_merges;
  228. bool strict_max_successive_merges;
  229. size_t inplace_update_num_locks;
  230. // NOTE: if too many shared_ptr make their way into MutableCFOptions, the
  231. // copy performance might suffer enough to warrant aggregating them in an
  232. // immutable+copy-on-write sub-object managed through a single shared_ptr.
  233. std::shared_ptr<const SliceTransform> prefix_extractor;
  234. // [experimental]
  235. // Used to activate or deactive the Mempurge feature (memtable garbage
  236. // collection). (deactivated by default). At every flush, the total useful
  237. // payload (total entries minus garbage entries) is estimated as a ratio
  238. // [useful payload bytes]/[size of a memtable (in bytes)]. This ratio is then
  239. // compared to this `threshold` value:
  240. // - if ratio<threshold: the flush is replaced by a mempurge operation
  241. // - else: a regular flush operation takes place.
  242. // Threshold values:
  243. // 0.0: mempurge deactivated (default).
  244. // 1.0: recommended threshold value.
  245. // >1.0 : aggressive mempurge.
  246. // 0 < threshold < 1.0: mempurge triggered only for very low useful payload
  247. // ratios.
  248. // [experimental]
  249. double experimental_mempurge_threshold;
  250. // Compaction related options
  251. bool disable_auto_compactions;
  252. std::shared_ptr<TableFactory> table_factory;
  253. uint64_t soft_pending_compaction_bytes_limit;
  254. uint64_t hard_pending_compaction_bytes_limit;
  255. int level0_file_num_compaction_trigger;
  256. int level0_slowdown_writes_trigger;
  257. int level0_stop_writes_trigger;
  258. uint64_t max_compaction_bytes;
  259. uint64_t target_file_size_base;
  260. int target_file_size_multiplier;
  261. uint64_t max_bytes_for_level_base;
  262. double max_bytes_for_level_multiplier;
  263. uint64_t ttl;
  264. uint64_t periodic_compaction_seconds;
  265. std::vector<int> max_bytes_for_level_multiplier_additional;
  266. CompactionOptionsFIFO compaction_options_fifo;
  267. CompactionOptionsUniversal compaction_options_universal;
  268. uint64_t preclude_last_level_data_seconds;
  269. uint64_t preserve_internal_time_seconds;
  270. // Blob file related options
  271. bool enable_blob_files;
  272. uint64_t min_blob_size;
  273. uint64_t blob_file_size;
  274. CompressionType blob_compression_type;
  275. bool enable_blob_garbage_collection;
  276. double blob_garbage_collection_age_cutoff;
  277. double blob_garbage_collection_force_threshold;
  278. uint64_t blob_compaction_readahead_size;
  279. int blob_file_starting_level;
  280. PrepopulateBlobCache prepopulate_blob_cache;
  281. // Misc options
  282. uint64_t max_sequential_skip_in_iterations;
  283. bool paranoid_file_checks;
  284. bool report_bg_io_stats;
  285. CompressionType compression;
  286. CompressionType bottommost_compression;
  287. CompressionOptions compression_opts;
  288. CompressionOptions bottommost_compression_opts;
  289. std::shared_ptr<CompressionManager> compression_manager;
  290. Temperature last_level_temperature;
  291. Temperature default_write_temperature;
  292. uint32_t memtable_protection_bytes_per_key;
  293. uint8_t block_protection_bytes_per_key;
  294. bool paranoid_memory_checks;
  295. bool memtable_veirfy_per_key_checksum_on_seek;
  296. uint64_t sample_for_compression;
  297. std::vector<CompressionType> compression_per_level;
  298. uint32_t memtable_max_range_deletions;
  299. uint32_t bottommost_file_compaction_delay;
  300. uint32_t uncache_aggressiveness;
  301. uint32_t memtable_op_scan_flush_trigger;
  302. uint32_t memtable_avg_op_scan_flush_trigger;
  303. // Derived options
  304. // Per-level target file size.
  305. std::vector<uint64_t> max_file_size;
  306. };
  307. uint64_t MultiplyCheckOverflow(uint64_t op1, double op2);
  308. // Get the max file size in a given level.
  309. uint64_t MaxFileSizeForLevel(const MutableCFOptions& cf_options, int level,
  310. CompactionStyle compaction_style,
  311. int base_level = 1,
  312. bool level_compaction_dynamic_level_bytes = false);
  313. // Get the max size of an L0 file for which we will pin its meta-blocks when
  314. // `pin_l0_filter_and_index_blocks_in_cache` is set.
  315. size_t MaxFileSizeForL0MetaPin(const MutableCFOptions& cf_options);
  316. Status GetStringFromMutableCFOptions(const ConfigOptions& config_options,
  317. const MutableCFOptions& mutable_opts,
  318. std::string* opt_string);
  319. Status GetMutableOptionsFromStrings(
  320. const MutableCFOptions& base_options,
  321. const std::unordered_map<std::string, std::string>& options_map,
  322. Logger* info_log, MutableCFOptions* new_options);
  323. #ifndef NDEBUG
  324. std::vector<std::string> TEST_GetImmutableInMutableCFOptions();
  325. extern bool TEST_allowSetOptionsImmutableInMutable;
  326. #endif
  327. } // namespace ROCKSDB_NAMESPACE