options.cc 33.1 KB
Newer Older
1 2 3 4 5
//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under the BSD-style license found in the
//  LICENSE file in the root directory of this source tree. An additional grant
//  of patent rights can be found in the PATENTS file in the same directory.
//
J
jorlow@chromium.org 已提交
6 7 8 9
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

10
#include "rocksdb/options.h"
L
Lei Jin 已提交
11
#include "rocksdb/immutable_options.h"
J
jorlow@chromium.org 已提交
12

L
liuhuahang 已提交
13
#ifndef __STDC_FORMAT_MACROS
I
Igor Canadi 已提交
14
#define __STDC_FORMAT_MACROS
L
liuhuahang 已提交
15 16
#endif

I
Igor Canadi 已提交
17
#include <inttypes.h>
A
Abhishek Kona 已提交
18 19
#include <limits>

20
#include "db/writebuffer.h"
21 22 23
#include "rocksdb/cache.h"
#include "rocksdb/compaction_filter.h"
#include "rocksdb/comparator.h"
I
Islam AbdelRahman 已提交
24
#include "rocksdb/delete_scheduler.h"
25
#include "rocksdb/env.h"
26
#include "rocksdb/memtablerep.h"
K
kailiu 已提交
27
#include "rocksdb/merge_operator.h"
28 29
#include "rocksdb/slice.h"
#include "rocksdb/slice_transform.h"
K
kailiu 已提交
30
#include "rocksdb/table.h"
31
#include "rocksdb/table_properties.h"
32
#include "rocksdb/wal_filter.h"
S
Siying Dong 已提交
33
#include "table/block_based_table_factory.h"
I
Igor Canadi 已提交
34
#include "util/compression.h"
L
Lei Jin 已提交
35
#include "util/statistics.h"
V
Venkatesh Radhakrishnan 已提交
36
#include "util/xfunc.h"
J
jorlow@chromium.org 已提交
37

38
namespace rocksdb {
J
jorlow@chromium.org 已提交
39

L
Lei Jin 已提交
40
ImmutableCFOptions::ImmutableCFOptions(const Options& options)
41 42 43 44 45 46 47 48 49 50 51 52 53
    : compaction_style(options.compaction_style),
      compaction_options_universal(options.compaction_options_universal),
      compaction_options_fifo(options.compaction_options_fifo),
      prefix_extractor(options.prefix_extractor.get()),
      comparator(options.comparator),
      merge_operator(options.merge_operator.get()),
      compaction_filter(options.compaction_filter),
      compaction_filter_factory(options.compaction_filter_factory.get()),
      inplace_update_support(options.inplace_update_support),
      inplace_callback(options.inplace_callback),
      info_log(options.info_log.get()),
      statistics(options.statistics.get()),
      env(options.env),
54
      delayed_write_rate(options.delayed_write_rate),
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
      allow_mmap_reads(options.allow_mmap_reads),
      allow_mmap_writes(options.allow_mmap_writes),
      db_paths(options.db_paths),
      memtable_factory(options.memtable_factory.get()),
      table_factory(options.table_factory.get()),
      table_properties_collector_factories(
          options.table_properties_collector_factories),
      advise_random_on_open(options.advise_random_on_open),
      bloom_locality(options.bloom_locality),
      purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush),
      min_partial_merge_operands(options.min_partial_merge_operands),
      disable_data_sync(options.disableDataSync),
      use_fsync(options.use_fsync),
      compression(options.compression),
      compression_per_level(options.compression_per_level),
      compression_opts(options.compression_opts),
      level_compaction_dynamic_level_bytes(
          options.level_compaction_dynamic_level_bytes),
      access_hint_on_compaction_start(options.access_hint_on_compaction_start),
74 75
      new_table_reader_for_compaction_inputs(
          options.new_table_reader_for_compaction_inputs),
76
      compaction_readahead_size(options.compaction_readahead_size),
77
      num_levels(options.num_levels),
78
      optimize_filters_for_hits(options.optimize_filters_for_hits),
79 80
      listeners(options.listeners),
      row_cache(options.row_cache) {}
L
Lei Jin 已提交
81

82
ColumnFamilyOptions::ColumnFamilyOptions()
J
jorlow@chromium.org 已提交
83
    : comparator(BytewiseComparator()),
84
      merge_operator(nullptr),
85
      compaction_filter(nullptr),
86
      compaction_filter_factory(nullptr),
87
      write_buffer_size(4 << 20),
88
      max_write_buffer_number(2),
89
      min_write_buffer_number_to_merge(1),
90
      max_write_buffer_number_to_maintain(0),
91
      compression(Snappy_Supported() ? kSnappyCompression : kNoCompression),
T
Tyler Harter 已提交
92
      prefix_extractor(nullptr),
93 94
      num_levels(7),
      level0_file_num_compaction_trigger(4),
S
sdong 已提交
95 96
      level0_slowdown_writes_trigger(20),
      level0_stop_writes_trigger(24),
97
      target_file_size_base(2 * 1048576),
98
      target_file_size_multiplier(1),
