Coverage Report

Created: 2025-10-26 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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