options.cc 24.5 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 21 22 23
#include "rocksdb/cache.h"
#include "rocksdb/compaction_filter.h"
#include "rocksdb/comparator.h"
#include "rocksdb/env.h"
24
#include "rocksdb/memtablerep.h"
K
kailiu 已提交
25
#include "rocksdb/merge_operator.h"
26 27
#include "rocksdb/slice.h"
#include "rocksdb/slice_transform.h"
K
kailiu 已提交
28
#include "rocksdb/table.h"
29
#include "rocksdb/table_properties.h"
S
Siying Dong 已提交
30
#include "table/block_based_table_factory.h"
L
Lei Jin 已提交
31
#include "util/statistics.h"
J
jorlow@chromium.org 已提交
32

33
namespace rocksdb {
J
jorlow@chromium.org 已提交
34

L
Lei Jin 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
ImmutableCFOptions::ImmutableCFOptions(const Options& options)
  : prefix_extractor(options.prefix_extractor.get()),
    comparator(options.comparator),
    merge_operator(options.merge_operator.get()),
    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),
    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) {}

55
ColumnFamilyOptions::ColumnFamilyOptions()
J
jorlow@chromium.org 已提交
56
    : comparator(BytewiseComparator()),
57
      merge_operator(nullptr),
58
      compaction_filter(nullptr),
59 60
      compaction_filter_factory(std::shared_ptr<CompactionFilterFactory>(
          new DefaultCompactionFilterFactory())),
61
      compaction_filter_factory_v2(new DefaultCompactionFilterFactoryV2()),
62
      write_buffer_size(4 << 20),
63
      max_write_buffer_number(2),
64
      min_write_buffer_number_to_merge(1),
S
Sanjay Ghemawat 已提交
65
      compression(kSnappyCompression),
T
Tyler Harter 已提交
66
      prefix_extractor(nullptr),
67 68
      num_levels(7),
      level0_file_num_compaction_trigger(4),
S
sdong 已提交
69 70
      level0_slowdown_writes_trigger(20),
      level0_stop_writes_trigger(24),
71 72
      max_mem_compaction_level(2),
      target_file_size_base(2 * 1048576),
73
      target_file_size_multiplier(1),
H
heyongqiang 已提交
74
      max_bytes_for_level_base(10 * 1048576),
75
      max_bytes_for_level_multiplier(10),
76
      max_bytes_for_level_multiplier_additional(num_levels, 1),
77
      expanded_compaction_factor(25),
78
      source_compaction_factor(1),
79
      max_grandparent_overlap_factor(10),
80 81 82
      soft_rate_limit(0.0),
      hard_rate_limit(0.0),
      rate_limit_delay_max_milliseconds(1000),
83
      arena_block_size(0),
84 85 86
      disable_auto_compactions(false),
      purge_redundant_kvs_while_flush(true),
      compaction_style(kCompactionStyleLevel),
87
      verify_checksums_in_compaction(true),
88 89 90 91
      filter_deletes(false),
      max_sequential_skip_in_iterations(8),
      memtable_factory(std::shared_ptr<SkipListFactory>(new SkipListFactory)),
      table_factory(
92
          std::shared_ptr<TableFactory>(new BlockBasedTableFactory())),
93
      inplace_update_support(false),
I
Igor Canadi 已提交
94
      inplace_update_num_locks(10000),
95 96 97
      inplace_callback(nullptr),
      memtable_prefix_bloom_bits(0),
      memtable_prefix_bloom_probes(6),
98
      memtable_prefix_bloom_huge_page_tlb_size(0),
I
Igor Canadi 已提交
99
      bloom_locality(0),
100 101
      max_successive_merges(0),
      min_partial_merge_operands(2) {
102 103 104
  assert(memtable_factory.get() != nullptr);
}

105 106 107 108 109
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),
110
      compaction_filter_factory_v2(options.compaction_filter_factory_v2),
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
      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),
      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),
      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),
      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),
