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 #pragma once 7 8 #include <string> 9 #include <vector> 10 11 #include "db/dbformat.h" 12 #include "options/db_options.h" 13 #include "rocksdb/options.h" 14 #include "util/compression.h" 15 16 namespace ROCKSDB_NAMESPACE { 17 18 // ImmutableCFOptions is a data struct used by RocksDB internal. It contains a 19 // subset of Options that should not be changed during the entire lifetime 20 // of DB. Raw pointers defined in this struct do not have ownership to the data 21 // they point to. Options contains std::shared_ptr to these data. 22 struct ImmutableCFOptions { 23 explicit ImmutableCFOptions(const Options& options); 24 25 ImmutableCFOptions(const ImmutableDBOptions& db_options, 26 const ColumnFamilyOptions& cf_options); 27 28 CompactionStyle compaction_style; 29 30 CompactionPri compaction_pri; 31 32 const Comparator* user_comparator; 33 InternalKeyComparator internal_comparator; 34 35 MergeOperator* merge_operator; 36 37 const CompactionFilter* compaction_filter; 38 39 CompactionFilterFactory* compaction_filter_factory; 40 41 int min_write_buffer_number_to_merge; 42 43 int max_write_buffer_number_to_maintain; 44 45 int64_t max_write_buffer_size_to_maintain; 46 47 bool inplace_update_support; 48 49 UpdateStatus (*inplace_callback)(char* existing_value, 50 uint32_t* existing_value_size, 51 Slice delta_value, 52 std::string* merged_value); 53 54 Logger* info_log; 55 56 Statistics* statistics; 57 58 RateLimiter* rate_limiter; 59 60 InfoLogLevel info_log_level; 61 62 Env* env; 63 64 FileSystem* fs; 65 66 // Allow the OS to mmap file for reading sst tables. Default: false 67 bool allow_mmap_reads; 68 69 // Allow the OS to mmap file for writing. Default: false 70 bool allow_mmap_writes; 71 72 std::vector<DbPath> db_paths; 73 74 MemTableRepFactory* memtable_factory; 75 76 TableFactory* table_factory; 77 78 Options::TablePropertiesCollectorFactories 79 table_properties_collector_factories; 80 81 bool advise_random_on_open; 82 83 // This options is required by PlainTableReader. May need to move it 84 // to PlainTableOptions just like bloom_bits_per_key 85 uint32_t bloom_locality; 86 87 bool purge_redundant_kvs_while_flush; 88 89 bool use_fsync; 90 91 std::vector<CompressionType> compression_per_level; 92 93 CompressionType bottommost_compression; 94 95 CompressionOptions bottommost_compression_opts; 96 97 CompressionOptions compression_opts; 98 99 bool level_compaction_dynamic_level_bytes; 100 101 Options::AccessHint access_hint_on_compaction_start; 102 103 bool new_table_reader_for_compaction_inputs; 104 105 int num_levels; 106 107 bool optimize_filters_for_hits; 108 109 bool force_consistency_checks; 110 111 bool allow_ingest_behind; 112 113 bool preserve_deletes; 114 115 // A vector of EventListeners which callback functions will be called 116 // when specific RocksDB event happens. 117 std::vector<std::shared_ptr<EventListener>> listeners; 118 119 std::shared_ptr<Cache> row_cache; 120 121 uint32_t max_subcompactions; 122 123 const SliceTransform* memtable_insert_with_hint_prefix_extractor; 124 125 std::vector<DbPath> cf_paths; 126 127 std::shared_ptr<ConcurrentTaskLimiter> compaction_thread_limiter; 128 129 FileChecksumFunc* sst_file_checksum_func; 130 }; 131 132 struct MutableCFOptions { MutableCFOptionsMutableCFOptions133 explicit MutableCFOptions(const ColumnFamilyOptions& options) 134 : write_buffer_size(options.write_buffer_size), 135 max_write_buffer_number(options.max_write_buffer_number), 136 arena_block_size(options.arena_block_size), 137 memtable_prefix_bloom_size_ratio( 138 options.memtable_prefix_bloom_size_ratio), 139 memtable_whole_key_filtering(options.memtable_whole_key_filtering), 140 memtable_huge_page_size(options.memtable_huge_page_size), 141 max_successive_merges(options.max_successive_merges), 142 inplace_update_num_locks(options.inplace_update_num_locks), 143 prefix_extractor(options.prefix_extractor), 144 disable_auto_compactions(options.disable_auto_compactions), 145 soft_pending_compaction_bytes_limit( 146 options.soft_pending_compaction_bytes_limit), 147 hard_pending_compaction_bytes_limit( 148 options.hard_pending_compaction_bytes_limit), 149 level0_file_num_compaction_trigger( 150 options.level0_file_num_compaction_trigger), 151 level0_slowdown_writes_trigger(options.level0_slowdown_writes_trigger), 152 level0_stop_writes_trigger(options.level0_stop_writes_trigger), 153 max_compaction_bytes(options.max_compaction_bytes), 154 target_file_size_base(options.target_file_size_base), 155 target_file_size_multiplier(options.target_file_size_multiplier), 156 max_bytes_for_level_base(options.max_bytes_for_level_base), 157 max_bytes_for_level_multiplier(options.max_bytes_for_level_multiplier), 158 ttl(options.ttl), 159 periodic_compaction_seconds(options.periodic_compaction_seconds), 160 max_bytes_for_level_multiplier_additional( 161 options.max_bytes_for_level_multiplier_additional), 162 compaction_options_fifo(options.compaction_options_fifo), 163 compaction_options_universal(options.compaction_options_universal), 164 max_sequential_skip_in_iterations( 165 options.max_sequential_skip_in_iterations), 166 paranoid_file_checks(options.paranoid_file_checks), 167 report_bg_io_stats(options.report_bg_io_stats), 168 compression(options.compression), 169 sample_for_compression(options.sample_for_compression) { 170 RefreshDerivedOptions(options.num_levels, options.compaction_style); 171 } 172 MutableCFOptionsMutableCFOptions173 MutableCFOptions() 174 : write_buffer_size(0), 175 max_write_buffer_number(0), 176 arena_block_size(0), 177 memtable_prefix_bloom_size_ratio(0), 178 memtable_whole_key_filtering(false), 179 memtable_huge_page_size(0), 180 max_successive_merges(0), 181 inplace_update_num_locks(0), 182 prefix_extractor(nullptr), 183 disable_auto_compactions(false), 184 soft_pending_compaction_bytes_limit(0), 185 hard_pending_compaction_bytes_limit(0), 186 level0_file_num_compaction_trigger(0), 187 level0_slowdown_writes_trigger(0), 188 level0_stop_writes_trigger(0), 189 max_compaction_bytes(0), 190 target_file_size_base(0), 191 target_file_size_multiplier(0), 192 max_bytes_for_level_base(0), 193 max_bytes_for_level_multiplier(0), 194 ttl(0), 195 periodic_compaction_seconds(0), 196 compaction_options_fifo(), 197 max_sequential_skip_in_iterations(0), 198 paranoid_file_checks(false), 199 report_bg_io_stats(false), 200 compression(Snappy_Supported() ? kSnappyCompression : kNoCompression), 201 sample_for_compression(0) {} 202 203 explicit MutableCFOptions(const Options& options); 204 205 // Must be called after any change to MutableCFOptions 206 void RefreshDerivedOptions(int num_levels, CompactionStyle compaction_style); 207 RefreshDerivedOptionsMutableCFOptions208 void RefreshDerivedOptions(const ImmutableCFOptions& ioptions) { 209 RefreshDerivedOptions(ioptions.num_levels, ioptions.compaction_style); 210 } 211 MaxBytesMultiplerAdditionalMutableCFOptions212 int MaxBytesMultiplerAdditional(int level) const { 213 if (level >= 214 static_cast<int>(max_bytes_for_level_multiplier_additional.size())) { 215 return 1; 216 } 217 return max_bytes_for_level_multiplier_additional[level]; 218 } 219 220 void Dump(Logger* log) const; 221 222 // Memtable related options 223 size_t write_buffer_size; 224 int max_write_buffer_number; 225 size_t arena_block_size; 226 double memtable_prefix_bloom_size_ratio; 227 bool memtable_whole_key_filtering; 228 size_t memtable_huge_page_size; 229 size_t max_successive_merges; 230 size_t inplace_update_num_locks; 231 std::shared_ptr<const SliceTransform> prefix_extractor; 232 233 // Compaction related options 234 bool disable_auto_compactions; 235 uint64_t soft_pending_compaction_bytes_limit; 236 uint64_t hard_pending_compaction_bytes_limit; 237 int level0_file_num_compaction_trigger; 238 int level0_slowdown_writes_trigger; 239 int level0_stop_writes_trigger; 240 uint64_t max_compaction_bytes; 241 uint64_t target_file_size_base; 242 int target_file_size_multiplier; 243 uint64_t max_bytes_for_level_base; 244 double max_bytes_for_level_multiplier; 245 uint64_t ttl; 246 uint64_t periodic_compaction_seconds; 247 std::vector<int> max_bytes_for_level_multiplier_additional; 248 CompactionOptionsFIFO compaction_options_fifo; 249 CompactionOptionsUniversal compaction_options_universal; 250 251 // Misc options 252 uint64_t max_sequential_skip_in_iterations; 253 bool paranoid_file_checks; 254 bool report_bg_io_stats; 255 CompressionType compression; 256 uint64_t sample_for_compression; 257 258 // Derived options 259 // Per-level target file size. 260 std::vector<uint64_t> max_file_size; 261 }; 262 263 uint64_t MultiplyCheckOverflow(uint64_t op1, double op2); 264 265 // Get the max file size in a given level. 266 uint64_t MaxFileSizeForLevel(const MutableCFOptions& cf_options, 267 int level, CompactionStyle compaction_style, int base_level = 1, 268 bool level_compaction_dynamic_level_bytes = false); 269 } // namespace ROCKSDB_NAMESPACE 270