H
heyongqiang 已提交
99
      max_bytes_for_level_base(10 * 1048576),
100
      level_compaction_dynamic_level_bytes(false),
101
      max_bytes_for_level_multiplier(10),
102
      max_bytes_for_level_multiplier_additional(num_levels, 1),
103
      expanded_compaction_factor(25),
104
      source_compaction_factor(1),
105
      max_grandparent_overlap_factor(10),
106
      soft_rate_limit(0.0),
I
Islam AbdelRahman 已提交
107
      hard_rate_limit(0.0),
108
      soft_pending_compaction_bytes_limit(0),
109
      hard_pending_compaction_bytes_limit(0),
110
      rate_limit_delay_max_milliseconds(1000),
111
      arena_block_size(0),
112 113 114
      disable_auto_compactions(false),
      purge_redundant_kvs_while_flush(true),
      compaction_style(kCompactionStyleLevel),
115
      compaction_pri(kByCompensatedSize),
116
      verify_checksums_in_compaction(true),
117 118 119 120
      filter_deletes(false),
      max_sequential_skip_in_iterations(8),
      memtable_factory(std::shared_ptr<SkipListFactory>(new SkipListFactory)),
      table_factory(
121
          std::shared_ptr<TableFactory>(new BlockBasedTableFactory())),
122
      inplace_update_support(false),
I
Igor Canadi 已提交
123
      inplace_update_num_locks(10000),
124 125 126
      inplace_callback(nullptr),
      memtable_prefix_bloom_bits(0),
      memtable_prefix_bloom_probes(6),
127
      memtable_prefix_bloom_huge_page_tlb_size(0),
I
Igor Canadi 已提交
128
      bloom_locality(0),
129
      max_successive_merges(0),
130
      min_partial_merge_operands(2),
131
      optimize_filters_for_hits(false),
132 133
      paranoid_file_checks(false),
      compaction_measure_io_stats(false) {
134 135 136
  assert(memtable_factory.get() != nullptr);
}

137 138 139 140 141 142 143 144 145
ColumnFamilyOptions::ColumnFamilyOptions(const Options& options)
    : comparator(options.comparator),
      merge_operator(options.merge_operator),
      compaction_filter(options.compaction_filter),
      compaction_filter_factory(options.compaction_filter_factory),
      write_buffer_size(options.write_buffer_size),
      max_write_buffer_number(options.max_write_buffer_number),
      min_write_buffer_number_to_merge(
          options.min_write_buffer_number_to_merge),
146 147
      max_write_buffer_number_to_maintain(
          options.max_write_buffer_number_to_maintain),
148 149 150 151 152 153 154 155 156 157 158 159
      compression(options.compression),
      compression_per_level(options.compression_per_level),
      compression_opts(options.compression_opts),
      prefix_extractor(options.prefix_extractor),
      num_levels(options.num_levels),
      level0_file_num_compaction_trigger(
          options.level0_file_num_compaction_trigger),
      level0_slowdown_writes_trigger(options.level0_slowdown_writes_trigger),
      level0_stop_writes_trigger(options.level0_stop_writes_trigger),
      target_file_size_base(options.target_file_size_base),
      target_file_size_multiplier(options.target_file_size_multiplier),
      max_bytes_for_level_base(options.max_bytes_for_level_base),
160 161
      level_compaction_dynamic_level_bytes(
          options.level_compaction_dynamic_level_bytes),
162 163 164 165 166 167 168
      max_bytes_for_level_multiplier(options.max_bytes_for_level_multiplier),
      max_bytes_for_level_multiplier_additional(
          options.max_bytes_for_level_multiplier_additional),
      expanded_compaction_factor(options.expanded_compaction_factor),
      source_compaction_factor(options.source_compaction_factor),
      max_grandparent_overlap_factor(options.max_grandparent_overlap_factor),
      soft_rate_limit(options.soft_rate_limit),
169 170
      soft_pending_compaction_bytes_limit(
          options.soft_pending_compaction_bytes_limit),
171 172
      hard_pending_compaction_bytes_limit(
          options.hard_pending_compaction_bytes_limit),
173 174
      rate_limit_delay_max_milliseconds(
          options.rate_limit_delay_max_milliseconds),
175
      arena_block_size(options.arena_block_size),
176 177 178
      disable_auto_compactions(options.disable_auto_compactions),
      purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush),
      compaction_style(options.compaction_style),
179
      compaction_pri(options.compaction_pri),
180
      verify_checksums_in_compaction(options.verify_checksums_in_compaction),
181
      compaction_options_universal(options.compaction_options_universal),
I
Igor Canadi 已提交
182
      compaction_options_fifo(options.compaction_options_fifo),
183 184 185 186 187
      filter_deletes(options.filter_deletes),
      max_sequential_skip_in_iterations(
          options.max_sequential_skip_in_iterations),
      memtable_factory(options.memtable_factory),
      table_factory(options.table_factory),
I
Igor Canadi 已提交
188 189
      table_properties_collector_factories(
          options.table_properties_collector_factories),
190
      inplace_update_support(options.inplace_update_support),