138
      arena_block_size(options.arena_block_size),
139 140 141
      disable_auto_compactions(options.disable_auto_compactions),
      purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush),
      compaction_style(options.compaction_style),
142
      verify_checksums_in_compaction(options.verify_checksums_in_compaction),
143
      compaction_options_universal(options.compaction_options_universal),
I
Igor Canadi 已提交
144
      compaction_options_fifo(options.compaction_options_fifo),
145 146 147 148 149
      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 已提交
150 151
      table_properties_collector_factories(
          options.table_properties_collector_factories),
152
      inplace_update_support(options.inplace_update_support),
153
      inplace_update_num_locks(options.inplace_update_num_locks),
154 155 156
      inplace_callback(options.inplace_callback),
      memtable_prefix_bloom_bits(options.memtable_prefix_bloom_bits),
      memtable_prefix_bloom_probes(options.memtable_prefix_bloom_probes),
157 158
      memtable_prefix_bloom_huge_page_tlb_size(
          options.memtable_prefix_bloom_huge_page_tlb_size),
I
Igor Canadi 已提交
159
      bloom_locality(options.bloom_locality),
160 161
      max_successive_merges(options.max_successive_merges),
      min_partial_merge_operands(options.min_partial_merge_operands) {
162
  assert(memtable_factory.get() != nullptr);
163 164
  if (max_bytes_for_level_multiplier_additional.size() <
      static_cast<unsigned int>(num_levels)) {
165 166
    max_bytes_for_level_multiplier_additional.resize(num_levels, 1);
  }
167 168
}

169 170
DBOptions::DBOptions()
    : create_if_missing(false),
I
Igor Canadi 已提交
171
      create_missing_column_families(false),
172
      error_if_exists(false),
173
      paranoid_checks(true),
174
      env(Env::Default()),
L
Lei Jin 已提交
175
      rate_limiter(nullptr),
176
      info_log(nullptr),
177
      info_log_level(INFO_LEVEL),
178
      max_open_files(5000),
I
Igor Canadi 已提交
179
      max_total_wal_size(0),
180
      statistics(nullptr),
181
      disableDataSync(false),
182
      use_fsync(false),
183
      db_log_dir(""),
184
      wal_dir(""),
I
Igor Canadi 已提交
185
      delete_obsolete_files_period_micros(6 * 60 * 60 * 1000000UL),
186
      max_background_compactions(1),
187
      max_background_flushes(1),
188
      max_log_file_size(0),
K
Kai Liu 已提交
189 190
      log_file_time_to_roll(0),
      keep_log_file_num(1000),
A
Abhishek Kona 已提交
191
      max_manifest_file_size(std::numeric_limits<uint64_t>::max()),
192 193
      table_cache_numshardbits(4),
      table_cache_remove_scan_count_limit(16),
194
      WAL_ttl_seconds(0),
195
      WAL_size_limit_MB(0),
196
      manifest_preallocation_size(4 * 1024 * 1024),
197 198
      allow_os_buffer(true),
      allow_mmap_reads(false),
S
sdong 已提交
199
      allow_mmap_writes(false),
200
      is_fd_close_on_exec(true),
201
      skip_log_error_on_recovery(false),
202
      stats_dump_period_sec(3600),
203
      advise_random_on_open(true),
H
Haobo Xu 已提交
204
      access_hint_on_compaction_start(NORMAL),
H
Haobo Xu 已提交
205
      use_adaptive_mutex(false),
206 207
      allow_thread_local(true),
      bytes_per_sync(0) {}
J
jorlow@chromium.org 已提交
208

209 210
DBOptions::DBOptions(const Options& options)
    : create_if_missing(options.create_if_missing),
I
Igor Canadi 已提交
211
      create_missing_column_families(options.create_missing_column_families),
212 213 214
      error_if_exists(options.error_if_exists),
      paranoid_checks(options.paranoid_checks),
      env(options.env),
