db_options.cc 40.0 KB
Newer Older
1
// Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
S
Siying Dong 已提交
2 3 4
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
5

6
#include "options/db_options.h"
7

8
#include <cinttypes>
9

10
#include "logging/logging.h"
11
#include "options/configurable_helper.h"
12
#include "options/options_helper.h"
13
#include "options/options_parser.h"
14
#include "port/port.h"
15
#include "rocksdb/configurable.h"
16
#include "rocksdb/env.h"
17
#include "rocksdb/file_system.h"
18
#include "rocksdb/rate_limiter.h"
19
#include "rocksdb/sst_file_manager.h"
20
#include "rocksdb/system_clock.h"
21
#include "rocksdb/utilities/options_type.h"
22
#include "rocksdb/wal_filter.h"
23
#include "util/string_util.h"
24

25
namespace ROCKSDB_NAMESPACE {
26
#ifndef ROCKSDB_LITE
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
static std::unordered_map<std::string, WALRecoveryMode>
    wal_recovery_mode_string_map = {
        {"kTolerateCorruptedTailRecords",
         WALRecoveryMode::kTolerateCorruptedTailRecords},
        {"kAbsoluteConsistency", WALRecoveryMode::kAbsoluteConsistency},
        {"kPointInTimeRecovery", WALRecoveryMode::kPointInTimeRecovery},
        {"kSkipAnyCorruptedRecords",
         WALRecoveryMode::kSkipAnyCorruptedRecords}};

static std::unordered_map<std::string, DBOptions::AccessHint>
    access_hint_string_map = {{"NONE", DBOptions::AccessHint::NONE},
                              {"NORMAL", DBOptions::AccessHint::NORMAL},
                              {"SEQUENTIAL", DBOptions::AccessHint::SEQUENTIAL},
                              {"WILLNEED", DBOptions::AccessHint::WILLNEED}};

static std::unordered_map<std::string, InfoLogLevel> info_log_level_string_map =
    {{"DEBUG_LEVEL", InfoLogLevel::DEBUG_LEVEL},
     {"INFO_LEVEL", InfoLogLevel::INFO_LEVEL},
     {"WARN_LEVEL", InfoLogLevel::WARN_LEVEL},
     {"ERROR_LEVEL", InfoLogLevel::ERROR_LEVEL},
     {"FATAL_LEVEL", InfoLogLevel::FATAL_LEVEL},
     {"HEADER_LEVEL", InfoLogLevel::HEADER_LEVEL}};

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 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 124 125 126 127 128 129 130
static std::unordered_map<std::string, OptionTypeInfo>
    db_mutable_options_type_info = {
        {"allow_os_buffer",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
          OptionTypeFlags::kMutable}},
        {"max_background_jobs",
         {offsetof(struct MutableDBOptions, max_background_jobs),
          OptionType::kInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"max_background_compactions",
         {offsetof(struct MutableDBOptions, max_background_compactions),
          OptionType::kInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"base_background_compactions",
         {offsetof(struct MutableDBOptions, base_background_compactions),
          OptionType::kInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"max_subcompactions",
         {offsetof(struct MutableDBOptions, max_subcompactions),
          OptionType::kUInt32T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"avoid_flush_during_shutdown",
         {offsetof(struct MutableDBOptions, avoid_flush_during_shutdown),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"writable_file_max_buffer_size",
         {offsetof(struct MutableDBOptions, writable_file_max_buffer_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"delayed_write_rate",
         {offsetof(struct MutableDBOptions, delayed_write_rate),
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"max_total_wal_size",
         {offsetof(struct MutableDBOptions, max_total_wal_size),
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"delete_obsolete_files_period_micros",
         {offsetof(struct MutableDBOptions,
                   delete_obsolete_files_period_micros),
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"stats_dump_period_sec",
         {offsetof(struct MutableDBOptions, stats_dump_period_sec),
          OptionType::kUInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"stats_persist_period_sec",
         {offsetof(struct MutableDBOptions, stats_persist_period_sec),
          OptionType::kUInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"stats_history_buffer_size",
         {offsetof(struct MutableDBOptions, stats_history_buffer_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"max_open_files",
         {offsetof(struct MutableDBOptions, max_open_files), OptionType::kInt,
          OptionVerificationType::kNormal, OptionTypeFlags::kMutable}},
        {"bytes_per_sync",
         {offsetof(struct MutableDBOptions, bytes_per_sync),
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"wal_bytes_per_sync",
         {offsetof(struct MutableDBOptions, wal_bytes_per_sync),
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"strict_bytes_per_sync",
         {offsetof(struct MutableDBOptions, strict_bytes_per_sync),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"compaction_readahead_size",
         {offsetof(struct MutableDBOptions, compaction_readahead_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
        {"max_background_flushes",
         {offsetof(struct MutableDBOptions, max_background_flushes),
          OptionType::kInt, OptionVerificationType::kNormal,
          OptionTypeFlags::kMutable}},
};

static std::unordered_map<std::string, OptionTypeInfo>
    db_immutable_options_type_info = {
131 132 133 134 135 136 137 138 139
        /*
         // not yet supported
          std::shared_ptr<Cache> row_cache;
          std::shared_ptr<DeleteScheduler> delete_scheduler;
          std::shared_ptr<Logger> info_log;
          std::shared_ptr<RateLimiter> rate_limiter;
          std::shared_ptr<Statistics> statistics;
          std::vector<DbPath> db_paths;
          std::vector<std::shared_ptr<EventListener>> listeners;
140
          FileTypeSet checksum_handoff_file_types;
141 142
         */
        {"advise_random_on_open",
143
         {offsetof(struct ImmutableDBOptions, advise_random_on_open),
144
          OptionType::kBoolean, OptionVerificationType::kNormal,
145
          OptionTypeFlags::kNone}},
146
        {"allow_mmap_reads",
147 148 149
         {offsetof(struct ImmutableDBOptions, allow_mmap_reads),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
150
        {"allow_fallocate",
151 152 153
         {offsetof(struct ImmutableDBOptions, allow_fallocate),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
154
        {"allow_mmap_writes",
155 156 157
         {offsetof(struct ImmutableDBOptions, allow_mmap_writes),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
158
        {"use_direct_reads",
159 160 161
         {offsetof(struct ImmutableDBOptions, use_direct_reads),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
162 163
        {"use_direct_writes",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
164
          OptionTypeFlags::kNone}},
165
        {"use_direct_io_for_flush_and_compaction",
166 167
         {offsetof(struct ImmutableDBOptions,
                   use_direct_io_for_flush_and_compaction),
168
          OptionType::kBoolean, OptionVerificationType::kNormal,
169
          OptionTypeFlags::kNone}},
170
        {"allow_2pc",
171 172
         {offsetof(struct ImmutableDBOptions, allow_2pc), OptionType::kBoolean,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
173
        {"create_if_missing",
174 175 176
         {offsetof(struct ImmutableDBOptions, create_if_missing),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
177
        {"create_missing_column_families",
178
         {offsetof(struct ImmutableDBOptions, create_missing_column_families),
179
          OptionType::kBoolean, OptionVerificationType::kNormal,
180
          OptionTypeFlags::kNone}},
181 182
        {"disableDataSync",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
183
          OptionTypeFlags::kNone}},
184 185
        {"disable_data_sync",  // for compatibility
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
186
          OptionTypeFlags::kNone}},
187
        {"enable_thread_tracking",
188
         {offsetof(struct ImmutableDBOptions, enable_thread_tracking),
189
          OptionType::kBoolean, OptionVerificationType::kNormal,
190
          OptionTypeFlags::kNone}},
191
        {"error_if_exists",
192 193 194
         {offsetof(struct ImmutableDBOptions, error_if_exists),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
195
        {"is_fd_close_on_exec",
196 197 198
         {offsetof(struct ImmutableDBOptions, is_fd_close_on_exec),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
199
        {"paranoid_checks",
200
         {offsetof(struct ImmutableDBOptions, paranoid_checks),
201
          OptionType::kBoolean, OptionVerificationType::kNormal,
202
          OptionTypeFlags::kNone}},
203 204 205 206 207
        {"track_and_verify_wals_in_manifest",
         {offsetof(struct ImmutableDBOptions,
                   track_and_verify_wals_in_manifest),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
208 209 210
        {"skip_log_error_on_recovery",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
          OptionTypeFlags::kNone}},
211
        {"skip_stats_update_on_db_open",
212
         {offsetof(struct ImmutableDBOptions, skip_stats_update_on_db_open),
213
          OptionType::kBoolean, OptionVerificationType::kNormal,
214
          OptionTypeFlags::kNone}},
215
        {"skip_checking_sst_file_sizes_on_db_open",
216 217
         {offsetof(struct ImmutableDBOptions,
                   skip_checking_sst_file_sizes_on_db_open),
218
          OptionType::kBoolean, OptionVerificationType::kNormal,
219
          OptionTypeFlags::kNone}},
220
        {"new_table_reader_for_compaction_inputs",
221 222
         {offsetof(struct ImmutableDBOptions,
                   new_table_reader_for_compaction_inputs),
223
          OptionType::kBoolean, OptionVerificationType::kNormal,
224
          OptionTypeFlags::kNone}},
225
        {"random_access_max_buffer_size",
226
         {offsetof(struct ImmutableDBOptions, random_access_max_buffer_size),
227
          OptionType::kSizeT, OptionVerificationType::kNormal,
228
          OptionTypeFlags::kNone}},
229
        {"use_adaptive_mutex",
230 231 232
         {offsetof(struct ImmutableDBOptions, use_adaptive_mutex),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
233
        {"use_fsync",
234 235
         {offsetof(struct ImmutableDBOptions, use_fsync), OptionType::kBoolean,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
236
        {"max_file_opening_threads",
237
         {offsetof(struct ImmutableDBOptions, max_file_opening_threads),
238
          OptionType::kInt, OptionVerificationType::kNormal,
239
          OptionTypeFlags::kNone}},
240
        {"table_cache_numshardbits",
241
         {offsetof(struct ImmutableDBOptions, table_cache_numshardbits),
242
          OptionType::kInt, OptionVerificationType::kNormal,
243
          OptionTypeFlags::kNone}},
244
        {"db_write_buffer_size",
245 246 247
         {offsetof(struct ImmutableDBOptions, db_write_buffer_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
248
        {"keep_log_file_num",
249 250 251
         {offsetof(struct ImmutableDBOptions, keep_log_file_num),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
252
        {"recycle_log_file_num",
253 254 255
         {offsetof(struct ImmutableDBOptions, recycle_log_file_num),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
256
        {"log_file_time_to_roll",
257 258 259
         {offsetof(struct ImmutableDBOptions, log_file_time_to_roll),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
260
        {"manifest_preallocation_size",
261
         {offsetof(struct ImmutableDBOptions, manifest_preallocation_size),
262
          OptionType::kSizeT, OptionVerificationType::kNormal,
263
          OptionTypeFlags::kNone}},
264
        {"max_log_file_size",
265 266 267
         {offsetof(struct ImmutableDBOptions, max_log_file_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
268
        {"db_log_dir",
269 270
         {offsetof(struct ImmutableDBOptions, db_log_dir), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
271
        {"wal_dir",
272 273
         {offsetof(struct ImmutableDBOptions, wal_dir), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
274
        {"WAL_size_limit_MB",
275
         {offsetof(struct ImmutableDBOptions, WAL_size_limit_MB),
276 277
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
278
        {"WAL_ttl_seconds",
279
         {offsetof(struct ImmutableDBOptions, WAL_ttl_seconds),
280
          OptionType::kUInt64T, OptionVerificationType::kNormal,
281
          OptionTypeFlags::kNone}},
282
        {"max_manifest_file_size",
283
         {offsetof(struct ImmutableDBOptions, max_manifest_file_size),
284
          OptionType::kUInt64T, OptionVerificationType::kNormal,
285
          OptionTypeFlags::kNone}},
286
        {"persist_stats_to_disk",
287
         {offsetof(struct ImmutableDBOptions, persist_stats_to_disk),
288
          OptionType::kBoolean, OptionVerificationType::kNormal,
289
          OptionTypeFlags::kNone}},
290
        {"fail_if_options_file_error",
291
         {offsetof(struct ImmutableDBOptions, fail_if_options_file_error),
292
          OptionType::kBoolean, OptionVerificationType::kNormal,
293
          OptionTypeFlags::kNone}},
294
        {"enable_pipelined_write",
295
         {offsetof(struct ImmutableDBOptions, enable_pipelined_write),
296
          OptionType::kBoolean, OptionVerificationType::kNormal,
297
          OptionTypeFlags::kNone}},
298
        {"unordered_write",
299 300 301
         {offsetof(struct ImmutableDBOptions, unordered_write),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
302
        {"allow_concurrent_memtable_write",
303
         {offsetof(struct ImmutableDBOptions, allow_concurrent_memtable_write),
304
          OptionType::kBoolean, OptionVerificationType::kNormal,
305 306 307 308 309
          OptionTypeFlags::kNone}},
        {"wal_recovery_mode",
         OptionTypeInfo::Enum<WALRecoveryMode>(
             offsetof(struct ImmutableDBOptions, wal_recovery_mode),
             &wal_recovery_mode_string_map)},
310
        {"enable_write_thread_adaptive_yield",
311 312
         {offsetof(struct ImmutableDBOptions,
                   enable_write_thread_adaptive_yield),
313
          OptionType::kBoolean, OptionVerificationType::kNormal,
314
          OptionTypeFlags::kNone}},
315
        {"write_thread_slow_yield_usec",
316
         {offsetof(struct ImmutableDBOptions, write_thread_slow_yield_usec),
317
          OptionType::kUInt64T, OptionVerificationType::kNormal,
318
          OptionTypeFlags::kNone}},
319
        {"max_write_batch_group_size_bytes",
320
         {offsetof(struct ImmutableDBOptions, max_write_batch_group_size_bytes),
321
          OptionType::kUInt64T, OptionVerificationType::kNormal,
322
          OptionTypeFlags::kNone}},
323
        {"write_thread_max_yield_usec",
324
         {offsetof(struct ImmutableDBOptions, write_thread_max_yield_usec),
325
          OptionType::kUInt64T, OptionVerificationType::kNormal,
326
          OptionTypeFlags::kNone}},
327
        {"access_hint_on_compaction_start",
328
         OptionTypeInfo::Enum<DBOptions::AccessHint>(
329 330
             offsetof(struct ImmutableDBOptions,
                      access_hint_on_compaction_start),
331
             &access_hint_string_map)},
332 333 334 335
        {"info_log_level",
         OptionTypeInfo::Enum<InfoLogLevel>(
             offsetof(struct ImmutableDBOptions, info_log_level),
             &info_log_level_string_map)},
336
        {"dump_malloc_stats",
337
         {offsetof(struct ImmutableDBOptions, dump_malloc_stats),
338
          OptionType::kBoolean, OptionVerificationType::kNormal,
339 340 341
          OptionTypeFlags::kNone}},
        {"avoid_flush_during_recovery",
         {offsetof(struct ImmutableDBOptions, avoid_flush_during_recovery),
342
          OptionType::kBoolean, OptionVerificationType::kNormal,
343
          OptionTypeFlags::kNone}},
344
        {"allow_ingest_behind",
345 346 347
         {offsetof(struct ImmutableDBOptions, allow_ingest_behind),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
348
        {"preserve_deletes",
349 350 351
         {offsetof(struct ImmutableDBOptions, preserve_deletes),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
352 353
        {"concurrent_prepare",  // Deprecated by two_write_queues
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
354
          OptionTypeFlags::kNone}},
355
        {"two_write_queues",
356 357 358
         {offsetof(struct ImmutableDBOptions, two_write_queues),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
359
        {"manual_wal_flush",
360 361 362
         {offsetof(struct ImmutableDBOptions, manual_wal_flush),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
363 364
        {"seq_per_batch",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
365
          OptionTypeFlags::kNone}},
366
        {"atomic_flush",
367 368 369
         {offsetof(struct ImmutableDBOptions, atomic_flush),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
370
        {"avoid_unnecessary_blocking_io",
371
         {offsetof(struct ImmutableDBOptions, avoid_unnecessary_blocking_io),
372
          OptionType::kBoolean, OptionVerificationType::kNormal,
373
          OptionTypeFlags::kNone}},
374
        {"write_dbid_to_manifest",
375
         {offsetof(struct ImmutableDBOptions, write_dbid_to_manifest),
376
          OptionType::kBoolean, OptionVerificationType::kNormal,
377
          OptionTypeFlags::kNone}},
378
        {"log_readahead_size",
379 380 381
         {offsetof(struct ImmutableDBOptions, log_readahead_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
382
        {"best_efforts_recovery",
383
         {offsetof(struct ImmutableDBOptions, best_efforts_recovery),
384
          OptionType::kBoolean, OptionVerificationType::kNormal,
385
          OptionTypeFlags::kNone}},
386
        {"max_bgerror_resume_count",
387
         {offsetof(struct ImmutableDBOptions, max_bgerror_resume_count),
388
          OptionType::kInt, OptionVerificationType::kNormal,
389
          OptionTypeFlags::kNone}},
390
        {"bgerror_resume_retry_interval",
391
         {offsetof(struct ImmutableDBOptions, bgerror_resume_retry_interval),
392
          OptionType::kUInt64T, OptionVerificationType::kNormal,
393
          OptionTypeFlags::kNone}},
394 395 396
        {"db_host_id",
         {offsetof(struct ImmutableDBOptions, db_host_id), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kCompareNever}},
397 398 399 400
        // The following properties were handled as special cases in ParseOption
        // This means that the properties could be read from the options file
        // but never written to the file or compared to each other.
        {"rate_limiter_bytes_per_sec",
401 402 403
         {offsetof(struct ImmutableDBOptions, rate_limiter),
          OptionType::kUnknown, OptionVerificationType::kNormal,
          (OptionTypeFlags::kDontSerialize | OptionTypeFlags::kCompareNever),
404 405 406 407 408 409 410 411 412 413
          // Parse the input value as a RateLimiter
          [](const ConfigOptions& /*opts*/, const std::string& /*name*/,
             const std::string& value, char* addr) {
            auto limiter =
                reinterpret_cast<std::shared_ptr<RateLimiter>*>(addr);
            limiter->reset(NewGenericRateLimiter(
                static_cast<int64_t>(ParseUint64(value))));
            return Status::OK();
          }}},
        {"env",
414
         {offsetof(struct ImmutableDBOptions, env), OptionType::kUnknown,
415
          OptionVerificationType::kNormal,
416
          (OptionTypeFlags::kDontSerialize | OptionTypeFlags::kCompareNever),
417 418 419 420 421 422 423 424 425 426 427
          // Parse the input value as an Env
          [](const ConfigOptions& /*opts*/, const std::string& /*name*/,
             const std::string& value, char* addr) {
            auto old_env = reinterpret_cast<Env**>(addr);  // Get the old value
            Env* new_env = *old_env;                       // Set new to old
            Status s = Env::LoadEnv(value, &new_env);      // Update new value
            if (s.ok()) {                                  // It worked
              *old_env = new_env;                          // Update the old one
            }
            return s;
          }}},
428 429 430 431
        {"allow_data_in_errors",
         {offsetof(struct ImmutableDBOptions, allow_data_in_errors),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
432
};
433 434 435 436 437

const std::string OptionsHelper::kDBOptionsName = "DBOptions";

class MutableDBConfigurable : public Configurable {
 public:
438
  explicit MutableDBConfigurable(const MutableDBOptions& mdb) {
439
    mutable_ = mdb;
440
    RegisterOptions(&mutable_, &db_mutable_options_type_info);
441 442 443 444 445 446 447 448
  }

 protected:
  MutableDBOptions mutable_;
};

class DBOptionsConfigurable : public MutableDBConfigurable {
 public:
449
  explicit DBOptionsConfigurable(const DBOptions& opts)
450 451 452 453 454 455 456 457 458 459
      : MutableDBConfigurable(MutableDBOptions(opts)), db_options_(opts) {
    // The ImmutableDBOptions currently requires the env to be non-null.  Make
    // sure it is
    if (opts.env != nullptr) {
      immutable_ = ImmutableDBOptions(opts);
    } else {
      DBOptions copy = opts;
      copy.env = Env::Default();
      immutable_ = ImmutableDBOptions(copy);
    }
460
    RegisterOptions(&immutable_, &db_immutable_options_type_info);
461 462 463 464 465 466 467
  }

 protected:
  Status ConfigureOptions(
      const ConfigOptions& config_options,
      const std::unordered_map<std::string, std::string>& opts_map,
      std::unordered_map<std::string, std::string>* unused) override {
468
    Status s = Configurable::ConfigureOptions(config_options, opts_map, unused);
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497
    if (s.ok()) {
      db_options_ = BuildDBOptions(immutable_, mutable_);
      s = PrepareOptions(config_options);
    }
    return s;
  }

  const void* GetOptionsPtr(const std::string& name) const override {
    if (name == OptionsHelper::kDBOptionsName) {
      return &db_options_;
    } else {
      return MutableDBConfigurable::GetOptionsPtr(name);
    }
  }

 private:
  ImmutableDBOptions immutable_;
  DBOptions db_options_;
};

std::unique_ptr<Configurable> DBOptionsAsConfigurable(
    const MutableDBOptions& opts) {
  std::unique_ptr<Configurable> ptr(new MutableDBConfigurable(opts));
  return ptr;
}
std::unique_ptr<Configurable> DBOptionsAsConfigurable(const DBOptions& opts) {
  std::unique_ptr<Configurable> ptr(new DBOptionsConfigurable(opts));
  return ptr;
}
498
#endif  // ROCKSDB_LITE
499 500 501 502 503 504 505 506

ImmutableDBOptions::ImmutableDBOptions() : ImmutableDBOptions(Options()) {}

ImmutableDBOptions::ImmutableDBOptions(const DBOptions& options)
    : create_if_missing(options.create_if_missing),
      create_missing_column_families(options.create_missing_column_families),
      error_if_exists(options.error_if_exists),
      paranoid_checks(options.paranoid_checks),
507 508
      track_and_verify_wals_in_manifest(
          options.track_and_verify_wals_in_manifest),
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
      env(options.env),
      rate_limiter(options.rate_limiter),
      sst_file_manager(options.sst_file_manager),
      info_log(options.info_log),
      info_log_level(options.info_log_level),
      max_file_opening_threads(options.max_file_opening_threads),
      statistics(options.statistics),
      use_fsync(options.use_fsync),
      db_paths(options.db_paths),
      db_log_dir(options.db_log_dir),
      wal_dir(options.wal_dir),
      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),
      recycle_log_file_num(options.recycle_log_file_num),
      max_manifest_file_size(options.max_manifest_file_size),
      table_cache_numshardbits(options.table_cache_numshardbits),
526 527
      WAL_ttl_seconds(options.WAL_ttl_seconds),
      WAL_size_limit_MB(options.WAL_size_limit_MB),
528 529
      max_write_batch_group_size_bytes(
          options.max_write_batch_group_size_bytes),
530 531 532
      manifest_preallocation_size(options.manifest_preallocation_size),
      allow_mmap_reads(options.allow_mmap_reads),
      allow_mmap_writes(options.allow_mmap_writes),
533
      use_direct_reads(options.use_direct_reads),
534 535
      use_direct_io_for_flush_and_compaction(
          options.use_direct_io_for_flush_and_compaction),
536 537 538 539 540 541 542 543 544 545 546 547
      allow_fallocate(options.allow_fallocate),
      is_fd_close_on_exec(options.is_fd_close_on_exec),
      advise_random_on_open(options.advise_random_on_open),
      db_write_buffer_size(options.db_write_buffer_size),
      write_buffer_manager(options.write_buffer_manager),
      access_hint_on_compaction_start(options.access_hint_on_compaction_start),
      new_table_reader_for_compaction_inputs(
          options.new_table_reader_for_compaction_inputs),
      random_access_max_buffer_size(options.random_access_max_buffer_size),
      use_adaptive_mutex(options.use_adaptive_mutex),
      listeners(options.listeners),
      enable_thread_tracking(options.enable_thread_tracking),
548
      enable_pipelined_write(options.enable_pipelined_write),
M
Maysam Yabandeh 已提交
549
      unordered_write(options.unordered_write),
550 551 552 553 554 555
      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),
      skip_stats_update_on_db_open(options.skip_stats_update_on_db_open),
556 557
      skip_checking_sst_file_sizes_on_db_open(
          options.skip_checking_sst_file_sizes_on_db_open),
558 559 560 561 562 563 564 565
      wal_recovery_mode(options.wal_recovery_mode),
      allow_2pc(options.allow_2pc),
      row_cache(options.row_cache),
#ifndef ROCKSDB_LITE
      wal_filter(options.wal_filter),
#endif  // ROCKSDB_LITE
      fail_if_options_file_error(options.fail_if_options_file_error),
      dump_malloc_stats(options.dump_malloc_stats),
566
      avoid_flush_during_recovery(options.avoid_flush_during_recovery),
567
      allow_ingest_behind(options.allow_ingest_behind),
568
      preserve_deletes(options.preserve_deletes),
569
      two_write_queues(options.two_write_queues),
570
      manual_wal_flush(options.manual_wal_flush),
571
      atomic_flush(options.atomic_flush),
572
      avoid_unnecessary_blocking_io(options.avoid_unnecessary_blocking_io),
573
      persist_stats_to_disk(options.persist_stats_to_disk),
574
      write_dbid_to_manifest(options.write_dbid_to_manifest),
575
      log_readahead_size(options.log_readahead_size),
576
      file_checksum_gen_factory(options.file_checksum_gen_factory),
577 578
      best_efforts_recovery(options.best_efforts_recovery),
      max_bgerror_resume_count(options.max_bgerror_resume_count),
579
      bgerror_resume_retry_interval(options.bgerror_resume_retry_interval),
580
      allow_data_in_errors(options.allow_data_in_errors),
581 582
      db_host_id(options.db_host_id),
      checksum_handoff_file_types(options.checksum_handoff_file_types) {
583
  fs = env->GetFileSystem();
584 585 586 587 588
  if (env != nullptr) {
    clock = env->GetSystemClock().get();
  } else {
    clock = SystemClock::Default().get();
  }
589 590
  logger = info_log.get();
  stats = statistics.get();
591 592 593
}

void ImmutableDBOptions::Dump(Logger* log) const {
594 595 596 597 598 599
  ROCKS_LOG_HEADER(log, "                        Options.error_if_exists: %d",
                   error_if_exists);
  ROCKS_LOG_HEADER(log, "                      Options.create_if_missing: %d",
                   create_if_missing);
  ROCKS_LOG_HEADER(log, "                        Options.paranoid_checks: %d",
                   paranoid_checks);
600 601 602 603
  ROCKS_LOG_HEADER(log,
                   "                              "
                   "Options.track_and_verify_wals_in_manifest: %d",
                   track_and_verify_wals_in_manifest);
604 605
  ROCKS_LOG_HEADER(log, "                                    Options.env: %p",
                   env);
606 607
  ROCKS_LOG_HEADER(log, "                                     Options.fs: %s",
                   fs->Name());
608 609 610 611
  ROCKS_LOG_HEADER(log, "                               Options.info_log: %p",
                   info_log.get());
  ROCKS_LOG_HEADER(log, "               Options.max_file_opening_threads: %d",
                   max_file_opening_threads);
612 613
  ROCKS_LOG_HEADER(log, "                             Options.statistics: %p",
                   statistics.get());
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638
  ROCKS_LOG_HEADER(log, "                              Options.use_fsync: %d",
                   use_fsync);
  ROCKS_LOG_HEADER(
      log, "                      Options.max_log_file_size: %" ROCKSDB_PRIszt,
      max_log_file_size);
  ROCKS_LOG_HEADER(log,
                   "                 Options.max_manifest_file_size: %" PRIu64,
                   max_manifest_file_size);
  ROCKS_LOG_HEADER(
      log, "                  Options.log_file_time_to_roll: %" ROCKSDB_PRIszt,
      log_file_time_to_roll);
  ROCKS_LOG_HEADER(
      log, "                      Options.keep_log_file_num: %" ROCKSDB_PRIszt,
      keep_log_file_num);
  ROCKS_LOG_HEADER(
      log, "                   Options.recycle_log_file_num: %" ROCKSDB_PRIszt,
      recycle_log_file_num);
  ROCKS_LOG_HEADER(log, "                        Options.allow_fallocate: %d",
                   allow_fallocate);
  ROCKS_LOG_HEADER(log, "                       Options.allow_mmap_reads: %d",
                   allow_mmap_reads);
  ROCKS_LOG_HEADER(log, "                      Options.allow_mmap_writes: %d",
                   allow_mmap_writes);
  ROCKS_LOG_HEADER(log, "                       Options.use_direct_reads: %d",
                   use_direct_reads);
639 640 641 642
  ROCKS_LOG_HEADER(log,
                   "                       "
                   "Options.use_direct_io_for_flush_and_compaction: %d",
                   use_direct_io_for_flush_and_compaction);
643 644 645 646 647 648 649 650 651 652
  ROCKS_LOG_HEADER(log, "         Options.create_missing_column_families: %d",
                   create_missing_column_families);
  ROCKS_LOG_HEADER(log, "                             Options.db_log_dir: %s",
                   db_log_dir.c_str());
  ROCKS_LOG_HEADER(log, "                                Options.wal_dir: %s",
                   wal_dir.c_str());
  ROCKS_LOG_HEADER(log, "               Options.table_cache_numshardbits: %d",
                   table_cache_numshardbits);
  ROCKS_LOG_HEADER(log,
                   "                        Options.WAL_ttl_seconds: %" PRIu64,
653
                   WAL_ttl_seconds);
654 655
  ROCKS_LOG_HEADER(log,
                   "                      Options.WAL_size_limit_MB: %" PRIu64,
656
                   WAL_size_limit_MB);
657 658 659 660
  ROCKS_LOG_HEADER(log,
                   "                       "
                   "Options.max_write_batch_group_size_bytes: %" PRIu64,
                   max_write_batch_group_size_bytes);
661 662 663 664 665 666 667 668 669 670
  ROCKS_LOG_HEADER(
      log, "            Options.manifest_preallocation_size: %" ROCKSDB_PRIszt,
      manifest_preallocation_size);
  ROCKS_LOG_HEADER(log, "                    Options.is_fd_close_on_exec: %d",
                   is_fd_close_on_exec);
  ROCKS_LOG_HEADER(log, "                  Options.advise_random_on_open: %d",
                   advise_random_on_open);
  ROCKS_LOG_HEADER(
      log, "                   Options.db_write_buffer_size: %" ROCKSDB_PRIszt,
      db_write_buffer_size);
671 672
  ROCKS_LOG_HEADER(log, "                   Options.write_buffer_manager: %p",
                   write_buffer_manager.get());
673 674 675 676 677 678 679 680 681 682 683
  ROCKS_LOG_HEADER(log, "        Options.access_hint_on_compaction_start: %d",
                   static_cast<int>(access_hint_on_compaction_start));
  ROCKS_LOG_HEADER(log, " Options.new_table_reader_for_compaction_inputs: %d",
                   new_table_reader_for_compaction_inputs);
  ROCKS_LOG_HEADER(
      log, "          Options.random_access_max_buffer_size: %" ROCKSDB_PRIszt,
      random_access_max_buffer_size);
  ROCKS_LOG_HEADER(log, "                     Options.use_adaptive_mutex: %d",
                   use_adaptive_mutex);
  ROCKS_LOG_HEADER(log, "                           Options.rate_limiter: %p",
                   rate_limiter.get());
684 685 686
  Header(
      log, "    Options.sst_file_manager.rate_bytes_per_sec: %" PRIi64,
      sst_file_manager ? sst_file_manager->GetDeleteRateBytesPerSecond() : 0);
687
  ROCKS_LOG_HEADER(log, "                      Options.wal_recovery_mode: %d",
688
                   static_cast<int>(wal_recovery_mode));
689 690
  ROCKS_LOG_HEADER(log, "                 Options.enable_thread_tracking: %d",
                   enable_thread_tracking);
691 692
  ROCKS_LOG_HEADER(log, "                 Options.enable_pipelined_write: %d",
                   enable_pipelined_write);
M
Maysam Yabandeh 已提交
693 694
  ROCKS_LOG_HEADER(log, "                 Options.unordered_write: %d",
                   unordered_write);
695 696 697 698 699 700 701 702 703 704
  ROCKS_LOG_HEADER(log, "        Options.allow_concurrent_memtable_write: %d",
                   allow_concurrent_memtable_write);
  ROCKS_LOG_HEADER(log, "     Options.enable_write_thread_adaptive_yield: %d",
                   enable_write_thread_adaptive_yield);
  ROCKS_LOG_HEADER(log,
                   "            Options.write_thread_max_yield_usec: %" PRIu64,
                   write_thread_max_yield_usec);
  ROCKS_LOG_HEADER(log,
                   "           Options.write_thread_slow_yield_usec: %" PRIu64,
                   write_thread_slow_yield_usec);
705
  if (row_cache) {
706
    ROCKS_LOG_HEADER(
707 708
        log,
        "                              Options.row_cache: %" ROCKSDB_PRIszt,
709
        row_cache->GetCapacity());
710
  } else {
711 712
    ROCKS_LOG_HEADER(log,
                     "                              Options.row_cache: None");
713 714
  }
#ifndef ROCKSDB_LITE
715 716
  ROCKS_LOG_HEADER(log, "                             Options.wal_filter: %s",
                   wal_filter ? wal_filter->Name() : "None");
717
#endif  // ROCKDB_LITE
718

719 720
  ROCKS_LOG_HEADER(log, "            Options.avoid_flush_during_recovery: %d",
                   avoid_flush_during_recovery);
721 722
  ROCKS_LOG_HEADER(log, "            Options.allow_ingest_behind: %d",
                   allow_ingest_behind);
723 724
  ROCKS_LOG_HEADER(log, "            Options.preserve_deletes: %d",
                   preserve_deletes);
725 726
  ROCKS_LOG_HEADER(log, "            Options.two_write_queues: %d",
                   two_write_queues);
727 728
  ROCKS_LOG_HEADER(log, "            Options.manual_wal_flush: %d",
                   manual_wal_flush);
729 730 731 732
  ROCKS_LOG_HEADER(log, "            Options.atomic_flush: %d", atomic_flush);
  ROCKS_LOG_HEADER(log,
                   "            Options.avoid_unnecessary_blocking_io: %d",
                   avoid_unnecessary_blocking_io);
733 734
  ROCKS_LOG_HEADER(log, "                Options.persist_stats_to_disk: %u",
                   persist_stats_to_disk);
735 736
  ROCKS_LOG_HEADER(log, "                Options.write_dbid_to_manifest: %d",
                   write_dbid_to_manifest);
737 738 739
  ROCKS_LOG_HEADER(
      log, "                Options.log_readahead_size: %" ROCKSDB_PRIszt,
      log_readahead_size);
740
  ROCKS_LOG_HEADER(log, "                Options.file_checksum_gen_factory: %s",
741 742
                   file_checksum_gen_factory ? file_checksum_gen_factory->Name()
                                             : kUnknownFileChecksumFuncName);
743 744
  ROCKS_LOG_HEADER(log, "                Options.best_efforts_recovery: %d",
                   static_cast<int>(best_efforts_recovery));
745 746 747 748 749
  ROCKS_LOG_HEADER(log, "               Options.max_bgerror_resume_count: %d",
                   max_bgerror_resume_count);
  ROCKS_LOG_HEADER(log,
                   "           Options.bgerror_resume_retry_interval: %" PRIu64,
                   bgerror_resume_retry_interval);
750 751
  ROCKS_LOG_HEADER(log, "            Options.allow_data_in_errors: %d",
                   allow_data_in_errors);
752 753
  ROCKS_LOG_HEADER(log, "            Options.db_host_id: %s",
                   db_host_id.c_str());
754 755
}

756
MutableDBOptions::MutableDBOptions()
757 758 759
    : max_background_jobs(2),
      base_background_compactions(-1),
      max_background_compactions(-1),
760
      max_subcompactions(0),
761
      avoid_flush_during_shutdown(false),
762
      writable_file_max_buffer_size(1024 * 1024),
763
      delayed_write_rate(2 * 1024U * 1024U),
764
      max_total_wal_size(0),
765
      delete_obsolete_files_period_micros(6ULL * 60 * 60 * 1000000),
L
Leonidas Galanis 已提交
766
      stats_dump_period_sec(600),
767 768
      stats_persist_period_sec(600),
      stats_history_buffer_size(1024 * 1024),
769 770
      max_open_files(-1),
      bytes_per_sync(0),
771
      wal_bytes_per_sync(0),
772
      strict_bytes_per_sync(false),
773 774
      compaction_readahead_size(0),
      max_background_flushes(-1) {}
775 776

MutableDBOptions::MutableDBOptions(const DBOptions& options)
777 778
    : max_background_jobs(options.max_background_jobs),
      base_background_compactions(options.base_background_compactions),
Y
Yi Wu 已提交
779
      max_background_compactions(options.max_background_compactions),
780
      max_subcompactions(options.max_subcompactions),
781
      avoid_flush_during_shutdown(options.avoid_flush_during_shutdown),
782
      writable_file_max_buffer_size(options.writable_file_max_buffer_size),
783
      delayed_write_rate(options.delayed_write_rate),
784 785
      max_total_wal_size(options.max_total_wal_size),
      delete_obsolete_files_period_micros(
786
          options.delete_obsolete_files_period_micros),
L
Leonidas Galanis 已提交
787
      stats_dump_period_sec(options.stats_dump_period_sec),
788 789
      stats_persist_period_sec(options.stats_persist_period_sec),
      stats_history_buffer_size(options.stats_history_buffer_size),
790 791
      max_open_files(options.max_open_files),
      bytes_per_sync(options.bytes_per_sync),
792
      wal_bytes_per_sync(options.wal_bytes_per_sync),
793
      strict_bytes_per_sync(options.strict_bytes_per_sync),
794 795
      compaction_readahead_size(options.compaction_readahead_size),
      max_background_flushes(options.max_background_flushes) {}
796

797
void MutableDBOptions::Dump(Logger* log) const {
798 799
  ROCKS_LOG_HEADER(log, "            Options.max_background_jobs: %d",
                   max_background_jobs);
800 801
  ROCKS_LOG_HEADER(log, "            Options.max_background_compactions: %d",
                   max_background_compactions);
802 803
  ROCKS_LOG_HEADER(log, "            Options.max_subcompactions: %" PRIu32,
                   max_subcompactions);
804 805
  ROCKS_LOG_HEADER(log, "            Options.avoid_flush_during_shutdown: %d",
                   avoid_flush_during_shutdown);
806 807 808
  ROCKS_LOG_HEADER(
      log, "          Options.writable_file_max_buffer_size: %" ROCKSDB_PRIszt,
      writable_file_max_buffer_size);
809 810 811 812 813 814 815
  ROCKS_LOG_HEADER(log, "            Options.delayed_write_rate : %" PRIu64,
                   delayed_write_rate);
  ROCKS_LOG_HEADER(log, "            Options.max_total_wal_size: %" PRIu64,
                   max_total_wal_size);
  ROCKS_LOG_HEADER(
      log, "            Options.delete_obsolete_files_period_micros: %" PRIu64,
      delete_obsolete_files_period_micros);
816 817
  ROCKS_LOG_HEADER(log, "                  Options.stats_dump_period_sec: %u",
                   stats_dump_period_sec);
818 819
  ROCKS_LOG_HEADER(log, "                Options.stats_persist_period_sec: %d",
                   stats_persist_period_sec);
820 821 822 823
  ROCKS_LOG_HEADER(
      log,
      "                Options.stats_history_buffer_size: %" ROCKSDB_PRIszt,
      stats_history_buffer_size);
L
Leonidas Galanis 已提交
824 825
  ROCKS_LOG_HEADER(log, "                         Options.max_open_files: %d",
                   max_open_files);
826 827 828 829 830 831
  ROCKS_LOG_HEADER(log,
                   "                         Options.bytes_per_sync: %" PRIu64,
                   bytes_per_sync);
  ROCKS_LOG_HEADER(log,
                   "                     Options.wal_bytes_per_sync: %" PRIu64,
                   wal_bytes_per_sync);
832 833 834
  ROCKS_LOG_HEADER(log,
                   "                  Options.strict_bytes_per_sync: %d",
                   strict_bytes_per_sync);
835 836 837
  ROCKS_LOG_HEADER(log,
                   "      Options.compaction_readahead_size: %" ROCKSDB_PRIszt,
                   compaction_readahead_size);
838 839
  ROCKS_LOG_HEADER(log, "                 Options.max_background_flushes: %d",
                          max_background_flushes);
840
}
841

842
}  // namespace ROCKSDB_NAMESPACE