191
      inplace_update_num_locks(options.inplace_update_num_locks),
192 193 194
      inplace_callback(options.inplace_callback),
      memtable_prefix_bloom_bits(options.memtable_prefix_bloom_bits),
      memtable_prefix_bloom_probes(options.memtable_prefix_bloom_probes),
195 196
      memtable_prefix_bloom_huge_page_tlb_size(
          options.memtable_prefix_bloom_huge_page_tlb_size),
I
Igor Canadi 已提交
197
      bloom_locality(options.bloom_locality),
198
      max_successive_merges(options.max_successive_merges),
199
      min_partial_merge_operands(options.min_partial_merge_operands),
200
      optimize_filters_for_hits(options.optimize_filters_for_hits),
201 202
      paranoid_file_checks(options.paranoid_file_checks),
      compaction_measure_io_stats(options.compaction_measure_io_stats) {
203
  assert(memtable_factory.get() != nullptr);
204 205
  if (max_bytes_for_level_multiplier_additional.size() <
      static_cast<unsigned int>(num_levels)) {
206 207
    max_bytes_for_level_multiplier_additional.resize(num_levels, 1);
  }
208 209
}

210 211
DBOptions::DBOptions()
    : create_if_missing(false),
I
Igor Canadi 已提交
212
      create_missing_column_families(false),
213
      error_if_exists(false),
214
      paranoid_checks(true),
215
      env(Env::Default()),
L
Lei Jin 已提交
216
      rate_limiter(nullptr),
I
Islam AbdelRahman 已提交
217
      delete_scheduler(nullptr),
218
      info_log(nullptr),
I
Igor Canadi 已提交
219
#ifdef NDEBUG
220
      info_log_level(INFO_LEVEL),
I
Igor Canadi 已提交
221 222 223
#else
      info_log_level(DEBUG_LEVEL),
#endif  // NDEBUG
224
      max_open_files(5000),
225
      max_file_opening_threads(1),
I
Igor Canadi 已提交
226
      max_total_wal_size(0),
227
      statistics(nullptr),
228
      disableDataSync(false),
229
      use_fsync(false),
230
      db_log_dir(""),
231
      wal_dir(""),
232
      delete_obsolete_files_period_micros(6ULL * 60 * 60 * 1000000),
233
      max_background_compactions(1),
234
      max_subcompactions(1),
235
      max_background_flushes(1),
236
      max_log_file_size(0),
K
Kai Liu 已提交
237 238
      log_file_time_to_roll(0),
      keep_log_file_num(1000),
239
      recycle_log_file_num(0),
A
Abhishek Kona 已提交
240
      max_manifest_file_size(std::numeric_limits<uint64_t>::max()),
241
      table_cache_numshardbits(4),
242
      WAL_ttl_seconds(0),
243
      WAL_size_limit_MB(0),
244
      manifest_preallocation_size(4 * 1024 * 1024),
245 246
      allow_os_buffer(true),
      allow_mmap_reads(false),
S
sdong 已提交
247
      allow_mmap_writes(false),
248
      allow_fallocate(true),
249
      is_fd_close_on_exec(true),
250
      skip_log_error_on_recovery(false),
251
      stats_dump_period_sec(600),
252
      advise_random_on_open(true),
253
      db_write_buffer_size(0),
H
Haobo Xu 已提交
254
      access_hint_on_compaction_start(NORMAL),
255
      new_table_reader_for_compaction_inputs(false),
256
      compaction_readahead_size(0),
257
      random_access_max_buffer_size(1024 * 1024),
258
      writable_file_max_buffer_size(1024 * 1024),
H
Haobo Xu 已提交
259
      use_adaptive_mutex(false),
260
      bytes_per_sync(0),
261
      wal_bytes_per_sync(0),
262
      listeners(),
S
sdong 已提交
263
      enable_thread_tracking(false),
S
sdong 已提交
264
      delayed_write_rate(2 * 1024U * 1024U),
265 266 267 268
      allow_concurrent_memtable_write(false),
      enable_write_thread_adaptive_yield(false),
      write_thread_max_yield_usec(100),
      write_thread_slow_yield_usec(3),
269
      skip_stats_update_on_db_open(false),
270
      wal_recovery_mode(WALRecoveryMode::kTolerateCorruptedTailRecords),
S
sdong 已提交
271
      row_cache(nullptr),
272
#ifndef ROCKSDB_LITE
273
      wal_filter(nullptr),
S
sdong 已提交
274
#endif  // ROCKSDB_LITE
275
      fail_if_options_file_error(false) {
276
}
J
jorlow@chromium.org 已提交
277

278 279
DBOptions::DBOptions(const Options& options)
    : create_if_missing(options.create_if_missing),
I
Igor Canadi 已提交
280
      create_missing_column_families(options.create_missing_column_families),
281 282 283
      error_if_exists(options.error_if_exists),
      paranoid_checks(options.paranoid_checks),
      env(options.env),
L
Lei Jin 已提交
284
      rate_limiter(options.rate_limiter),