L
Lei Jin 已提交
215
      rate_limiter(options.rate_limiter),
216
      info_log(options.info_log),
217
      info_log_level(options.info_log_level),
218
      max_open_files(options.max_open_files),
I
Igor Canadi 已提交
219
      max_total_wal_size(options.max_total_wal_size),
220
      statistics(options.statistics),
221 222
      disableDataSync(options.disableDataSync),
      use_fsync(options.use_fsync),
223
      db_paths(options.db_paths),
224 225 226 227 228 229 230 231 232 233
      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),
234 235 236
      table_cache_numshardbits(options.table_cache_numshardbits),
      table_cache_remove_scan_count_limit(
          options.table_cache_remove_scan_count_limit),
237 238 239 240 241 242 243 244 245 246 247 248
      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),
249 250
      allow_thread_local(options.allow_thread_local),
      bytes_per_sync(options.bytes_per_sync) {}
251

252 253 254 255
static const char* const access_hints[] = {
  "NONE", "NORMAL", "SEQUENTIAL", "WILLNEED"
};

256
void DBOptions::Dump(Logger* log) const {
257
    Log(log,"         Options.error_if_exists: %d", error_if_exists);
T
Tyler Harter 已提交
258
    Log(log,"       Options.create_if_missing: %d", create_if_missing);
259 260
    Log(log,"         Options.paranoid_checks: %d", paranoid_checks);
    Log(log,"                     Options.env: %p", env);
261
    Log(log,"                Options.info_log: %p", info_log.get());
262
    Log(log,"          Options.max_open_files: %d", max_open_files);
I
Igor Canadi 已提交
263
    Log(log,"      Options.max_total_wal_size: %" PRIu64, max_total_wal_size);
264 265 266 267 268 269 270 271 272 273
    Log(log, "       Options.disableDataSync: %d", disableDataSync);
    Log(log, "             Options.use_fsync: %d", use_fsync);
    Log(log, "     Options.max_log_file_size: %zu", max_log_file_size);
    Log(log, "Options.max_manifest_file_size: %lu",
        (unsigned long)max_manifest_file_size);
    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);
    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);
I
Igor Canadi 已提交
274 275
    Log(log, "         Options.create_missing_column_families: %d",
        create_missing_column_families);
276 277
    Log(log, "                             Options.db_log_dir: %s",
        db_log_dir.c_str());
I
Igor Canadi 已提交
278
    Log(log, "                                Options.wal_dir: %s",
279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
        wal_dir.c_str());
    Log(log, "               Options.table_cache_numshardbits: %d",
        table_cache_numshardbits);
    Log(log, "    Options.table_cache_remove_scan_count_limit: %d",
        table_cache_remove_scan_count_limit);
    Log(log, "    Options.delete_obsolete_files_period_micros: %lu",
        (unsigned long)delete_obsolete_files_period_micros);
    Log(log, "             Options.max_background_compactions: %d",
        max_background_compactions);
    Log(log, "                 Options.max_background_flushes: %d",
        max_background_flushes);
    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);
    Log(log, "            Options.manifest_preallocation_size: %zu",
        manifest_preallocation_size);
    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);
    Log(log, "              Options.skip_log_error_on_recovery: %d",
        skip_log_error_on_recovery);
    Log(log, "                   Options.stats_dump_period_sec: %u",
        stats_dump_period_sec);
    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]);
    Log(log, "                      Options.use_adaptive_mutex: %d",
        use_adaptive_mutex);
314 315
    Log(log, "                            Options.rate_limiter: %p",
        rate_limiter.get());
316 317 318 319 320 321 322 323
    Log(log, "                          Options.bytes_per_sync: %lu",
        (unsigned long)bytes_per_sync);
}  // DBOptions::Dump

