db_options.cc 41.3 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
        {"flush_verify_memtable_count",
         {offsetof(struct ImmutableDBOptions, flush_verify_memtable_count),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
207 208 209 210 211
        {"track_and_verify_wals_in_manifest",
         {offsetof(struct ImmutableDBOptions,
                   track_and_verify_wals_in_manifest),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
212 213 214
        {"skip_log_error_on_recovery",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
          OptionTypeFlags::kNone}},
215
        {"skip_stats_update_on_db_open",
216
         {offsetof(struct ImmutableDBOptions, skip_stats_update_on_db_open),
217
          OptionType::kBoolean, OptionVerificationType::kNormal,
218
          OptionTypeFlags::kNone}},
219
        {"skip_checking_sst_file_sizes_on_db_open",
220 221
         {offsetof(struct ImmutableDBOptions,
                   skip_checking_sst_file_sizes_on_db_open),
222
          OptionType::kBoolean, OptionVerificationType::kNormal,
223
          OptionTypeFlags::kNone}},
224
        {"new_table_reader_for_compaction_inputs",
225 226
         {offsetof(struct ImmutableDBOptions,
                   new_table_reader_for_compaction_inputs),
227
          OptionType::kBoolean, OptionVerificationType::kNormal,
228
          OptionTypeFlags::kNone}},
229
        {"random_access_max_buffer_size",
230
         {offsetof(struct ImmutableDBOptions, random_access_max_buffer_size),
231
          OptionType::kSizeT, OptionVerificationType::kNormal,
232
          OptionTypeFlags::kNone}},
233
        {"use_adaptive_mutex",
234 235 236
         {offsetof(struct ImmutableDBOptions, use_adaptive_mutex),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
237
        {"use_fsync",
238 239
         {offsetof(struct ImmutableDBOptions, use_fsync), OptionType::kBoolean,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
240
        {"max_file_opening_threads",
241
         {offsetof(struct ImmutableDBOptions, max_file_opening_threads),
242
          OptionType::kInt, OptionVerificationType::kNormal,
243
          OptionTypeFlags::kNone}},
244
        {"table_cache_numshardbits",
245
         {offsetof(struct ImmutableDBOptions, table_cache_numshardbits),
246
          OptionType::kInt, OptionVerificationType::kNormal,
247
          OptionTypeFlags::kNone}},
248
        {"db_write_buffer_size",
249 250 251
         {offsetof(struct ImmutableDBOptions, db_write_buffer_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
252
        {"keep_log_file_num",
253 254 255
         {offsetof(struct ImmutableDBOptions, keep_log_file_num),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
256
        {"recycle_log_file_num",
257 258 259
         {offsetof(struct ImmutableDBOptions, recycle_log_file_num),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
260
        {"log_file_time_to_roll",
261 262 263
         {offsetof(struct ImmutableDBOptions, log_file_time_to_roll),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
264
        {"manifest_preallocation_size",
265
         {offsetof(struct ImmutableDBOptions, manifest_preallocation_size),
266
          OptionType::kSizeT, OptionVerificationType::kNormal,
267
          OptionTypeFlags::kNone}},
268
        {"max_log_file_size",
269 270 271
         {offsetof(struct ImmutableDBOptions, max_log_file_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
272
        {"db_log_dir",
273 274
         {offsetof(struct ImmutableDBOptions, db_log_dir), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
275
        {"wal_dir",
276 277
         {offsetof(struct ImmutableDBOptions, wal_dir), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
278
        {"WAL_size_limit_MB",
279
         {offsetof(struct ImmutableDBOptions, WAL_size_limit_MB),
280 281
          OptionType::kUInt64T, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
282
        {"WAL_ttl_seconds",
283
         {offsetof(struct ImmutableDBOptions, WAL_ttl_seconds),
284
          OptionType::kUInt64T, OptionVerificationType::kNormal,
285
          OptionTypeFlags::kNone}},
286
        {"max_manifest_file_size",
287
         {offsetof(struct ImmutableDBOptions, max_manifest_file_size),
288
          OptionType::kUInt64T, OptionVerificationType::kNormal,
289
          OptionTypeFlags::kNone}},
290
        {"persist_stats_to_disk",
291
         {offsetof(struct ImmutableDBOptions, persist_stats_to_disk),
292
          OptionType::kBoolean, OptionVerificationType::kNormal,
293
          OptionTypeFlags::kNone}},
294
        {"fail_if_options_file_error",
295
         {offsetof(struct ImmutableDBOptions, fail_if_options_file_error),
296
          OptionType::kBoolean, OptionVerificationType::kNormal,
297
          OptionTypeFlags::kNone}},
298
        {"enable_pipelined_write",
299
         {offsetof(struct ImmutableDBOptions, enable_pipelined_write),
300
          OptionType::kBoolean, OptionVerificationType::kNormal,
301
          OptionTypeFlags::kNone}},
302
        {"unordered_write",
303 304 305
         {offsetof(struct ImmutableDBOptions, unordered_write),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
306
        {"allow_concurrent_memtable_write",
307
         {offsetof(struct ImmutableDBOptions, allow_concurrent_memtable_write),
308
          OptionType::kBoolean, OptionVerificationType::kNormal,
309 310 311 312 313
          OptionTypeFlags::kNone}},
        {"wal_recovery_mode",
         OptionTypeInfo::Enum<WALRecoveryMode>(
             offsetof(struct ImmutableDBOptions, wal_recovery_mode),
             &wal_recovery_mode_string_map)},
314
        {"enable_write_thread_adaptive_yield",
315 316
         {offsetof(struct ImmutableDBOptions,
                   enable_write_thread_adaptive_yield),
317
          OptionType::kBoolean, OptionVerificationType::kNormal,
318
          OptionTypeFlags::kNone}},
319
        {"write_thread_slow_yield_usec",
320
         {offsetof(struct ImmutableDBOptions, write_thread_slow_yield_usec),
321
          OptionType::kUInt64T, OptionVerificationType::kNormal,
322
          OptionTypeFlags::kNone}},
323
        {"max_write_batch_group_size_bytes",
324
         {offsetof(struct ImmutableDBOptions, max_write_batch_group_size_bytes),
325
          OptionType::kUInt64T, OptionVerificationType::kNormal,
326
          OptionTypeFlags::kNone}},
327
        {"write_thread_max_yield_usec",
328
         {offsetof(struct ImmutableDBOptions, write_thread_max_yield_usec),
329
          OptionType::kUInt64T, OptionVerificationType::kNormal,
330
          OptionTypeFlags::kNone}},
331
        {"access_hint_on_compaction_start",
332
         OptionTypeInfo::Enum<DBOptions::AccessHint>(
333 334
             offsetof(struct ImmutableDBOptions,
                      access_hint_on_compaction_start),
335
             &access_hint_string_map)},
336 337 338 339
        {"info_log_level",
         OptionTypeInfo::Enum<InfoLogLevel>(
             offsetof(struct ImmutableDBOptions, info_log_level),
             &info_log_level_string_map)},
340
        {"dump_malloc_stats",
341
         {offsetof(struct ImmutableDBOptions, dump_malloc_stats),
342
          OptionType::kBoolean, OptionVerificationType::kNormal,
343 344 345
          OptionTypeFlags::kNone}},
        {"avoid_flush_during_recovery",
         {offsetof(struct ImmutableDBOptions, avoid_flush_during_recovery),
346
          OptionType::kBoolean, OptionVerificationType::kNormal,
347
          OptionTypeFlags::kNone}},
348
        {"allow_ingest_behind",
349 350 351
         {offsetof(struct ImmutableDBOptions, allow_ingest_behind),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
352
        {"preserve_deletes",
353 354 355
         {offsetof(struct ImmutableDBOptions, preserve_deletes),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
356 357
        {"concurrent_prepare",  // Deprecated by two_write_queues
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
358
          OptionTypeFlags::kNone}},
359
        {"two_write_queues",
360 361 362
         {offsetof(struct ImmutableDBOptions, two_write_queues),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
363
        {"manual_wal_flush",
364 365 366
         {offsetof(struct ImmutableDBOptions, manual_wal_flush),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
367 368
        {"seq_per_batch",
         {0, OptionType::kBoolean, OptionVerificationType::kDeprecated,
369
          OptionTypeFlags::kNone}},
370
        {"atomic_flush",
371 372 373
         {offsetof(struct ImmutableDBOptions, atomic_flush),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
374
        {"avoid_unnecessary_blocking_io",
375
         {offsetof(struct ImmutableDBOptions, avoid_unnecessary_blocking_io),
376
          OptionType::kBoolean, OptionVerificationType::kNormal,
377
          OptionTypeFlags::kNone}},
378
        {"write_dbid_to_manifest",
379
         {offsetof(struct ImmutableDBOptions, write_dbid_to_manifest),
380
          OptionType::kBoolean, OptionVerificationType::kNormal,
381
          OptionTypeFlags::kNone}},
382
        {"log_readahead_size",
383 384 385
         {offsetof(struct ImmutableDBOptions, log_readahead_size),
          OptionType::kSizeT, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
386
        {"best_efforts_recovery",
387
         {offsetof(struct ImmutableDBOptions, best_efforts_recovery),
388
          OptionType::kBoolean, OptionVerificationType::kNormal,
389
          OptionTypeFlags::kNone}},
390
        {"max_bgerror_resume_count",
391
         {offsetof(struct ImmutableDBOptions, max_bgerror_resume_count),
392
          OptionType::kInt, OptionVerificationType::kNormal,
393
          OptionTypeFlags::kNone}},
394
        {"bgerror_resume_retry_interval",
395
         {offsetof(struct ImmutableDBOptions, bgerror_resume_retry_interval),
396
          OptionType::kUInt64T, OptionVerificationType::kNormal,
397
          OptionTypeFlags::kNone}},
398 399 400
        {"db_host_id",
         {offsetof(struct ImmutableDBOptions, db_host_id), OptionType::kString,
          OptionVerificationType::kNormal, OptionTypeFlags::kCompareNever}},
401 402 403 404
        // 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",
405 406 407
         {offsetof(struct ImmutableDBOptions, rate_limiter),
          OptionType::kUnknown, OptionVerificationType::kNormal,
          (OptionTypeFlags::kDontSerialize | OptionTypeFlags::kCompareNever),
408 409
          // Parse the input value as a RateLimiter
          [](const ConfigOptions& /*opts*/, const std::string& /*name*/,
410 411
             const std::string& value, void* addr) {
            auto limiter = static_cast<std::shared_ptr<RateLimiter>*>(addr);
412 413 414 415 416
            limiter->reset(NewGenericRateLimiter(
                static_cast<int64_t>(ParseUint64(value))));
            return Status::OK();
          }}},
        {"env",
417
         {offsetof(struct ImmutableDBOptions, env), OptionType::kUnknown,
418
          OptionVerificationType::kNormal,
419
          (OptionTypeFlags::kDontSerialize | OptionTypeFlags::kCompareNever),
420
          // Parse the input value as an Env
421
          [](const ConfigOptions& opts, const std::string& /*name*/,
422 423
             const std::string& value, void* addr) {
            auto old_env = static_cast<Env**>(addr);       // Get the old value
424
            Env* new_env = *old_env;                       // Set new to old
425 426
            Status s = Env::CreateFromString(opts, value,
                                             &new_env);    // Update new value
427 428 429 430 431
            if (s.ok()) {                                  // It worked
              *old_env = new_env;                          // Update the old one
            }
            return s;
          }}},
432 433 434 435
        {"allow_data_in_errors",
         {offsetof(struct ImmutableDBOptions, allow_data_in_errors),
          OptionType::kBoolean, OptionVerificationType::kNormal,
          OptionTypeFlags::kNone}},
436
};
437 438 439 440 441

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

class MutableDBConfigurable : public Configurable {
 public:
442
  explicit MutableDBConfigurable(const MutableDBOptions& mdb) {
443
    mutable_ = mdb;
444
    RegisterOptions(&mutable_, &db_mutable_options_type_info);
445 446 447 448 449 450 451 452
  }

 protected:
  MutableDBOptions mutable_;
};

class DBOptionsConfigurable : public MutableDBConfigurable {
 public:
453
  explicit DBOptionsConfigurable(const DBOptions& opts)
454 455 456 457 458 459 460 461 462 463
      : 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);
    }
464
    RegisterOptions(&immutable_, &db_immutable_options_type_info);
465 466 467 468 469 470 471
  }

 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 {
472
    Status s = Configurable::ConfigureOptions(config_options, opts_map, unused);
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 498 499 500 501
    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;
}
502
#endif  // ROCKSDB_LITE
503 504 505 506 507 508 509 510

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),
511
      flush_verify_memtable_count(options.flush_verify_memtable_count),
512 513
      track_and_verify_wals_in_manifest(
          options.track_and_verify_wals_in_manifest),
514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
      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),
531 532
      WAL_ttl_seconds(options.WAL_ttl_seconds),
      WAL_size_limit_MB(options.WAL_size_limit_MB),
533 534
      max_write_batch_group_size_bytes(
          options.max_write_batch_group_size_bytes),
535 536 537
      manifest_preallocation_size(options.manifest_preallocation_size),
      allow_mmap_reads(options.allow_mmap_reads),
      allow_mmap_writes(options.allow_mmap_writes),
538
      use_direct_reads(options.use_direct_reads),
539 540
      use_direct_io_for_flush_and_compaction(
          options.use_direct_io_for_flush_and_compaction),
541 542 543 544 545 546 547 548 549 550 551 552
      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),
553
      enable_pipelined_write(options.enable_pipelined_write),
M
Maysam Yabandeh 已提交
554
      unordered_write(options.unordered_write),
555 556 557 558 559 560
      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),
561 562
      skip_checking_sst_file_sizes_on_db_open(
          options.skip_checking_sst_file_sizes_on_db_open),
563 564 565 566 567 568 569 570
      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),
571
      avoid_flush_during_recovery(options.avoid_flush_during_recovery),
572
      allow_ingest_behind(options.allow_ingest_behind),
573
      preserve_deletes(options.preserve_deletes),
574
      two_write_queues(options.two_write_queues),
575
      manual_wal_flush(options.manual_wal_flush),
576
      atomic_flush(options.atomic_flush),
577
      avoid_unnecessary_blocking_io(options.avoid_unnecessary_blocking_io),
578
      persist_stats_to_disk(options.persist_stats_to_disk),
579
      write_dbid_to_manifest(options.write_dbid_to_manifest),
580
      log_readahead_size(options.log_readahead_size),
581
      file_checksum_gen_factory(options.file_checksum_gen_factory),
582 583
      best_efforts_recovery(options.best_efforts_recovery),
      max_bgerror_resume_count(options.max_bgerror_resume_count),
584
      bgerror_resume_retry_interval(options.bgerror_resume_retry_interval),
585
      allow_data_in_errors(options.allow_data_in_errors),
586
      db_host_id(options.db_host_id),
587 588
      checksum_handoff_file_types(options.checksum_handoff_file_types),
      compaction_service(options.compaction_service) {
589
  stats = statistics.get();
590
  fs = env->GetFileSystem();
591 592 593 594 595
  if (env != nullptr) {
    clock = env->GetSystemClock().get();
  } else {
    clock = SystemClock::Default().get();
  }
596 597
  logger = info_log.get();
  stats = statistics.get();
598 599 600
}

void ImmutableDBOptions::Dump(Logger* log) const {
601 602 603 604 605 606
  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);
607 608
  ROCKS_LOG_HEADER(log, "            Options.flush_verify_memtable_count: %d",
                   flush_verify_memtable_count);
609 610 611 612
  ROCKS_LOG_HEADER(log,
                   "                              "
                   "Options.track_and_verify_wals_in_manifest: %d",
                   track_and_verify_wals_in_manifest);
613 614
  ROCKS_LOG_HEADER(log, "                                    Options.env: %p",
                   env);
615 616
  ROCKS_LOG_HEADER(log, "                                     Options.fs: %s",
                   fs->Name());
617 618 619 620
  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);
621
  ROCKS_LOG_HEADER(log, "                             Options.statistics: %p",
622
                   stats);
623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
  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);
648 649 650 651
  ROCKS_LOG_HEADER(log,
                   "                       "
                   "Options.use_direct_io_for_flush_and_compaction: %d",
                   use_direct_io_for_flush_and_compaction);
652 653 654 655 656 657 658 659 660 661
  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,
662
                   WAL_ttl_seconds);
663 664
  ROCKS_LOG_HEADER(log,
                   "                      Options.WAL_size_limit_MB: %" PRIu64,
665
                   WAL_size_limit_MB);
666 667 668 669
  ROCKS_LOG_HEADER(log,
                   "                       "
                   "Options.max_write_batch_group_size_bytes: %" PRIu64,
                   max_write_batch_group_size_bytes);
670 671 672 673 674 675 676 677 678 679
  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);
680 681
  ROCKS_LOG_HEADER(log, "                   Options.write_buffer_manager: %p",
                   write_buffer_manager.get());
682 683 684 685 686 687 688 689 690 691 692
  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());
693 694 695
  Header(
      log, "    Options.sst_file_manager.rate_bytes_per_sec: %" PRIi64,
      sst_file_manager ? sst_file_manager->GetDeleteRateBytesPerSecond() : 0);
696
  ROCKS_LOG_HEADER(log, "                      Options.wal_recovery_mode: %d",
697
                   static_cast<int>(wal_recovery_mode));
698 699
  ROCKS_LOG_HEADER(log, "                 Options.enable_thread_tracking: %d",
                   enable_thread_tracking);
700 701
  ROCKS_LOG_HEADER(log, "                 Options.enable_pipelined_write: %d",
                   enable_pipelined_write);
M
Maysam Yabandeh 已提交
702 703
  ROCKS_LOG_HEADER(log, "                 Options.unordered_write: %d",
                   unordered_write);
704 705 706 707 708 709 710 711 712 713
  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);
714
  if (row_cache) {
715
    ROCKS_LOG_HEADER(
716 717
        log,
        "                              Options.row_cache: %" ROCKSDB_PRIszt,
718
        row_cache->GetCapacity());
719
  } else {
720 721
    ROCKS_LOG_HEADER(log,
                     "                              Options.row_cache: None");
722 723
  }
#ifndef ROCKSDB_LITE
724 725
  ROCKS_LOG_HEADER(log, "                             Options.wal_filter: %s",
                   wal_filter ? wal_filter->Name() : "None");
726
#endif  // ROCKDB_LITE
727

728 729
  ROCKS_LOG_HEADER(log, "            Options.avoid_flush_during_recovery: %d",
                   avoid_flush_during_recovery);
730 731
  ROCKS_LOG_HEADER(log, "            Options.allow_ingest_behind: %d",
                   allow_ingest_behind);
732 733
  ROCKS_LOG_HEADER(log, "            Options.preserve_deletes: %d",
                   preserve_deletes);
734 735
  ROCKS_LOG_HEADER(log, "            Options.two_write_queues: %d",
                   two_write_queues);
736 737
  ROCKS_LOG_HEADER(log, "            Options.manual_wal_flush: %d",
                   manual_wal_flush);
738 739 740 741
  ROCKS_LOG_HEADER(log, "            Options.atomic_flush: %d", atomic_flush);
  ROCKS_LOG_HEADER(log,
                   "            Options.avoid_unnecessary_blocking_io: %d",
                   avoid_unnecessary_blocking_io);
742 743
  ROCKS_LOG_HEADER(log, "                Options.persist_stats_to_disk: %u",
                   persist_stats_to_disk);
744 745
  ROCKS_LOG_HEADER(log, "                Options.write_dbid_to_manifest: %d",
                   write_dbid_to_manifest);
746 747 748
  ROCKS_LOG_HEADER(
      log, "                Options.log_readahead_size: %" ROCKSDB_PRIszt,
      log_readahead_size);
749
  ROCKS_LOG_HEADER(log, "                Options.file_checksum_gen_factory: %s",
750 751
                   file_checksum_gen_factory ? file_checksum_gen_factory->Name()
                                             : kUnknownFileChecksumFuncName);
752 753
  ROCKS_LOG_HEADER(log, "                Options.best_efforts_recovery: %d",
                   static_cast<int>(best_efforts_recovery));
754 755 756 757 758
  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);
759 760
  ROCKS_LOG_HEADER(log, "            Options.allow_data_in_errors: %d",
                   allow_data_in_errors);
761 762
  ROCKS_LOG_HEADER(log, "            Options.db_host_id: %s",
                   db_host_id.c_str());
763 764
}

765
MutableDBOptions::MutableDBOptions()
766 767 768
    : max_background_jobs(2),
      base_background_compactions(-1),
      max_background_compactions(-1),
769
      max_subcompactions(0),
770
      avoid_flush_during_shutdown(false),
771
      writable_file_max_buffer_size(1024 * 1024),
772
      delayed_write_rate(2 * 1024U * 1024U),
773
      max_total_wal_size(0),
774
      delete_obsolete_files_period_micros(6ULL * 60 * 60 * 1000000),
L
Leonidas Galanis 已提交
775
      stats_dump_period_sec(600),
776 777
      stats_persist_period_sec(600),
      stats_history_buffer_size(1024 * 1024),
778 779
      max_open_files(-1),
      bytes_per_sync(0),
780
      wal_bytes_per_sync(0),
781
      strict_bytes_per_sync(false),
782 783
      compaction_readahead_size(0),
      max_background_flushes(-1) {}
784 785

MutableDBOptions::MutableDBOptions(const DBOptions& options)
786 787
    : max_background_jobs(options.max_background_jobs),
      base_background_compactions(options.base_background_compactions),
Y
Yi Wu 已提交
788
      max_background_compactions(options.max_background_compactions),
789
      max_subcompactions(options.max_subcompactions),
790
      avoid_flush_during_shutdown(options.avoid_flush_during_shutdown),
791
      writable_file_max_buffer_size(options.writable_file_max_buffer_size),
792
      delayed_write_rate(options.delayed_write_rate),
793 794
      max_total_wal_size(options.max_total_wal_size),
      delete_obsolete_files_period_micros(
795
          options.delete_obsolete_files_period_micros),
L
Leonidas Galanis 已提交
796
      stats_dump_period_sec(options.stats_dump_period_sec),
797 798
      stats_persist_period_sec(options.stats_persist_period_sec),
      stats_history_buffer_size(options.stats_history_buffer_size),
799 800
      max_open_files(options.max_open_files),
      bytes_per_sync(options.bytes_per_sync),
801
      wal_bytes_per_sync(options.wal_bytes_per_sync),
802
      strict_bytes_per_sync(options.strict_bytes_per_sync),
803 804
      compaction_readahead_size(options.compaction_readahead_size),
      max_background_flushes(options.max_background_flushes) {}
805

806
void MutableDBOptions::Dump(Logger* log) const {
807 808
  ROCKS_LOG_HEADER(log, "            Options.max_background_jobs: %d",
                   max_background_jobs);
809 810
  ROCKS_LOG_HEADER(log, "            Options.max_background_compactions: %d",
                   max_background_compactions);
811 812
  ROCKS_LOG_HEADER(log, "            Options.max_subcompactions: %" PRIu32,
                   max_subcompactions);
813 814
  ROCKS_LOG_HEADER(log, "            Options.avoid_flush_during_shutdown: %d",
                   avoid_flush_during_shutdown);
815 816 817
  ROCKS_LOG_HEADER(
      log, "          Options.writable_file_max_buffer_size: %" ROCKSDB_PRIszt,
      writable_file_max_buffer_size);
818 819 820 821 822 823 824
  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);
825 826
  ROCKS_LOG_HEADER(log, "                  Options.stats_dump_period_sec: %u",
                   stats_dump_period_sec);
827 828
  ROCKS_LOG_HEADER(log, "                Options.stats_persist_period_sec: %d",
                   stats_persist_period_sec);
829 830 831 832
  ROCKS_LOG_HEADER(
      log,
      "                Options.stats_history_buffer_size: %" ROCKSDB_PRIszt,
      stats_history_buffer_size);
L
Leonidas Galanis 已提交
833 834
  ROCKS_LOG_HEADER(log, "                         Options.max_open_files: %d",
                   max_open_files);
835 836 837 838 839 840
  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);
841 842 843
  ROCKS_LOG_HEADER(log,
                   "                  Options.strict_bytes_per_sync: %d",
                   strict_bytes_per_sync);
844 845 846
  ROCKS_LOG_HEADER(log,
                   "      Options.compaction_readahead_size: %" ROCKSDB_PRIszt,
                   compaction_readahead_size);
847 848
  ROCKS_LOG_HEADER(log, "                 Options.max_background_flushes: %d",
                          max_background_flushes);
849
}
850

851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
#ifndef ROCKSDB_LITE
Status GetMutableDBOptionsFromStrings(
    const MutableDBOptions& base_options,
    const std::unordered_map<std::string, std::string>& options_map,
    MutableDBOptions* new_options) {
  assert(new_options);
  *new_options = base_options;
  ConfigOptions config_options;
  Status s = OptionTypeInfo::ParseType(
      config_options, options_map, db_mutable_options_type_info, new_options);
  if (!s.ok()) {
    *new_options = base_options;
  }
  return s;
}

Status GetStringFromMutableDBOptions(const ConfigOptions& config_options,
                                     const MutableDBOptions& mutable_opts,
                                     std::string* opt_string) {
  return OptionTypeInfo::SerializeType(
      config_options, db_mutable_options_type_info, &mutable_opts, opt_string);
}
#endif  // ROCKSDB_LITE
874
}  // namespace ROCKSDB_NAMESPACE