I
Islam AbdelRahman 已提交
285
      delete_scheduler(options.delete_scheduler),
286
      info_log(options.info_log),
287
      info_log_level(options.info_log_level),
288
      max_open_files(options.max_open_files),
289
      max_file_opening_threads(options.max_file_opening_threads),
I
Igor Canadi 已提交
290
      max_total_wal_size(options.max_total_wal_size),
291
      statistics(options.statistics),
292 293
      disableDataSync(options.disableDataSync),
      use_fsync(options.use_fsync),
294
      db_paths(options.db_paths),
295 296 297 298 299
      db_log_dir(options.db_log_dir),
      wal_dir(options.wal_dir),
      delete_obsolete_files_period_micros(
          options.delete_obsolete_files_period_micros),
      max_background_compactions(options.max_background_compactions),
300
      max_subcompactions(options.max_subcompactions),
301 302 303 304
      max_background_flushes(options.max_background_flushes),
      max_log_file_size(options.max_log_file_size),
      log_file_time_to_roll(options.log_file_time_to_roll),
      keep_log_file_num(options.keep_log_file_num),
305
      recycle_log_file_num(options.recycle_log_file_num),
306
      max_manifest_file_size(options.max_manifest_file_size),
307
      table_cache_numshardbits(options.table_cache_numshardbits),
308 309 310 311 312 313
      WAL_ttl_seconds(options.WAL_ttl_seconds),
      WAL_size_limit_MB(options.WAL_size_limit_MB),
      manifest_preallocation_size(options.manifest_preallocation_size),
      allow_os_buffer(options.allow_os_buffer),
      allow_mmap_reads(options.allow_mmap_reads),
      allow_mmap_writes(options.allow_mmap_writes),
314
      allow_fallocate(options.allow_fallocate),
315 316 317 318
      is_fd_close_on_exec(options.is_fd_close_on_exec),
      skip_log_error_on_recovery(options.skip_log_error_on_recovery),
      stats_dump_period_sec(options.stats_dump_period_sec),
      advise_random_on_open(options.advise_random_on_open),
319
      db_write_buffer_size(options.db_write_buffer_size),
320
      access_hint_on_compaction_start(options.access_hint_on_compaction_start),
321 322
      new_table_reader_for_compaction_inputs(
          options.new_table_reader_for_compaction_inputs),
323
      compaction_readahead_size(options.compaction_readahead_size),
324
      random_access_max_buffer_size(options.random_access_max_buffer_size),
325
      writable_file_max_buffer_size(options.writable_file_max_buffer_size),
326
      use_adaptive_mutex(options.use_adaptive_mutex),
327
      bytes_per_sync(options.bytes_per_sync),
328
      wal_bytes_per_sync(options.wal_bytes_per_sync),
329
      listeners(options.listeners),
S
sdong 已提交
330
      enable_thread_tracking(options.enable_thread_tracking),
K
krad 已提交
331
      delayed_write_rate(options.delayed_write_rate),
332 333 334 335 336
      allow_concurrent_memtable_write(options.allow_concurrent_memtable_write),
      enable_write_thread_adaptive_yield(
          options.enable_write_thread_adaptive_yield),
      write_thread_max_yield_usec(options.write_thread_max_yield_usec),
      write_thread_slow_yield_usec(options.write_thread_slow_yield_usec),
337
      skip_stats_update_on_db_open(options.skip_stats_update_on_db_open),
338
      wal_recovery_mode(options.wal_recovery_mode),
339
      row_cache(options.row_cache),
340
#ifndef ROCKSDB_LITE
341
      wal_filter(options.wal_filter),
S
sdong 已提交
342
#endif  // ROCKSDB_LITE
343
      fail_if_options_file_error(options.fail_if_options_file_error) {
344
}
345

346 347 348 349
static const char* const access_hints[] = {
  "NONE", "NORMAL", "SEQUENTIAL", "WILLNEED"
};