void ColumnFamilyOptions::Dump(Logger* log) const {
  Log(log, "              Options.comparator: %s", comparator->Name());
  Log(log, "          Options.merge_operator: %s",
      merge_operator ? merge_operator->Name() : "None");
324 325
  Log(log, "       Options.compaction_filter: %s",
      compaction_filter ? compaction_filter->Name() : "None");
326 327
  Log(log, "       Options.compaction_filter_factory: %s",
      compaction_filter_factory->Name());
328 329
  Log(log, "       Options.compaction_filter_factory_v2: %s",
      compaction_filter_factory_v2->Name());
330 331
  Log(log, "        Options.memtable_factory: %s", memtable_factory->Name());
  Log(log, "           Options.table_factory: %s", table_factory->Name());
L
Lei Jin 已提交
332 333
  Log(log, "           table_factory options: %s",
      table_factory->GetPrintableTableOptions().c_str());
334 335
  Log(log, "       Options.write_buffer_size: %zd", write_buffer_size);
  Log(log, " Options.max_write_buffer_number: %d", max_write_buffer_number);
336
    if (!compression_per_level.empty()) {
337
      for (unsigned int i = 0; i < compression_per_level.size(); i++) {
338
          Log(log,"       Options.compression[%d]: %d",
339 340 341
              i, compression_per_level[i]);
       }
    } else {
342
      Log(log,"         Options.compression: %d", compression);
343
    }
T
Tyler Harter 已提交
344 345
    Log(log,"      Options.prefix_extractor: %s",
        prefix_extractor == nullptr ? "nullptr" : prefix_extractor->Name());
346
    Log(log,"            Options.num_levels: %d", num_levels);
347 348
    Log(log,"       Options.min_write_buffer_number_to_merge: %d",
        min_write_buffer_number_to_merge);
349 350
    Log(log,"        Options.purge_redundant_kvs_while_flush: %d",
         purge_redundant_kvs_while_flush);
351 352 353 354 355 356
    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);
357 358 359 360 361 362 363 364 365 366 367 368
    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 已提交
369 370
    Log(log,"               Options.max_bytes_for_level_base: %lu",
        (unsigned long)max_bytes_for_level_base);
371 372
    Log(log,"         Options.max_bytes_for_level_multiplier: %d",
        max_bytes_for_level_multiplier);
373 374 375 376
    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 已提交
377 378
    Log(log,"      Options.max_sequential_skip_in_iterations: %lu",
        (unsigned long)max_sequential_skip_in_iterations);
379 380
    Log(log,"             Options.expanded_compaction_factor: %d",
        expanded_compaction_factor);
381 382
    Log(log,"               Options.source_compaction_factor: %d",
        source_compaction_factor);
383 384
    Log(log,"         Options.max_grandparent_overlap_factor: %d",
        max_grandparent_overlap_factor);
I
Igor Canadi 已提交
385
    Log(log,"                       Options.arena_block_size: %zu",
X
Xing Jin 已提交
386
        arena_block_size);
T
Tyler Harter 已提交
387 388
    Log(log,"                      Options.soft_rate_limit: %.2f",
        soft_rate_limit);
J
Jim Paton 已提交
389 390
    Log(log,"                      Options.hard_rate_limit: %.2f",
        hard_rate_limit);
391
    Log(log,"      Options.rate_limit_delay_max_milliseconds: %u",
J
Jim Paton 已提交
392
        rate_limit_delay_max_milliseconds);
393 394
    Log(log,"               Options.disable_auto_compactions: %d",
        disable_auto_compactions);
395 396
    Log(log,"         Options.purge_redundant_kvs_while_flush: %d",
        purge_redundant_kvs_while_flush);
397 398
    Log(log,"                          Options.filter_deletes: %d",
        filter_deletes);
399 400
    Log(log, "          Options.verify_checksums_in_compaction: %d",
        verify_checksums_in_compaction);
401 402
    Log(log,"                        Options.compaction_style: %d",
        compaction_style);
