options.cc 20.3 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"
J
jorlow@chromium.org 已提交
11

A
Abhishek Kona 已提交
12 13
#include <limits>

14 15 16 17 18
#include "rocksdb/cache.h"
#include "rocksdb/compaction_filter.h"
#include "rocksdb/comparator.h"
#include "rocksdb/env.h"
#include "rocksdb/filter_policy.h"
19
#include "rocksdb/memtablerep.h"
K
kailiu 已提交
20
#include "rocksdb/merge_operator.h"
21 22
#include "rocksdb/slice.h"
#include "rocksdb/slice_transform.h"
K
kailiu 已提交
23
#include "rocksdb/table.h"
24
#include "rocksdb/table_properties.h"
S
Siying Dong 已提交
25
#include "table/block_based_table_factory.h"
J
jorlow@chromium.org 已提交
26

27
namespace rocksdb {
J
jorlow@chromium.org 已提交
28

29
ColumnFamilyOptions::ColumnFamilyOptions()
J
jorlow@chromium.org 已提交
30
    : comparator(BytewiseComparator()),
31
      merge_operator(nullptr),
32
      compaction_filter(nullptr),
33 34 35
      compaction_filter_factory(
          std::shared_ptr<CompactionFilterFactory>(
            new DefaultCompactionFilterFactory())),
36
      write_buffer_size(4<<20),
37
      max_write_buffer_number(2),
38
      min_write_buffer_number_to_merge(1),
39 40
      block_cache(nullptr),
      block_cache_compressed(nullptr),
41
      block_size(4096),
J
jorlow@chromium.org 已提交
42
      block_restart_interval(16),
S
Sanjay Ghemawat 已提交
43
      compression(kSnappyCompression),
A
Abhishek Kona 已提交
44
      filter_policy(nullptr),
T
Tyler Harter 已提交
45 46
      prefix_extractor(nullptr),
      whole_key_filtering(true),
47 48 49 50 51 52
      num_levels(7),
      level0_file_num_compaction_trigger(4),
      level0_slowdown_writes_trigger(8),
      level0_stop_writes_trigger(12),
      max_mem_compaction_level(2),
      target_file_size_base(2 * 1048576),
53
      target_file_size_multiplier(1),
H
heyongqiang 已提交
54
      max_bytes_for_level_base(10 * 1048576),
55
      max_bytes_for_level_multiplier(10),
56
      max_bytes_for_level_multiplier_additional(num_levels, 1),
57
      expanded_compaction_factor(25),
58
      source_compaction_factor(1),
59
      max_grandparent_overlap_factor(10),
60 61 62 63 64
      disable_seek_compaction(false),
      soft_rate_limit(0.0),
      hard_rate_limit(0.0),
      rate_limit_delay_max_milliseconds(1000),
      no_block_cache(false),
65
      arena_block_size(0),
66 67 68 69 70 71 72 73 74 75
      disable_auto_compactions(false),
      purge_redundant_kvs_while_flush(true),
      block_size_deviation(10),
      compaction_style(kCompactionStyleLevel),
      filter_deletes(false),
      max_sequential_skip_in_iterations(8),
      memtable_factory(std::shared_ptr<SkipListFactory>(new SkipListFactory)),
      table_factory(
        std::shared_ptr<TableFactory>(new BlockBasedTableFactory())),
      inplace_update_support(false),
I
Igor Canadi 已提交
76
      inplace_update_num_locks(10000),
77 78 79
      inplace_callback(nullptr),
      memtable_prefix_bloom_bits(0),
      memtable_prefix_bloom_probes(6),
I
Igor Canadi 已提交
80
      max_successive_merges(0) {
81 82 83
  assert(memtable_factory.get() != nullptr);
}

84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
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),
      block_cache(options.block_cache),
      block_cache_compressed(options.block_cache_compressed),
      block_size(options.block_size),
      block_restart_interval(options.block_restart_interval),
      compression(options.compression),
      compression_per_level(options.compression_per_level),
      compression_opts(options.compression_opts),
      filter_policy(options.filter_policy),
      prefix_extractor(options.prefix_extractor),
      whole_key_filtering(options.whole_key_filtering),
      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),
      max_mem_compaction_level(options.max_mem_compaction_level),
      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),
      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),
      disable_seek_compaction(options.disable_seek_compaction),
      soft_rate_limit(options.soft_rate_limit),
      hard_rate_limit(options.hard_rate_limit),
      rate_limit_delay_max_milliseconds(
          options.rate_limit_delay_max_milliseconds),
      no_block_cache(options.no_block_cache),
