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