mirror of
https://github.com/facebook/rocksdb.git
synced 2024-11-26 16:30:56 +00:00
74b100ac17
Summary: This patch defines the format of RocksDB options file, which follows the INI file format, and implements functions for its serialization and deserialization. An example RocksDB options file can be found in examples/rocksdb_option_file_example.ini. A typical RocksDB options file has three sections, which are Version, DBOptions, and more than one CFOptions. The RocksDB options file in general follows the basic INI file format with the following extensions / modifications: * Escaped characters We escaped the following characters: - \n -- line feed - new line - \r -- carriage return - \\ -- backslash \ - \: -- colon symbol : - \# -- hash tag # * Comments We support # style comments. Comments can appear at the ending part of a line. * Statements A statement is of the form option_name = value. Each statement contains a '=', where extra white-spaces are supported. However, we don't support multi-lined statement. Furthermore, each line can only contain at most one statement. * Section Sections are of the form [SecitonTitle "SectionArgument"], where section argument is optional. * List We use colon-separated string to represent a list. For instance, n1:n2:n3:n4 is a list containing four values. Below is an example of a RocksDB options file: [Version] rocksdb_version=4.0.0 options_file_version=1.0 [DBOptions] max_open_files=12345 max_background_flushes=301 [CFOptions "default"] [CFOptions "the second column family"] [CFOptions "the third column family"] Test Plan: Added many tests in options_test.cc Reviewers: igor, IslamAbdelRahman, sdong, anthony Reviewed By: anthony Subscribers: maykov, dhruba, leveldb Differential Revision: https://reviews.facebook.net/D46059
112 lines
3.6 KiB
C++
112 lines
3.6 KiB
C++
// Copyright (c) 2014, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "rocksdb/env.h"
|
|
#include "rocksdb/options.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
#ifndef ROCKSDB_LITE
|
|
|
|
#define ROCKSDB_OPTION_FILE_MAJOR 1
|
|
#define ROCKSDB_OPTION_FILE_MINOR 0
|
|
|
|
enum OptionSection : char {
|
|
kOptionSectionVersion = 0,
|
|
kOptionSectionDBOptions,
|
|
kOptionSectionCFOptions,
|
|
kOptionSectionUnknown
|
|
};
|
|
|
|
static const std::string opt_section_titles[] = {"Version", "DBOptions",
|
|
"CFOptions", "Unknown"};
|
|
|
|
Status PersistRocksDBOptions(const DBOptions& db_opt,
|
|
const std::vector<std::string>& cf_names,
|
|
const std::vector<ColumnFamilyOptions>& cf_opts,
|
|
const std::string& file_name, Env* env);
|
|
|
|
class RocksDBOptionsParser {
|
|
public:
|
|
explicit RocksDBOptionsParser();
|
|
~RocksDBOptionsParser() {}
|
|
void Reset();
|
|
|
|
Status Parse(const std::string& file_name, Env* env);
|
|
static std::string TrimAndRemoveComment(const std::string& line,
|
|
const bool trim_only = false);
|
|
|
|
const DBOptions* db_opt() const { return &db_opt_; }
|
|
const std::vector<ColumnFamilyOptions>* cf_opts() const { return &cf_opts_; }
|
|
const std::vector<std::string>* cf_names() const { return &cf_names_; }
|
|
|
|
const ColumnFamilyOptions* GetCFOptions(const std::string& name) const {
|
|
assert(cf_names_.size() == cf_opts_.size());
|
|
for (size_t i = 0; i < cf_names_.size(); ++i) {
|
|
if (cf_names_[i] == name) {
|
|
return &cf_opts_[i];
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
size_t NumColumnFamilies() { return cf_opts_.size(); }
|
|
|
|
static Status VerifyRocksDBOptionsFromFile(
|
|
const DBOptions& db_opt, const std::vector<std::string>& cf_names,
|
|
const std::vector<ColumnFamilyOptions>& cf_opts,
|
|
const std::string& file_name, Env* env);
|
|
|
|
static Status VerifyDBOptions(const DBOptions& base_opt,
|
|
const DBOptions& new_opt);
|
|
|
|
static Status VerifyCFOptions(const ColumnFamilyOptions& base_opt,
|
|
const ColumnFamilyOptions& new_opt);
|
|
|
|
static Status ExtraParserCheck(const RocksDBOptionsParser& input_parser);
|
|
|
|
protected:
|
|
bool IsSection(const std::string& line);
|
|
Status ParseSection(OptionSection* section, std::string* argument,
|
|
const std::string& line, const int line_num);
|
|
|
|
Status CheckSection(const OptionSection section,
|
|
const std::string& section_arg, const int line_num);
|
|
|
|
Status ParseStatement(std::string* name, std::string* value,
|
|
const std::string& line, const int line_num);
|
|
|
|
Status EndSection(
|
|
const OptionSection section, const std::string& section_arg,
|
|
const std::unordered_map<std::string, std::string>& opt_map);
|
|
|
|
Status ValidityCheck();
|
|
|
|
Status InvalidArgument(const int line_num, const std::string& message);
|
|
|
|
Status ParseVersionNumber(const std::string& ver_name,
|
|
const std::string& ver_string, const int max_count,
|
|
int* version);
|
|
|
|
private:
|
|
DBOptions db_opt_;
|
|
std::vector<std::string> cf_names_;
|
|
std::vector<ColumnFamilyOptions> cf_opts_;
|
|
bool has_version_section_;
|
|
bool has_db_options_;
|
|
bool has_default_cf_options_;
|
|
int db_version[3];
|
|
int opt_file_version[3];
|
|
};
|
|
|
|
#endif // !ROCKSDB_LITE
|
|
|
|
} // namespace rocksdb
|