options.cc 31.8 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
    : 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),
      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),
73 74
      new_table_reader_for_compaction_inputs(
          options.new_table_reader_for_compaction_inputs),
75
      compaction_readahead_size(options.compaction_readahead_size),
76
      num_levels(options.num_levels),
77
      optimize_filters_for_hits(options.optimize_filters_for_hits),
78 79
      listeners(options.listeners),
      row_cache(options.row_cache) {}
L
Lei Jin 已提交
80

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

135 136 137 138 139 140 141 142 143
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),
144 145
      max_write_buffer_number_to_maintain(
          options.max_write_buffer_number_to_maintain),
146 147 148 149 150 151 152 153 154 155 156 157
      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),
158 159
      level_compaction_dynamic_level_bytes(
          options.level_compaction_dynamic_level_bytes),
160 161 162 163 164 165 166
      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),
167 168
      hard_pending_compaction_bytes_limit(
          options.hard_pending_compaction_bytes_limit),
169 170
      rate_limit_delay_max_milliseconds(
          options.rate_limit_delay_max_milliseconds),
171
      arena_block_size(options.arena_block_size),
172 173 174
      disable_auto_compactions(options.disable_auto_compactions),
      purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush),
      compaction_style(options.compaction_style),
175
      compaction_pri(options.compaction_pri),
176
      verify_checksums_in_compaction(options.verify_checksums_in_compaction),
177
      compaction_options_universal(options.compaction_options_universal),
I
Igor Canadi 已提交
178
      compaction_options_fifo(options.compaction_options_fifo),
179 180 181 182 183
      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 已提交
184 185
      table_properties_collector_factories(
          options.table_properties_collector_factories),
186
      inplace_update_support(options.inplace_update_support),
187
      inplace_update_num_locks(options.inplace_update_num_locks),
188 189 190
      inplace_callback(options.inplace_callback),
      memtable_prefix_bloom_bits(options.memtable_prefix_bloom_bits),
      memtable_prefix_bloom_probes(options.memtable_prefix_bloom_probes),
191 192
      memtable_prefix_bloom_huge_page_tlb_size(
          options.memtable_prefix_bloom_huge_page_tlb_size),
I
Igor Canadi 已提交
193
      bloom_locality(options.bloom_locality),
194
      max_successive_merges(options.max_successive_merges),
195
      min_partial_merge_operands(options.min_partial_merge_operands),
196
      optimize_filters_for_hits(options.optimize_filters_for_hits),
197 198
      paranoid_file_checks(options.paranoid_file_checks),
      compaction_measure_io_stats(options.compaction_measure_io_stats) {
199
  assert(memtable_factory.get() != nullptr);
200 201
  if (max_bytes_for_level_multiplier_additional.size() <
      static_cast<unsigned int>(num_levels)) {
202 203
    max_bytes_for_level_multiplier_additional.resize(num_levels, 1);
  }
204 205
}

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

270 271
DBOptions::DBOptions(const Options& options)
    : create_if_missing(options.create_if_missing),
I
Igor Canadi 已提交
272
      create_missing_column_families(options.create_missing_column_families),
273 274 275
      error_if_exists(options.error_if_exists),
      paranoid_checks(options.paranoid_checks),
      env(options.env),
L
Lei Jin 已提交
276
      rate_limiter(options.rate_limiter),
I
Islam AbdelRahman 已提交
277
      delete_scheduler(options.delete_scheduler),
278
      info_log(options.info_log),
279
      info_log_level(options.info_log_level),
280
      max_open_files(options.max_open_files),
281
      max_file_opening_threads(options.max_file_opening_threads),
I
Igor Canadi 已提交
282
      max_total_wal_size(options.max_total_wal_size),
283
      statistics(options.statistics),
284 285
      disableDataSync(options.disableDataSync),
      use_fsync(options.use_fsync),
286
      db_paths(options.db_paths),
287 288 289 290 291
      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),
292
      max_subcompactions(options.max_subcompactions),
293 294 295 296
      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),
297
      recycle_log_file_num(options.recycle_log_file_num),
298
      max_manifest_file_size(options.max_manifest_file_size),
299
      table_cache_numshardbits(options.table_cache_numshardbits),
300 301 302 303 304 305
      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),
306
      allow_fallocate(options.allow_fallocate),
307 308 309 310
      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),
311
      db_write_buffer_size(options.db_write_buffer_size),
312
      access_hint_on_compaction_start(options.access_hint_on_compaction_start),