350
void DBOptions::Dump(Logger* log) const {
351 352 353 354 355 356 357 358 359 360 361 362 363
    Header(log, "         Options.error_if_exists: %d", error_if_exists);
    Header(log, "       Options.create_if_missing: %d", create_if_missing);
    Header(log, "         Options.paranoid_checks: %d", paranoid_checks);
    Header(log, "                     Options.env: %p", env);
    Header(log, "                Options.info_log: %p", info_log.get());
    Header(log, "          Options.max_open_files: %d", max_open_files);
    Header(log,
        "Options.max_file_opening_threads: %d", max_file_opening_threads);
    Header(log,
        "      Options.max_total_wal_size: %" PRIu64, max_total_wal_size);
    Header(log, "       Options.disableDataSync: %d", disableDataSync);
    Header(log, "             Options.use_fsync: %d", use_fsync);
    Header(log, "     Options.max_log_file_size: %" ROCKSDB_PRIszt,
S
sdong 已提交
364
         max_log_file_size);
365
    Header(log, "Options.max_manifest_file_size: %" PRIu64,
S
sdong 已提交
366
         max_manifest_file_size);
367
    Header(log, "     Options.log_file_time_to_roll: %" ROCKSDB_PRIszt,
S
sdong 已提交
368
         log_file_time_to_roll);
369
    Header(log, "     Options.keep_log_file_num: %" ROCKSDB_PRIszt,
S
sdong 已提交
370
         keep_log_file_num);
371 372
    Header(log, "  Options.recycle_log_file_num: %" ROCKSDB_PRIszt,
           recycle_log_file_num);
373 374
    Header(log, "       Options.allow_os_buffer: %d", allow_os_buffer);
    Header(log, "      Options.allow_mmap_reads: %d", allow_mmap_reads);
375
    Header(log, "      Options.allow_fallocate: %d", allow_fallocate);
376 377
    Header(log, "     Options.allow_mmap_writes: %d", allow_mmap_writes);
    Header(log, "         Options.create_missing_column_families: %d",
I
Igor Canadi 已提交
378
        create_missing_column_families);
379
    Header(log, "                             Options.db_log_dir: %s",
380
        db_log_dir.c_str());
381
    Header(log, "                                Options.wal_dir: %s",
382
        wal_dir.c_str());
383
    Header(log, "               Options.table_cache_numshardbits: %d",
384
        table_cache_numshardbits);
385
    Header(log, "    Options.delete_obsolete_files_period_micros: %" PRIu64,
386
        delete_obsolete_files_period_micros);
387
    Header(log, "             Options.max_background_compactions: %d",
388
        max_background_compactions);
389
    Header(log, "                     Options.max_subcompactions: %" PRIu32,
390
        max_subcompactions);
391
    Header(log, "                 Options.max_background_flushes: %d",
392
        max_background_flushes);
393
    Header(log, "                        Options.WAL_ttl_seconds: %" PRIu64,
394
        WAL_ttl_seconds);
395
    Header(log, "                      Options.WAL_size_limit_MB: %" PRIu64,
396
        WAL_size_limit_MB);
397
    Header(log,
S
sdong 已提交
398 399
         "            Options.manifest_preallocation_size: %" ROCKSDB_PRIszt,
         manifest_preallocation_size);
400
    Header(log, "                         Options.allow_os_buffer: %d",
401
        allow_os_buffer);
402
    Header(log, "                        Options.allow_mmap_reads: %d",
403
        allow_mmap_reads);
404
    Header(log, "                       Options.allow_mmap_writes: %d",
405
        allow_mmap_writes);
406
    Header(log, "                     Options.is_fd_close_on_exec: %d",
407
        is_fd_close_on_exec);
408
    Header(log, "                   Options.stats_dump_period_sec: %u",
409
        stats_dump_period_sec);
410
    Header(log, "                   Options.advise_random_on_open: %d",
411
        advise_random_on_open);
412
    Header(log,
S
sdong 已提交
413 414 415
         "                    Options.db_write_buffer_size: %" ROCKSDB_PRIszt
         "d",
         db_write_buffer_size);
416
    Header(log, "         Options.access_hint_on_compaction_start: %s",
417
        access_hints[access_hint_on_compaction_start]);
418
    Header(log, "  Options.new_table_reader_for_compaction_inputs: %d",
419
         new_table_reader_for_compaction_inputs);
420
    Header(log,
421 422 423
         "               Options.compaction_readahead_size: %" ROCKSDB_PRIszt
         "d",
         compaction_readahead_size);
S
sdong 已提交
424 425
    Header(
        log,
426 427 428
        "               Options.random_access_max_buffer_size: %" ROCKSDB_PRIszt
        "d",
        random_access_max_buffer_size);
429 430 431 432
    Header(log,
         "              Options.writable_file_max_buffer_size: %" ROCKSDB_PRIszt
         "d",
         writable_file_max_buffer_size);
433
    Header(log, "                      Options.use_adaptive_mutex: %d",
434
        use_adaptive_mutex);
435
    Header(log, "                            Options.rate_limiter: %p",
436
        rate_limiter.get());
437
    Header(log, "     Options.delete_scheduler.rate_bytes_per_sec: %" PRIi64,
I
Islam AbdelRahman 已提交
438
         delete_scheduler ? delete_scheduler->GetRateBytesPerSecond() : 0);
439
    Header(log, "                          Options.bytes_per_sync: %" PRIu64,
440
        bytes_per_sync);
441
    Header(log, "                      Options.wal_bytes_per_sync: %" PRIu64,
442
        wal_bytes_per_sync);
443
    Header(log, "                       Options.wal_recovery_mode: %d",
444
        wal_recovery_mode);
445
    Header(log, "                  Options.enable_thread_tracking: %d",
446
        enable_thread_tracking);
447 448 449 450 451 452 453 454
    Header(log, "         Options.allow_concurrent_memtable_write: %d",
           allow_concurrent_memtable_write);
    Header(log, "      Options.enable_write_thread_adaptive_yield: %d",
           enable_write_thread_adaptive_yield);
    Header(log, "             Options.write_thread_max_yield_usec: %" PRIu64,
           write_thread_max_yield_usec);
    Header(log, "            Options.write_thread_slow_yield_usec: %" PRIu64,
           write_thread_slow_yield_usec);
455
    if (row_cache) {
456
      Header(log, "                               Options.row_cache: %" PRIu64,
457 458
           row_cache->GetCapacity());
    } else {
459
      Header(log, "                               Options.row_cache: None");
460
    }
461
#ifndef ROCKSDB_LITE
462
    Header(log, "       Options.wal_filter: %s",
S
sdong 已提交
463 464
           wal_filter ? wal_filter->Name() : "None");
#endif  // ROCKDB_LITE
465 466 467
}  // DBOptions::Dump

