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