313 314
      new_table_reader_for_compaction_inputs(
          options.new_table_reader_for_compaction_inputs),
315
      compaction_readahead_size(options.compaction_readahead_size),
316
      random_access_max_buffer_size(options.random_access_max_buffer_size),
317
      writable_file_max_buffer_size(options.writable_file_max_buffer_size),
318
      use_adaptive_mutex(options.use_adaptive_mutex),
319
      bytes_per_sync(options.bytes_per_sync),
320
      wal_bytes_per_sync(options.wal_bytes_per_sync),
321
      listeners(options.listeners),
S
sdong 已提交
322
      enable_thread_tracking(options.enable_thread_tracking),
K
krad 已提交
323
      delayed_write_rate(options.delayed_write_rate),
324
      skip_stats_update_on_db_open(options.skip_stats_update_on_db_open),
325
      wal_recovery_mode(options.wal_recovery_mode),
326 327
      row_cache(options.row_cache)
#ifndef ROCKSDB_LITE
S
sdong 已提交
328 329 330 331
      ,
      wal_filter(options.wal_filter)
#endif  // ROCKSDB_LITE
{
332
}
333

334 335 336 337
static const char* const access_hints[] = {
  "NONE", "NORMAL", "SEQUENTIAL", "WILLNEED"
};

338
void DBOptions::Dump(Logger* log) const {
339 340 341 342 343 344 345 346 347 348 349 350 351
    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 已提交
352
         max_log_file_size);
353
    Header(log, "Options.max_manifest_file_size: %" PRIu64,
S
sdong 已提交
354
         max_manifest_file_size);
355
    Header(log, "     Options.log_file_time_to_roll: %" ROCKSDB_PRIszt,
S
sdong 已提交
356
         log_file_time_to_roll);
357
    Header(log, "     Options.keep_log_file_num: %" ROCKSDB_PRIszt,
S
sdong 已提交
358
         keep_log_file_num);
359 360
    Header(log, "  Options.recycle_log_file_num: %" ROCKSDB_PRIszt,
           recycle_log_file_num);
361 362
    Header(log, "       Options.allow_os_buffer: %d", allow_os_buffer);
    Header(log, "      Options.allow_mmap_reads: %d", allow_mmap_reads);
363
    Header(log, "      Options.allow_fallocate: %d", allow_fallocate);
364 365
    Header(log, "     Options.allow_mmap_writes: %d", allow_mmap_writes);
    Header(log, "         Options.create_missing_column_families: %d",
I
Igor Canadi 已提交
366
        create_missing_column_families);
367
    Header(log, "                             Options.db_log_dir: %s",
368
        db_log_dir.c_str());
369
    Header(log, "                                Options.wal_dir: %s",
370
        wal_dir.c_str());
371
    Header(log, "               Options.table_cache_numshardbits: %d",
372
        table_cache_numshardbits);
373
    Header(log, "    Options.delete_obsolete_files_period_micros: %" PRIu64,
374
        delete_obsolete_files_period_micros);
375
    Header(log, "             Options.max_background_compactions: %d",
376
        max_background_compactions);
377
    Header(log, "                     Options.max_subcompactions: %" PRIu32,
378
        max_subcompactions);
379
    Header(log, "                 Options.max_background_flushes: %d",
380
        max_background_flushes);
381
    Header(log, "                        Options.WAL_ttl_seconds: %" PRIu64,
382
        WAL_ttl_seconds);
383
    Header(log, "                      Options.WAL_size_limit_MB: %" PRIu64,
384
        WAL_size_limit_MB);
385
    Header(log,
S
sdong 已提交
386 387
         "            Options.manifest_preallocation_size: %" ROCKSDB_PRIszt,
         manifest_preallocation_size);
388
    Header(log, "                         Options.allow_os_buffer: %d",
389
        allow_os_buffer);
390
    Header(log, "                        Options.allow_mmap_reads: %d",
391
        allow_mmap_reads);
392
    Header(log, "                       Options.allow_mmap_writes: %d",
393
        allow_mmap_writes);
394
    Header(log, "                     Options.is_fd_close_on_exec: %d",
395
        is_fd_close_on_exec);
396
    Header(log, "                   Options.stats_dump_period_sec: %u",
397
        stats_dump_period_sec);
398
    Header(log, "                   Options.advise_random_on_open: %d",
399
        advise_random_on_open);
400
    Header(log,
S
sdong 已提交
401 402 403
         "                    Options.db_write_buffer_size: %" ROCKSDB_PRIszt
         "d",
         db_write_buffer_size);