124
      arena_block_size(options.arena_block_size),
125 126 127 128 129 130 131 132 133 134 135 136
      disable_auto_compactions(options.disable_auto_compactions),
      purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush),
      block_size_deviation(options.block_size_deviation),
      compaction_style(options.compaction_style),
      compaction_options_universal(options.compaction_options_universal),
      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),
      table_properties_collectors(options.table_properties_collectors),
      inplace_update_support(options.inplace_update_support),
137
      inplace_update_num_locks(options.inplace_update_num_locks),
138 139 140
      inplace_callback(options.inplace_callback),
      memtable_prefix_bloom_bits(options.memtable_prefix_bloom_bits),
      memtable_prefix_bloom_probes(options.memtable_prefix_bloom_probes),
I
Igor Canadi 已提交
141
      max_successive_merges(options.max_successive_merges) {
142 143 144
  assert(memtable_factory.get() != nullptr);
}

145 146 147 148 149
DBOptions::DBOptions()
    : create_if_missing(false),
      error_if_exists(false),
      paranoid_checks(false),
      env(Env::Default()),
150
      info_log(nullptr),
151
      max_open_files(1000),
152
      statistics(nullptr),
153
      disableDataSync(false),
154
      use_fsync(false),
H
heyongqiang 已提交
155
      db_stats_log_interval(1800),
156
      db_log_dir(""),
157
      wal_dir(""),
I
Igor Canadi 已提交
158
      delete_obsolete_files_period_micros(6 * 60 * 60 * 1000000UL),
159
      max_background_compactions(1),
160
      max_background_flushes(1),
161
      max_log_file_size(0),
K
Kai Liu 已提交
162 163
      log_file_time_to_roll(0),
      keep_log_file_num(1000),
A
Abhishek Kona 已提交
164
      max_manifest_file_size(std::numeric_limits<uint64_t>::max()),
165 166
      table_cache_numshardbits(4),
      table_cache_remove_scan_count_limit(16),
167
      WAL_ttl_seconds(0),
168
      WAL_size_limit_MB(0),
169
      manifest_preallocation_size(4 * 1024 * 1024),
170 171
      allow_os_buffer(true),
      allow_mmap_reads(false),
172
      allow_mmap_writes(true),
173
      is_fd_close_on_exec(true),
174
      skip_log_error_on_recovery(false),
175
      stats_dump_period_sec(3600),
176
      advise_random_on_open(true),
H
Haobo Xu 已提交
177
      access_hint_on_compaction_start(NORMAL),
H
Haobo Xu 已提交
178
      use_adaptive_mutex(false),
179
      bytes_per_sync(0) { }
J
jorlow@chromium.org 已提交
180

181 182 183 184 185
DBOptions::DBOptions(const Options& options)
    : create_if_missing(options.create_if_missing),
      error_if_exists(options.error_if_exists),
      paranoid_checks(options.paranoid_checks),
      env(options.env),
186
      info_log(options.info_log),
187
      max_open_files(options.max_open_files),
188
      statistics(options.statistics),
189 190 191 192 193 194 195 196 197 198 199 200 201
      disableDataSync(options.disableDataSync),
      use_fsync(options.use_fsync),
      db_stats_log_interval(options.db_stats_log_interval),
      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),
      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),
      max_manifest_file_size(options.max_manifest_file_size),
202 203 204
      table_cache_numshardbits(options.table_cache_numshardbits),
      table_cache_remove_scan_count_limit(
          options.table_cache_remove_scan_count_limit),
205 206 207 208 209 210 211 212 213 214 215 216 217 218
      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),
      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),
      access_hint_on_compaction_start(options.access_hint_on_compaction_start),
      use_adaptive_mutex(options.use_adaptive_mutex),
      bytes_per_sync(options.bytes_per_sync) {}