void ColumnFamilyOptions::Dump(Logger* log) const {
468 469
  Header(log, "              Options.comparator: %s", comparator->Name());
  Header(log, "          Options.merge_operator: %s",
470
      merge_operator ? merge_operator->Name() : "None");
471
  Header(log, "       Options.compaction_filter: %s",
472
      compaction_filter ? compaction_filter->Name() : "None");
473
  Header(log, "       Options.compaction_filter_factory: %s",
474
      compaction_filter_factory ? compaction_filter_factory->Name() : "None");
475 476 477
  Header(log, "        Options.memtable_factory: %s", memtable_factory->Name());
  Header(log, "           Options.table_factory: %s", table_factory->Name());
  Header(log, "           table_factory options: %s",
L
Lei Jin 已提交
478
      table_factory->GetPrintableTableOptions().c_str());
479
  Header(log, "       Options.write_buffer_size: %" ROCKSDB_PRIszt,
S
sdong 已提交
480
       write_buffer_size);
481
  Header(log, " Options.max_write_buffer_number: %d", max_write_buffer_number);
482
    if (!compression_per_level.empty()) {
483
      for (unsigned int i = 0; i < compression_per_level.size(); i++) {
484
        Header(log, "       Options.compression[%d]: %s", i,
485
            CompressionTypeToString(compression_per_level[i]).c_str());
I
Igor Canadi 已提交
486
      }
487
    } else {
488
      Header(log, "         Options.compression: %s",
489
          CompressionTypeToString(compression).c_str());
490
    }
491
    Header(log, "      Options.prefix_extractor: %s",
T
Tyler Harter 已提交
492
        prefix_extractor == nullptr ? "nullptr" : prefix_extractor->Name());
493 494
    Header(log, "            Options.num_levels: %d", num_levels);
    Header(log, "       Options.min_write_buffer_number_to_merge: %d",
495
        min_write_buffer_number_to_merge);
496
    Header(log, "    Options.max_write_buffer_number_to_maintain: %d",
497
         max_write_buffer_number_to_maintain);
498
    Header(log, "           Options.compression_opts.window_bits: %d",
499
        compression_opts.window_bits);
500
    Header(log, "                 Options.compression_opts.level: %d",
501
        compression_opts.level);
502
    Header(log, "              Options.compression_opts.strategy: %d",
503
        compression_opts.strategy);
504
    Header(log, "     Options.level0_file_num_compaction_trigger: %d",
505
        level0_file_num_compaction_trigger);
506
    Header(log, "         Options.level0_slowdown_writes_trigger: %d",
507
        level0_slowdown_writes_trigger);
508
    Header(log, "             Options.level0_stop_writes_trigger: %d",
509
        level0_stop_writes_trigger);
510
    Header(log, "                  Options.target_file_size_base: %" PRIu64,
511
        target_file_size_base);
512
    Header(log, "            Options.target_file_size_multiplier: %d",
513
        target_file_size_multiplier);
514
    Header(log, "               Options.max_bytes_for_level_base: %" PRIu64,
515
        max_bytes_for_level_base);
516
    Header(log, "Options.level_compaction_dynamic_level_bytes: %d",
517
        level_compaction_dynamic_level_bytes);
518
    Header(log, "         Options.max_bytes_for_level_multiplier: %d",
519
        max_bytes_for_level_multiplier);
S
sdong 已提交
520 521
    for (size_t i = 0; i < max_bytes_for_level_multiplier_additional.size();
         i++) {
522 523
      Header(log,
          "Options.max_bytes_for_level_multiplier_addtl[%" ROCKSDB_PRIszt
S
sdong 已提交
524 525
                "]: %d",
           i, max_bytes_for_level_multiplier_additional[i]);
526
    }
527
    Header(log, "      Options.max_sequential_skip_in_iterations: %" PRIu64,
528
        max_sequential_skip_in_iterations);
529
    Header(log, "             Options.expanded_compaction_factor: %d",
530
        expanded_compaction_factor);
531
    Header(log, "               Options.source_compaction_factor: %d",
532
        source_compaction_factor);
533
    Header(log, "         Options.max_grandparent_overlap_factor: %d",
534
        max_grandparent_overlap_factor);
D
Dmitri Smirnov 已提交
535

536
    Header(log,
S
sdong 已提交
537 538
         "                       Options.arena_block_size: %" ROCKSDB_PRIszt,
         arena_block_size);
539 540
    Header(log, "  Options.soft_pending_compaction_bytes_limit: %" PRIu64,
           soft_pending_compaction_bytes_limit);
541
    Header(log, "  Options.hard_pending_compaction_bytes_limit: %" PRIu64,
542
         hard_pending_compaction_bytes_limit);
543
    Header(log, "      Options.rate_limit_delay_max_milliseconds: %u",
J
Jim Paton 已提交
544
        rate_limit_delay_max_milliseconds);
545
    Header(log, "               Options.disable_auto_compactions: %d",
546
        disable_auto_compactions);
547
    Header(log, "                          Options.filter_deletes: %d",
548
        filter_deletes);
549
    Header(log, "          Options.verify_checksums_in_compaction: %d",
550
        verify_checksums_in_compaction);
551
    Header(log, "                        Options.compaction_style: %d",
552
        compaction_style);
553 554
    Header(log, "                          Options.compaction_pri: %d",
           compaction_pri);
555
    Header(log, " Options.compaction_options_universal.size_ratio: %u",
556
        compaction_options_universal.size_ratio);
557
    Header(log, "Options.compaction_options_universal.min_merge_width: %u",
558
        compaction_options_universal.min_merge_width);
559
    Header(log, "Options.compaction_options_universal.max_merge_width: %u",
560
        compaction_options_universal.max_merge_width);
561
    Header(log, "Options.compaction_options_universal."
562 563
            "max_size_amplification_percent: %u",
        compaction_options_universal.max_size_amplification_percent);
564
    Header(log,
565
        "Options.compaction_options_universal.compression_size_percent: %d",
566
        compaction_options_universal.compression_size_percent);
567 568
    Header(log,
        "Options.compaction_options_fifo.max_table_files_size: %" PRIu64,
I
Igor Canadi 已提交
569
        compaction_options_fifo.max_table_files_size);
570
    std::string collector_names;
I
Igor Canadi 已提交
571 572
    for (const auto& collector_factory : table_properties_collector_factories) {
      collector_names.append(collector_factory->Name());
573 574
      collector_names.append("; ");
    }
575
    Header(log, "                  Options.table_properties_collectors: %s",
576
        collector_names.c_str());
577
    Header(log, "                  Options.inplace_update_support: %d",
578
        inplace_update_support);
579
    Header(log,
S
sdong 已提交
580 581
         "                Options.inplace_update_num_locks: %" ROCKSDB_PRIszt,
         inplace_update_num_locks);
582
    Header(log, "              Options.min_partial_merge_operands: %u",
583
        min_partial_merge_operands);
584
    // TODO: easier config for bloom (maybe based on avg key/value size)
585
    Header(log, "              Options.memtable_prefix_bloom_bits: %d",
586
        memtable_prefix_bloom_bits);
587
    Header(log, "            Options.memtable_prefix_bloom_probes: %d",
588
        memtable_prefix_bloom_probes);
D
Dmitri Smirnov 已提交
589

590
    Header(log,
S
sdong 已提交
591 592
         "  Options.memtable_prefix_bloom_huge_page_tlb_size: %" ROCKSDB_PRIszt,
         memtable_prefix_bloom_huge_page_tlb_size);
593
    Header(log, "                          Options.bloom_locality: %d",
I
Igor Canadi 已提交
594
        bloom_locality);
D
Dmitri Smirnov 已提交
595

596
    Header(log,
S
sdong 已提交
597 598
         "                   Options.max_successive_merges: %" ROCKSDB_PRIszt,
         max_successive_merges);
599
    Header(log, "               Options.optimize_fllters_for_hits: %d",
600
        optimize_filters_for_hits);
601
    Header(log, "               Options.paranoid_file_checks: %d",
602
         paranoid_file_checks);
603
    Header(log, "               Options.compaction_measure_io_stats: %d",
604
         compaction_measure_io_stats);
605 606 607 608 609
}  // ColumnFamilyOptions::Dump