404
    Header(log, "         Options.access_hint_on_compaction_start: %s",
405
        access_hints[access_hint_on_compaction_start]);
406
    Header(log, "  Options.new_table_reader_for_compaction_inputs: %d",
407
         new_table_reader_for_compaction_inputs);
408
    Header(log,
409 410 411
         "               Options.compaction_readahead_size: %" ROCKSDB_PRIszt
         "d",
         compaction_readahead_size);
S
sdong 已提交
412 413
    Header(
        log,
414 415 416
        "               Options.random_access_max_buffer_size: %" ROCKSDB_PRIszt
        "d",
        random_access_max_buffer_size);
417 418 419 420
    Header(log,
         "              Options.writable_file_max_buffer_size: %" ROCKSDB_PRIszt
         "d",
         writable_file_max_buffer_size);
421
    Header(log, "                      Options.use_adaptive_mutex: %d",
422
        use_adaptive_mutex);
423
    Header(log, "                            Options.rate_limiter: %p",
424
        rate_limiter.get());
425
    Header(log, "     Options.delete_scheduler.rate_bytes_per_sec: %" PRIi64,
I
Islam AbdelRahman 已提交
426
         delete_scheduler ? delete_scheduler->GetRateBytesPerSecond() : 0);
427
    Header(log, "                          Options.bytes_per_sync: %" PRIu64,
428
        bytes_per_sync);
429
    Header(log, "                      Options.wal_bytes_per_sync: %" PRIu64,
430
        wal_bytes_per_sync);
431
    Header(log, "                       Options.wal_recovery_mode: %d",
432
        wal_recovery_mode);
433
    Header(log, "                  Options.enable_thread_tracking: %d",
434
        enable_thread_tracking);
435
    if (row_cache) {
436
      Header(log, "                               Options.row_cache: %" PRIu64,
437 438
           row_cache->GetCapacity());
    } else {
439
      Header(log, "                               Options.row_cache: None");
440
    }
441
#ifndef ROCKSDB_LITE
442
    Header(log, "       Options.wal_filter: %s",
S
sdong 已提交
443 444
           wal_filter ? wal_filter->Name() : "None");
#endif  // ROCKDB_LITE
445 446 447
}  // DBOptions::Dump

void ColumnFamilyOptions::Dump(Logger* log) const {
448 449
  Header(log, "              Options.comparator: %s", comparator->Name());
  Header(log, "          Options.merge_operator: %s",
450
      merge_operator ? merge_operator->Name() : "None");
451
  Header(log, "       Options.compaction_filter: %s",
452
      compaction_filter ? compaction_filter->Name() : "None");
453
  Header(log, "       Options.compaction_filter_factory: %s",
454
      compaction_filter_factory ? compaction_filter_factory->Name() : "None");
455 456 457
  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 已提交
458
      table_factory->GetPrintableTableOptions().c_str());
459
  Header(log, "       Options.write_buffer_size: %" ROCKSDB_PRIszt,
S
sdong 已提交
460
       write_buffer_size);
461
  Header(log, " Options.max_write_buffer_number: %d", max_write_buffer_number);
462
    if (!compression_per_level.empty()) {
463
      for (unsigned int i = 0; i < compression_per_level.size(); i++) {
464
        Header(log, "       Options.compression[%d]: %s", i,
465
            CompressionTypeToString(compression_per_level[i]).c_str());
I
Igor Canadi 已提交
466
      }
467
    } else {
468
      Header(log, "         Options.compression: %s",
469
          CompressionTypeToString(compression).c_str());
470
    }
471
    Header(log, "      Options.prefix_extractor: %s",
T
Tyler Harter 已提交
472
        prefix_extractor == nullptr ? "nullptr" : prefix_extractor->Name());
473 474
    Header(log, "            Options.num_levels: %d", num_levels);
    Header(log, "       Options.min_write_buffer_number_to_merge: %d",
475
        min_write_buffer_number_to_merge);
476
    Header(log, "    Options.max_write_buffer_number_to_maintain: %d",
477
         max_write_buffer_number_to_maintain);
478
    Header(log, "           Options.compression_opts.window_bits: %d",
479
        compression_opts.window_bits);
480
    Header(log, "                 Options.compression_opts.level: %d",
481
        compression_opts.level);
482
    Header(log, "              Options.compression_opts.strategy: %d",
483
        compression_opts.strategy);