403
    Log(log," Options.compaction_options_universal.size_ratio: %u",
404
        compaction_options_universal.size_ratio);
405
    Log(log,"Options.compaction_options_universal.min_merge_width: %u",
406
        compaction_options_universal.min_merge_width);
407
    Log(log,"Options.compaction_options_universal.max_merge_width: %u",
408
        compaction_options_universal.max_merge_width);
409 410 411
    Log(log,"Options.compaction_options_universal."
            "max_size_amplification_percent: %u",
        compaction_options_universal.max_size_amplification_percent);
412 413 414
    Log(log,
        "Options.compaction_options_universal.compression_size_percent: %u",
        compaction_options_universal.compression_size_percent);
I
Igor Canadi 已提交
415 416
    Log(log, "Options.compaction_options_fifo.max_table_files_size: %" PRIu64,
        compaction_options_fifo.max_table_files_size);
417
    std::string collector_names;
I
Igor Canadi 已提交
418 419
    for (const auto& collector_factory : table_properties_collector_factories) {
      collector_names.append(collector_factory->Name());
420 421
      collector_names.append("; ");
    }
K
kailiu 已提交
422
    Log(log, "                  Options.table_properties_collectors: %s",
423
        collector_names.c_str());
424
    Log(log, "                  Options.inplace_update_support: %d",
425
        inplace_update_support);
426
    Log(log, "                Options.inplace_update_num_locks: %zd",
427
        inplace_update_num_locks);
428 429
    Log(log, "              Options.min_partial_merge_operands: %u",
        min_partial_merge_operands);
430 431 432 433 434
    // 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);
435 436
    Log(log, "  Options.memtable_prefix_bloom_huge_page_tlb_size: %zu",
        memtable_prefix_bloom_huge_page_tlb_size);
I
Igor Canadi 已提交
437 438
    Log(log, "                          Options.bloom_locality: %d",
        bloom_locality);
439 440
    Log(log, "                   Options.max_successive_merges: %zd",
        max_successive_merges);
441 442 443 444 445
}  // ColumnFamilyOptions::Dump

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

448 449 450 451
//
// 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.
452 453 454
Options*
Options::PrepareForBulkLoad()
{
455
  // never slowdown ingest.
456 457 458
  level0_file_num_compaction_trigger = (1<<30);
  level0_slowdown_writes_trigger = (1<<30);
  level0_stop_writes_trigger = (1<<30);
459 460 461

  // no auto compactions please. The application should issue a
  // manual compaction after all data is loaded into L0.
462 463
  disable_auto_compactions = true;
  disableDataSync = true;
464 465 466

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

469 470 471 472 473 474 475 476 477 478 479 480
  // 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;
481 482 483
  return this;
}

484
// Optimization functions
L
Lei Jin 已提交
485 486
ColumnFamilyOptions* ColumnFamilyOptions::OptimizeForPointLookup(
    uint64_t block_cache_size_mb) {
487 488
  prefix_extractor.reset(NewNoopTransform());
  BlockBasedTableOptions block_based_options;
L
Lei Jin 已提交
489 490 491 492
  block_based_options.index_type = BlockBasedTableOptions::kHashSearch;
  block_based_options.filter_policy.reset(NewBloomFilterPolicy(10));
  block_based_options.block_cache =
    NewLRUCache(block_cache_size_mb * 1024 * 1024);
493
  table_factory.reset(new BlockBasedTableFactory(block_based_options));
494
#ifndef ROCKSDB_LITE
495
  memtable_factory.reset(NewHashLinkListRepFactory());
496
#endif
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
  return this;
}

ColumnFamilyOptions* ColumnFamilyOptions::OptimizeLevelStyleCompaction(
    uint64_t memtable_memory_budget) {
  write_buffer_size = memtable_memory_budget / 4;
  // 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) {
  write_buffer_size = memtable_memory_budget / 4;
  // 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;
}

554
}  // namespace rocksdb