void Options::Dump(Logger* log) const {
  DBOptions::Dump(log);
  ColumnFamilyOptions::Dump(log);
610 611
}   // Options::Dump

612 613 614 615
void Options::DumpCFOptions(Logger* log) const {
  ColumnFamilyOptions::Dump(log);
}  // Options::DumpCFOptions

616 617 618 619
//
// The goal of this method is to create a configuration that
// allows an application to write all files into L0 and
// then do a single compaction to output all files into L1.
620 621 622
Options*
Options::PrepareForBulkLoad()
{
623
  // never slowdown ingest.
624 625 626
  level0_file_num_compaction_trigger = (1<<30);
  level0_slowdown_writes_trigger = (1<<30);
  level0_stop_writes_trigger = (1<<30);
627 628 629

  // no auto compactions please. The application should issue a
  // manual compaction after all data is loaded into L0.
630 631
  disable_auto_compactions = true;
  disableDataSync = true;
632 633 634

  // A manual compaction run should pick all files in L0 in
  // a single compaction run.
635 636
  source_compaction_factor = (1<<30);

637 638 639 640 641
  // It is better to have only 2 levels, otherwise a manual
  // compaction would compact at every possible level, thereby
  // increasing the total time needed for compactions.
  num_levels = 2;

642 643 644 645 646 647 648 649 650
  // Need to allow more write buffers to allow more parallism
  // of flushes.
  max_write_buffer_number = 6;
  min_write_buffer_number_to_merge = 1;

  // When compaction is disabled, more parallel flush threads can
  // help with write throughput.
  max_background_flushes = 4;

651 652 653 654 655 656 657
  // Prevent a memtable flush to automatically promote files
  // to L1. This is helpful so that all files that are
  // input to the manual compaction are all at L0.
  max_background_compactions = 2;

  // The compaction would create large files in L1.
  target_file_size_base = 256 * 1024 * 1024;
658 659 660
  return this;
}