484
    Header(log, "     Options.level0_file_num_compaction_trigger: %d",
485
        level0_file_num_compaction_trigger);
486
    Header(log, "         Options.level0_slowdown_writes_trigger: %d",
487
        level0_slowdown_writes_trigger);
488
    Header(log, "             Options.level0_stop_writes_trigger: %d",
489
        level0_stop_writes_trigger);
490
    Header(log, "                  Options.target_file_size_base: %" PRIu64,
491
        target_file_size_base);
492
    Header(log, "            Options.target_file_size_multiplier: %d",
493
        target_file_size_multiplier);
494
    Header(log, "               Options.max_bytes_for_level_base: %" PRIu64,
495
        max_bytes_for_level_base);
496
    Header(log, "Options.level_compaction_dynamic_level_bytes: %d",
497
        level_compaction_dynamic_level_bytes);
498
    Header(log, "         Options.max_bytes_for_level_multiplier: %d",
499
        max_bytes_for_level_multiplier);
S
sdong 已提交
500 501
    for (size_t i = 0; i < max_bytes_for_level_multiplier_additional.size();
         i++) {
502 503
      Header(log,
          "Options.max_bytes_for_level_multiplier_addtl[%" ROCKSDB_PRIszt
S
sdong 已提交
504 505
                "]: %d",
           i, max_bytes_for_level_multiplier_additional[i]);
506
    }
507
    Header(log, "      Options.max_sequential_skip_in_iterations: %" PRIu64,
508
        max_sequential_skip_in_iterations);
509
    Header(log, "             Options.expanded_compaction_factor: %d",
510
        expanded_compaction_factor);
511
    Header(log, "               Options.source_compaction_factor: %d",
512
        source_compaction_factor);
513
    Header(log, "         Options.max_grandparent_overlap_factor: %d",
514
        max_grandparent_overlap_factor);
D
Dmitri Smirnov 已提交
515

516
    Header(log,
S
sdong 已提交
517 518
         "                       Options.arena_block_size: %" ROCKSDB_PRIszt,
         arena_block_size);
519
    Header(log, "                      Options.soft_rate_limit: %.2f",
T
Tyler Harter 已提交
520
        soft_rate_limit);
521
    Header(log, "  Options.hard_pending_compaction_bytes_limit: %" PRIu64,
522
         hard_pending_compaction_bytes_limit);
523
    Header(log, "      Options.rate_limit_delay_max_milliseconds: %u",
J
Jim Paton 已提交
524
        rate_limit_delay_max_milliseconds);
525
    Header(log, "               Options.disable_auto_compactions: %d",
526
        disable_auto_compactions);
527
    Header(log, "                          Options.filter_deletes: %d",
528
        filter_deletes);
529
    Header(log, "          Options.verify_checksums_in_compaction: %d",
530
        verify_checksums_in_compaction);
531
    Header(log, "                        Options.compaction_style: %d",
532
        compaction_style);
533 534
    Header(log, "                          Options.compaction_pri: %d",
           compaction_pri);
535
    Header(log, " Options.compaction_options_universal.size_ratio: %u",
536
        compaction_options_universal.size_ratio);
537
    Header(log, "Options.compaction_options_universal.min_merge_width: %u",
538
        compaction_options_universal.min_merge_width);
539
    Header(log, "Options.compaction_options_universal.max_merge_width: %u",
540
        compaction_options_universal.max_merge_width);
541
    Header(log, "Options.compaction_options_universal."
542 543
            "max_size_amplification_percent: %u",
        compaction_options_universal.max_size_amplification_percent);
544
    Header(log,
545
        "Options.compaction_options_universal.compression_size_percent: %d",
546
        compaction_options_universal.compression_size_percent);
547 548
    Header(log,
        "Options.compaction_options_fifo.max_table_files_size: %" PRIu64,
I
Igor Canadi 已提交
549
        compaction_options_fifo.max_table_files_size);
550
    std::string collector_names;
I
Igor Canadi 已提交
551 552
    for (const auto& collector_factory : table_properties_collector_factories) {
      collector_names.append(collector_factory->Name());
553 554
      collector_names.append("; ");
    }
555
    Header(log, "                  Options.table_properties_collectors: %s",
556
        collector_names.c_str());
557
    Header(log, "                  Options.inplace_update_support: %d",
558
        inplace_update_support);
559
    Header(log,
S
sdong 已提交
560 561
         "                Options.inplace_update_num_locks: %" ROCKSDB_PRIszt,
         inplace_update_num_locks);