219 220 221 222
static const char* const access_hints[] = {
  "NONE", "NORMAL", "SEQUENTIAL", "WILLNEED"
};

223
void
224
Options::Dump(Logger* log) const
225
{
226
    Log(log,"              Options.comparator: %s", comparator->Name());
227 228
    Log(log,"          Options.merge_operator: %s",
        merge_operator? merge_operator->Name() : "None");
229 230
    Log(log,"       Options.compaction_filter: %s",
        compaction_filter? compaction_filter->Name() : "None");
231 232
    Log(log,"       Options.compaction_filter_factory: %s",
        compaction_filter_factory->Name());
233 234
    Log(log,"        Options.memtable_factory: %s",
        memtable_factory->Name());
S
Siying Dong 已提交
235
    Log(log,"           Options.table_factory: %s", table_factory->Name());
236
    Log(log,"         Options.error_if_exists: %d", error_if_exists);
T
Tyler Harter 已提交
237
    Log(log,"       Options.create_if_missing: %d", create_if_missing);
238 239
    Log(log,"         Options.paranoid_checks: %d", paranoid_checks);
    Log(log,"                     Options.env: %p", env);
240
    Log(log,"                Options.info_log: %p", info_log.get());
241
    Log(log,"       Options.write_buffer_size: %zd", write_buffer_size);
242
    Log(log," Options.max_write_buffer_number: %d", max_write_buffer_number);
243
    Log(log,"          Options.max_open_files: %d", max_open_files);
244
    Log(log,"             Options.block_cache: %p", block_cache.get());
245 246
    Log(log,"  Options.block_cache_compressed: %p",
        block_cache_compressed.get());
247
    if (block_cache) {
248
      Log(log,"        Options.block_cache_size: %zd",
249 250
          block_cache->GetCapacity());
    }
251 252 253 254
    if (block_cache_compressed) {
      Log(log,"Options.block_cache_compressed_size: %zd",
          block_cache_compressed->GetCapacity());
    }
255 256
    Log(log,"              Options.block_size: %zd", block_size);
    Log(log,"  Options.block_restart_interval: %d", block_restart_interval);
257
    if (!compression_per_level.empty()) {
258
      for (unsigned int i = 0; i < compression_per_level.size(); i++) {
259
          Log(log,"       Options.compression[%d]: %d",
260 261 262
              i, compression_per_level[i]);
       }
    } else {
263
      Log(log,"         Options.compression: %d", compression);
264
    }
265
    Log(log,"         Options.filter_policy: %s",
A
Abhishek Kona 已提交
266
        filter_policy == nullptr ? "nullptr" : filter_policy->Name());
T
Tyler Harter 已提交
267 268 269
    Log(log,"      Options.prefix_extractor: %s",
        prefix_extractor == nullptr ? "nullptr" : prefix_extractor->Name());
    Log(log,"   Options.whole_key_filtering: %d", whole_key_filtering);
270 271 272
    Log(log,"            Options.num_levels: %d", num_levels);
    Log(log,"       Options.disableDataSync: %d", disableDataSync);
    Log(log,"             Options.use_fsync: %d", use_fsync);
I
Igor Canadi 已提交
273
    Log(log,"     Options.max_log_file_size: %zu", max_log_file_size);
K
Kai Liu 已提交
274 275
    Log(log,"Options.max_manifest_file_size: %lu",
        (unsigned long)max_manifest_file_size);
I
Igor Canadi 已提交
276 277
    Log(log,"     Options.log_file_time_to_roll: %zu", log_file_time_to_roll);
    Log(log,"     Options.keep_log_file_num: %zu", keep_log_file_num);
278
    Log(log," Options.db_stats_log_interval: %d",
279
        db_stats_log_interval);
280 281 282
    Log(log,"       Options.allow_os_buffer: %d", allow_os_buffer);
    Log(log,"      Options.allow_mmap_reads: %d", allow_mmap_reads);
    Log(log,"     Options.allow_mmap_writes: %d", allow_mmap_writes);
283 284
    Log(log,"       Options.min_write_buffer_number_to_merge: %d",
        min_write_buffer_number_to_merge);
285 286
    Log(log,"        Options.purge_redundant_kvs_while_flush: %d",
         purge_redundant_kvs_while_flush);
287 288 289 290 291 292
    Log(log,"           Options.compression_opts.window_bits: %d",
        compression_opts.window_bits);
    Log(log,"                 Options.compression_opts.level: %d",
        compression_opts.level);
    Log(log,"              Options.compression_opts.strategy: %d",
        compression_opts.strategy);
293 294 295 296 297 298 299 300 301 302 303 304
    Log(log,"     Options.level0_file_num_compaction_trigger: %d",
        level0_file_num_compaction_trigger);
    Log(log,"         Options.level0_slowdown_writes_trigger: %d",
        level0_slowdown_writes_trigger);
    Log(log,"             Options.level0_stop_writes_trigger: %d",
        level0_stop_writes_trigger);
    Log(log,"               Options.max_mem_compaction_level: %d",
        max_mem_compaction_level);
    Log(log,"                  Options.target_file_size_base: %d",
        target_file_size_base);
    Log(log,"            Options.target_file_size_multiplier: %d",
        target_file_size_multiplier);
K
Kai Liu 已提交
305 306
    Log(log,"               Options.max_bytes_for_level_base: %lu",
        (unsigned long)max_bytes_for_level_base);
307 308
    Log(log,"         Options.max_bytes_for_level_multiplier: %d",
        max_bytes_for_level_multiplier);
309 310 311 312
    for (int i = 0; i < num_levels; i++) {
      Log(log,"Options.max_bytes_for_level_multiplier_addtl[%d]: %d",
          i, max_bytes_for_level_multiplier_additional[i]);
    }
K
Kai Liu 已提交
313 314
    Log(log,"      Options.max_sequential_skip_in_iterations: %lu",
        (unsigned long)max_sequential_skip_in_iterations);
315 316
    Log(log,"             Options.expanded_compaction_factor: %d",
        expanded_compaction_factor);
317 318
    Log(log,"               Options.source_compaction_factor: %d",
        source_compaction_factor);
319 320
    Log(log,"         Options.max_grandparent_overlap_factor: %d",
        max_grandparent_overlap_factor);
321
    Log(log,"                             Options.db_log_dir: %s",
H
heyongqiang 已提交
322
        db_log_dir.c_str());
323 324
    Log(log,"                             Options.wal_dir: %s",
        wal_dir.c_str());
325
    Log(log,"                Options.disable_seek_compaction: %d",
326
        disable_seek_compaction);
327 328 329
    Log(log,"                         Options.no_block_cache: %d",
        no_block_cache);
    Log(log,"               Options.table_cache_numshardbits: %d",
330
        table_cache_numshardbits);
331 332
    Log(log,"    Options.table_cache_remove_scan_count_limit: %d",
        table_cache_remove_scan_count_limit);
I
Igor Canadi 已提交
333
    Log(log,"                       Options.arena_block_size: %zu",
X
Xing Jin 已提交
334
        arena_block_size);
K
Kai Liu 已提交
335 336
    Log(log,"    Options.delete_obsolete_files_period_micros: %lu",
        (unsigned long)delete_obsolete_files_period_micros);
337 338
    Log(log,"             Options.max_background_compactions: %d",
        max_background_compactions);
339 340
    Log(log,"                 Options.max_background_flushes: %d",
        max_background_flushes);
T
Tyler Harter 已提交
341 342
    Log(log,"                      Options.soft_rate_limit: %.2f",
        soft_rate_limit);
J
Jim Paton 已提交
343 344
    Log(log,"                      Options.hard_rate_limit: %.2f",
        hard_rate_limit);
345
    Log(log,"      Options.rate_limit_delay_max_milliseconds: %u",
J
Jim Paton 已提交
346
        rate_limit_delay_max_milliseconds);
347 348
    Log(log,"               Options.disable_auto_compactions: %d",
        disable_auto_compactions);
K
Kai Liu 已提交
349 350 351 352
    Log(log,"                        Options.WAL_ttl_seconds: %lu",
        (unsigned long)WAL_ttl_seconds);
    Log(log,"                      Options.WAL_size_limit_MB: %lu",
        (unsigned long)WAL_size_limit_MB);
I
Igor Canadi 已提交
353
    Log(log,"            Options.manifest_preallocation_size: %zu",
354
        manifest_preallocation_size);
355 356 357 358 359 360 361 362 363 364
    Log(log,"         Options.purge_redundant_kvs_while_flush: %d",
        purge_redundant_kvs_while_flush);
    Log(log,"                         Options.allow_os_buffer: %d",
        allow_os_buffer);
    Log(log,"                        Options.allow_mmap_reads: %d",
        allow_mmap_reads);
    Log(log,"                       Options.allow_mmap_writes: %d",
        allow_mmap_writes);
    Log(log,"                     Options.is_fd_close_on_exec: %d",
        is_fd_close_on_exec);
365 366
    Log(log,"              Options.skip_log_error_on_recovery: %d",
        skip_log_error_on_recovery);
367
    Log(log,"                   Options.stats_dump_period_sec: %u",
368
        stats_dump_period_sec);
369 370
    Log(log,"                    Options.block_size_deviation: %d",
        block_size_deviation);
371 372 373 374
    Log(log,"                   Options.advise_random_on_open: %d",
        advise_random_on_open);
    Log(log,"         Options.access_hint_on_compaction_start: %s",
        access_hints[access_hint_on_compaction_start]);
H
Haobo Xu 已提交
375 376
    Log(log,"                      Options.use_adaptive_mutex: %d",
        use_adaptive_mutex);
K
Kai Liu 已提交
377 378
    Log(log,"                          Options.bytes_per_sync: %lu",
        (unsigned long)bytes_per_sync);
379 380
    Log(log,"                          Options.filter_deletes: %d",
        filter_deletes);
381 382
    Log(log,"                        Options.compaction_style: %d",
        compaction_style);
383
    Log(log," Options.compaction_options_universal.size_ratio: %u",
384
        compaction_options_universal.size_ratio);
385
    Log(log,"Options.compaction_options_universal.min_merge_width: %u",
386
        compaction_options_universal.min_merge_width);
387
    Log(log,"Options.compaction_options_universal.max_merge_width: %u",
388
        compaction_options_universal.max_merge_width);
389 390 391
    Log(log,"Options.compaction_options_universal."
            "max_size_amplification_percent: %u",
        compaction_options_universal.max_size_amplification_percent);
392 393 394
    Log(log,
        "Options.compaction_options_universal.compression_size_percent: %u",
        compaction_options_universal.compression_size_percent);
395
    std::string collector_names;
K
kailiu 已提交
396
    for (auto collector : table_properties_collectors) {
397 398 399
      collector_names.append(collector->Name());
      collector_names.append("; ");
    }
K
kailiu 已提交
400
    Log(log, "                  Options.table_properties_collectors: %s",
401
        collector_names.c_str());
402
    Log(log, "                  Options.inplace_update_support: %d",
403
        inplace_update_support);
404
    Log(log, "                Options.inplace_update_num_locks: %zd",
405
        inplace_update_num_locks);
406 407 408 409 410
    // TODO: easier config for bloom (maybe based on avg key/value size)
    Log(log, "              Options.memtable_prefix_bloom_bits: %d",
        memtable_prefix_bloom_bits);
    Log(log, "            Options.memtable_prefix_bloom_probes: %d",
        memtable_prefix_bloom_probes);
411 412
    Log(log, "                   Options.max_successive_merges: %zd",
        max_successive_merges);
413 414
}   // Options::Dump

415 416 417 418
//
// 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.
419 420 421
Options*
Options::PrepareForBulkLoad()
{
422
  // never slowdown ingest.
423 424 425
  level0_file_num_compaction_trigger = (1<<30);
  level0_slowdown_writes_trigger = (1<<30);
  level0_stop_writes_trigger = (1<<30);
426 427 428

  // no auto compactions please. The application should issue a
  // manual compaction after all data is loaded into L0.
429 430 431
  disable_auto_compactions = true;
  disable_seek_compaction = true;
  disableDataSync = true;
432 433 434

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

437 438 439 440 441 442 443 444 445 446 447 448
  // 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;

  // 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;
449 450 451
  return this;
}

452
}  // namespace rocksdb