661
#ifndef ROCKSDB_LITE
662
// Optimization functions
L
Lei Jin 已提交
663 664
ColumnFamilyOptions* ColumnFamilyOptions::OptimizeForPointLookup(
    uint64_t block_cache_size_mb) {
665 666
  prefix_extractor.reset(NewNoopTransform());
  BlockBasedTableOptions block_based_options;
L
Lei Jin 已提交
667 668 669
  block_based_options.index_type = BlockBasedTableOptions::kHashSearch;
  block_based_options.filter_policy.reset(NewBloomFilterPolicy(10));
  block_based_options.block_cache =
670
      NewLRUCache(static_cast<size_t>(block_cache_size_mb * 1024 * 1024));
671 672 673 674 675 676 677
  table_factory.reset(new BlockBasedTableFactory(block_based_options));
  memtable_factory.reset(NewHashLinkListRepFactory());
  return this;
}

ColumnFamilyOptions* ColumnFamilyOptions::OptimizeLevelStyleCompaction(
    uint64_t memtable_memory_budget) {
678
  write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
  // merge two memtables when flushing to L0
  min_write_buffer_number_to_merge = 2;
  // this means we'll use 50% extra memory in the worst case, but will reduce
  // write stalls.
  max_write_buffer_number = 6;
  // start flushing L0->L1 as soon as possible. each file on level0 is
  // (memtable_memory_budget / 2). This will flush level 0 when it's bigger than
  // memtable_memory_budget.
  level0_file_num_compaction_trigger = 2;
  // doesn't really matter much, but we don't want to create too many files
  target_file_size_base = memtable_memory_budget / 8;
  // make Level1 size equal to Level0 size, so that L0->L1 compactions are fast
  max_bytes_for_level_base = memtable_memory_budget;

  // level style compaction
  compaction_style = kCompactionStyleLevel;

  // only compress levels >= 2
  compression_per_level.resize(num_levels);
  for (int i = 0; i < num_levels; ++i) {
    if (i < 2) {
      compression_per_level[i] = kNoCompression;
    } else {
      compression_per_level[i] = kSnappyCompression;
    }
  }
  return this;
}

ColumnFamilyOptions* ColumnFamilyOptions::OptimizeUniversalStyleCompaction(
    uint64_t memtable_memory_budget) {
710
  write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
  // merge two memtables when flushing to L0
  min_write_buffer_number_to_merge = 2;
  // this means we'll use 50% extra memory in the worst case, but will reduce
  // write stalls.
  max_write_buffer_number = 6;
  // universal style compaction
  compaction_style = kCompactionStyleUniversal;
  compaction_options_universal.compression_size_percent = 80;
  return this;
}

DBOptions* DBOptions::IncreaseParallelism(int total_threads) {
  max_background_compactions = total_threads - 1;
  max_background_flushes = 1;
  env->SetBackgroundThreads(total_threads, Env::LOW);
  env->SetBackgroundThreads(1, Env::HIGH);
  return this;
}
V
Venkatesh Radhakrishnan 已提交
729

730 731
#endif  // !ROCKSDB_LITE

V
Venkatesh Radhakrishnan 已提交
732 733 734 735 736 737 738 739
ReadOptions::ReadOptions()
    : verify_checksums(true),
      fill_cache(true),
      snapshot(nullptr),
      iterate_upper_bound(nullptr),
      read_tier(kReadAllTier),
      tailing(false),
      managed(false),
740
      total_order_seek(false),
741 742
      prefix_same_as_start(false),
      pin_data(false) {
V
Venkatesh Radhakrishnan 已提交
743 744 745 746 747 748 749 750 751 752 753 754
  XFUNC_TEST("", "managed_options", managed_options, xf_manage_options,
             reinterpret_cast<ReadOptions*>(this));
}

ReadOptions::ReadOptions(bool cksum, bool cache)
    : verify_checksums(cksum),
      fill_cache(cache),
      snapshot(nullptr),
      iterate_upper_bound(nullptr),
      read_tier(kReadAllTier),
      tailing(false),
      managed(false),
755
      total_order_seek(false),
756 757
      prefix_same_as_start(false),
      pin_data(false) {
V
Venkatesh Radhakrishnan 已提交
758 759 760 761
  XFUNC_TEST("", "managed_options", managed_options, xf_manage_options,
             reinterpret_cast<ReadOptions*>(this));
}

762
}  // namespace rocksdb