562
    Header(log, "              Options.min_partial_merge_operands: %u",
563
        min_partial_merge_operands);
564
    // TODO: easier config for bloom (maybe based on avg key/value size)
565
    Header(log, "              Options.memtable_prefix_bloom_bits: %d",
566
        memtable_prefix_bloom_bits);
567
    Header(log, "            Options.memtable_prefix_bloom_probes: %d",
568
        memtable_prefix_bloom_probes);
D
Dmitri Smirnov 已提交
569

570
    Header(log,
S
sdong 已提交
571 572
         "  Options.memtable_prefix_bloom_huge_page_tlb_size: %" ROCKSDB_PRIszt,
         memtable_prefix_bloom_huge_page_tlb_size);
573
    Header(log, "                          Options.bloom_locality: %d",
I
Igor Canadi 已提交
574
        bloom_locality);
D
Dmitri Smirnov 已提交
575

576
    Header(log,
S
sdong 已提交
577 578
         "                   Options.max_successive_merges: %" ROCKSDB_PRIszt,
         max_successive_merges);
579
    Header(log, "               Options.optimize_fllters_for_hits: %d",
580
        optimize_filters_for_hits);
581
    Header(log, "               Options.paranoid_file_checks: %d",
582
         paranoid_file_checks);
583
    Header(log, "               Options.compaction_measure_io_stats: %d",
584
         compaction_measure_io_stats);
585 586 587 588 589
}  // ColumnFamilyOptions::Dump

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

592 593 594 595
void Options::DumpCFOptions(Logger* log) const {
  ColumnFamilyOptions::Dump(log);
}  // Options::DumpCFOptions

596 597 598 599
//
// 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.
600 601 602
Options*
Options::PrepareForBulkLoad()
{
603
  // never slowdown ingest.
604 605 606
  level0_file_num_compaction_trigger = (1<<30);
  level0_slowdown_writes_trigger = (1<<30);
  level0_stop_writes_trigger = (1<<30);
607 608 609

  // no auto compactions please. The application should issue a
  // manual compaction after all data is loaded into L0.
610 611
  disable_auto_compactions = true;
  disableDataSync = true;
612 613 614

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

617 618 619 620 621
  // 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;

622 623 624 625 626 627 628 629 630
  // 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;

631 632 633 634 635 636 637
  // 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;
638 639 640
  return this;
}

641
#ifndef ROCKSDB_LITE
642
// Optimization functions
L
Lei Jin 已提交
643 644
ColumnFamilyOptions* ColumnFamilyOptions::OptimizeForPointLookup(
    uint64_t block_cache_size_mb) {
645 646
  prefix_extractor.reset(NewNoopTransform());
  BlockBasedTableOptions block_based_options;
L
Lei Jin 已提交
647 648 649
  block_based_options.index_type = BlockBasedTableOptions::kHashSearch;
  block_based_options.filter_policy.reset(NewBloomFilterPolicy(10));
  block_based_options.block_cache =
650
      NewLRUCache(static_cast<size_t>(block_cache_size_mb * 1024 * 1024));
651 652 653 654 655 656 657
  table_factory.reset(new BlockBasedTableFactory(block_based_options));
  memtable_factory.reset(NewHashLinkListRepFactory());
  return this;
}

ColumnFamilyOptions* ColumnFamilyOptions::OptimizeLevelStyleCompaction(
    uint64_t memtable_memory_budget) {
658
  write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
  // 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) {
690
  write_buffer_size = static_cast<size_t>(memtable_memory_budget / 4);
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
  // 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 已提交
709

710 711
#endif  // !ROCKSDB_LITE

V
Venkatesh Radhakrishnan 已提交
712 713 714 715 716 717 718 719
ReadOptions::ReadOptions()
    : verify_checksums(true),
      fill_cache(true),
      snapshot(nullptr),
      iterate_upper_bound(nullptr),
      read_tier(kReadAllTier),
      tailing(false),
      managed(false),
720 721
      total_order_seek(false),
      prefix_same_as_start(false) {
V
Venkatesh Radhakrishnan 已提交
722 723 724 725 726 727 728 729 730 731 732 733
  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),
734 735
      total_order_seek(false),
      prefix_same_as_start(false) {
V
Venkatesh Radhakrishnan 已提交
736 737 738 739
  XFUNC_TEST("", "managed_options", managed_options, xf_manage_options,
             reinterpret_cast<ReadOptions*>(this));
}

740
}  // namespace rocksdb