db_options.cc 40.8 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
  stats = statistics.get();
584
  fs = env->GetFileSystem();
585 586 587 588 589
  if (env != nullptr) {
    clock = env->GetSystemClock().get();
  } else {
    clock = SystemClock::Default().get();
  }
590 591
  logger = info_log.get();
  stats = statistics.get();
592 593 594
}

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

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

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

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

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

843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
#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
866
}  // namespace ROCKSDB_NAMESPACE