Split DBOptions into ImmutableDBOptions and MutableDBOptions

Summary: Use ImmutableDBOptions/MutableDBOptions internally and DBOptions only for user-facing APIs. MutableDBOptions is barely a placeholder for now. I'll start to move options to MutableDBOptions in following diffs.

Test Plan:
  make all check

Reviewers: yhchiang, IslamAbdelRahman, sdong

Reviewed By: sdong

Subscribers: andrewkr, dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D64065
main
Yi Wu 8 years ago
parent 4bc8c88e6b
commit 9ed928e7a9
  1. 1
      CMakeLists.txt
  2. 36
      db/column_family.cc
  3. 14
      db/column_family.h
  4. 4
      db/column_family_test.cc
  5. 4
      db/compacted_db_impl.cc
  6. 6
      db/compaction_job.cc
  7. 6
      db/compaction_job.h
  8. 7
      db/compaction_job_test.cc
  9. 12
      db/db_filesnapshot.cc
  10. 647
      db/db_impl.cc
  11. 11
      db/db_impl.h
  12. 10
      db/db_impl_add_file.cc
  13. 12
      db/db_impl_experimental.cc
  14. 5
      db/db_impl_readonly.cc
  15. 4
      db/db_info_dumper.cc
  16. 5
      db/db_info_dumper.h
  17. 3
      db/db_options_test.cc
  18. 2
      db/db_test.cc
  19. 2
      db/db_wal_test.cc
  20. 4
      db/filename.cc
  21. 3
      db/filename.h
  22. 4
      db/flush_job.cc
  23. 5
      db/flush_job.h
  24. 5
      db/flush_job_test.cc
  25. 6
      db/memtable_list_test.cc
  26. 8
      db/repair.cc
  27. 5
      db/table_properties_collector_test.cc
  28. 2
      db/transaction_log_impl.cc
  29. 17
      db/transaction_log_impl.h
  30. 11
      db/version_set.cc
  31. 19
      db/version_set.h
  32. 10
      db/wal_manager.cc
  33. 15
      db/wal_manager.h
  34. 19
      db/wal_manager_test.cc
  35. 2
      include/rocksdb/db.h
  36. 2
      include/rocksdb/utilities/stackable_db.h
  37. 63
      src.mk
  38. 6
      tools/ldb_cmd.cc
  39. 87
      util/cf_options.cc
  40. 9
      util/cf_options.h
  41. 233
      util/db_options.cc
  42. 96
      util/db_options.h
  43. 5
      util/file_util.cc
  44. 6
      util/file_util.h
  45. 93
      util/options_helper.cc
  46. 4
      util/options_helper.h

@ -200,6 +200,7 @@ set(SOURCES
util/comparator.cc util/comparator.cc
util/concurrent_arena.cc util/concurrent_arena.cc
util/crc32c.cc util/crc32c.cc
util/db_options.cc
util/delete_scheduler.cc util/delete_scheduler.cc
util/dynamic_bloom.cc util/dynamic_bloom.cc
util/env.cc util/env.cc

@ -88,11 +88,11 @@ const Comparator* ColumnFamilyHandleImpl::GetComparator() const {
} }
void GetIntTblPropCollectorFactory( void GetIntTblPropCollectorFactory(
const ColumnFamilyOptions& cf_options, const ImmutableCFOptions& ioptions,
std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories) { int_tbl_prop_collector_factories) {
auto& collector_factories = cf_options.table_properties_collector_factories; auto& collector_factories = ioptions.table_properties_collector_factories;
for (size_t i = 0; i < cf_options.table_properties_collector_factories.size(); for (size_t i = 0; i < ioptions.table_properties_collector_factories.size();
++i) { ++i) {
assert(collector_factories[i]); assert(collector_factories[i]);
int_tbl_prop_collector_factories->emplace_back( int_tbl_prop_collector_factories->emplace_back(
@ -138,7 +138,7 @@ Status CheckConcurrentWritesSupported(const ColumnFamilyOptions& cf_options) {
return Status::OK(); return Status::OK();
} }
ColumnFamilyOptions SanitizeOptions(const DBOptions& db_options, ColumnFamilyOptions SanitizeOptions(const ImmutableDBOptions& db_options,
const InternalKeyComparator* icmp, const InternalKeyComparator* icmp,
const ColumnFamilyOptions& src) { const ColumnFamilyOptions& src) {
ColumnFamilyOptions result = src; ColumnFamilyOptions result = src;
@ -340,7 +340,7 @@ void SuperVersionUnrefHandle(void* ptr) {
ColumnFamilyData::ColumnFamilyData( ColumnFamilyData::ColumnFamilyData(
uint32_t id, const std::string& name, Version* _dummy_versions, uint32_t id, const std::string& name, Version* _dummy_versions,
Cache* _table_cache, WriteBufferManager* write_buffer_manager, Cache* _table_cache, WriteBufferManager* write_buffer_manager,
const ColumnFamilyOptions& cf_options, const DBOptions* db_options, const ColumnFamilyOptions& cf_options, const ImmutableDBOptions& db_options,
const EnvOptions& env_options, ColumnFamilySet* column_family_set) const EnvOptions& env_options, ColumnFamilySet* column_family_set)
: id_(id), : id_(id),
name_(name), name_(name),
@ -349,14 +349,14 @@ ColumnFamilyData::ColumnFamilyData(
refs_(0), refs_(0),
dropped_(false), dropped_(false),
internal_comparator_(cf_options.comparator), internal_comparator_(cf_options.comparator),
options_(*db_options, initial_cf_options_(
SanitizeOptions(*db_options, &internal_comparator_, cf_options)), SanitizeOptions(db_options, &internal_comparator_, cf_options)),
ioptions_(options_), ioptions_(db_options, initial_cf_options_),
mutable_cf_options_(options_), mutable_cf_options_(initial_cf_options_),
write_buffer_manager_(write_buffer_manager), write_buffer_manager_(write_buffer_manager),
mem_(nullptr), mem_(nullptr),
imm_(options_.min_write_buffer_number_to_merge, imm_(ioptions_.min_write_buffer_number_to_merge,
options_.max_write_buffer_number_to_maintain), ioptions_.max_write_buffer_number_to_maintain),
super_version_(nullptr), super_version_(nullptr),
super_version_number_(0), super_version_number_(0),
local_sv_(new ThreadLocalPtr(&SuperVersionUnrefHandle)), local_sv_(new ThreadLocalPtr(&SuperVersionUnrefHandle)),
@ -370,12 +370,12 @@ ColumnFamilyData::ColumnFamilyData(
Ref(); Ref();
// Convert user defined table properties collector factories to internal ones. // Convert user defined table properties collector factories to internal ones.
GetIntTblPropCollectorFactory(options_, &int_tbl_prop_collector_factories_); GetIntTblPropCollectorFactory(ioptions_, &int_tbl_prop_collector_factories_);
// if _dummy_versions is nullptr, then this is a dummy column family. // if _dummy_versions is nullptr, then this is a dummy column family.
if (_dummy_versions != nullptr) { if (_dummy_versions != nullptr) {
internal_stats_.reset( internal_stats_.reset(
new InternalStats(ioptions_.num_levels, db_options->env, this)); new InternalStats(ioptions_.num_levels, db_options.env, this));
table_cache_.reset(new TableCache(ioptions_, env_options, _table_cache)); table_cache_.reset(new TableCache(ioptions_, env_options, _table_cache));
if (ioptions_.compaction_style == kCompactionStyleLevel) { if (ioptions_.compaction_style == kCompactionStyleLevel) {
compaction_picker_.reset( compaction_picker_.reset(
@ -407,7 +407,7 @@ ColumnFamilyData::ColumnFamilyData(
if (column_family_set_->NumberOfColumnFamilies() < 10) { if (column_family_set_->NumberOfColumnFamilies() < 10) {
Log(InfoLogLevel::INFO_LEVEL, ioptions_.info_log, Log(InfoLogLevel::INFO_LEVEL, ioptions_.info_log,
"--------------- Options for column family [%s]:\n", name.c_str()); "--------------- Options for column family [%s]:\n", name.c_str());
options_.DumpCFOptions(ioptions_.info_log); initial_cf_options_.Dump(ioptions_.info_log);
} else { } else {
Log(InfoLogLevel::INFO_LEVEL, ioptions_.info_log, Log(InfoLogLevel::INFO_LEVEL, ioptions_.info_log,
"\t(skipping printing options)\n"); "\t(skipping printing options)\n");
@ -485,7 +485,7 @@ void ColumnFamilyData::SetDropped() {
} }
ColumnFamilyOptions ColumnFamilyData::GetLatestCFOptions() const { ColumnFamilyOptions ColumnFamilyData::GetLatestCFOptions() const {
return BuildColumnFamilyOptions(options_, mutable_cf_options_); return BuildColumnFamilyOptions(initial_cf_options_, mutable_cf_options_);
} }
const double kSlowdownRatio = 1.2; const double kSlowdownRatio = 1.2;
@ -869,14 +869,14 @@ Status ColumnFamilyData::SetOptions(
#endif // ROCKSDB_LITE #endif // ROCKSDB_LITE
ColumnFamilySet::ColumnFamilySet(const std::string& dbname, ColumnFamilySet::ColumnFamilySet(const std::string& dbname,
const DBOptions* db_options, const ImmutableDBOptions* db_options,
const EnvOptions& env_options, const EnvOptions& env_options,
Cache* table_cache, Cache* table_cache,
WriteBufferManager* write_buffer_manager, WriteBufferManager* write_buffer_manager,
WriteController* write_controller) WriteController* write_controller)
: max_column_family_(0), : max_column_family_(0),
dummy_cfd_(new ColumnFamilyData(0, "", nullptr, nullptr, nullptr, dummy_cfd_(new ColumnFamilyData(0, "", nullptr, nullptr, nullptr,
ColumnFamilyOptions(), db_options, ColumnFamilyOptions(), *db_options,
env_options, nullptr)), env_options, nullptr)),
default_cfd_cache_(nullptr), default_cfd_cache_(nullptr),
db_name_(dbname), db_name_(dbname),
@ -948,7 +948,7 @@ ColumnFamilyData* ColumnFamilySet::CreateColumnFamily(
assert(column_families_.find(name) == column_families_.end()); assert(column_families_.find(name) == column_families_.end());
ColumnFamilyData* new_cfd = new ColumnFamilyData( ColumnFamilyData* new_cfd = new ColumnFamilyData(
id, name, dummy_versions, table_cache_, write_buffer_manager_, options, id, name, dummy_versions, table_cache_, write_buffer_manager_, options,
db_options_, env_options_, this); *db_options_, env_options_, this);
column_families_.insert({name, id}); column_families_.insert({name, id});
column_family_data_.insert({id, new_cfd}); column_family_data_.insert({id, new_cfd});
max_column_family_ = std::max(max_column_family_, id); max_column_family_ = std::max(max_column_family_, id);

@ -136,14 +136,14 @@ extern Status CheckCompressionSupported(const ColumnFamilyOptions& cf_options);
extern Status CheckConcurrentWritesSupported( extern Status CheckConcurrentWritesSupported(
const ColumnFamilyOptions& cf_options); const ColumnFamilyOptions& cf_options);
extern ColumnFamilyOptions SanitizeOptions(const DBOptions& db_options, extern ColumnFamilyOptions SanitizeOptions(const ImmutableDBOptions& db_options,
const InternalKeyComparator* icmp, const InternalKeyComparator* icmp,
const ColumnFamilyOptions& src); const ColumnFamilyOptions& src);
// Wrap user defined table proproties collector factories `from cf_options` // Wrap user defined table proproties collector factories `from cf_options`
// into internal ones in int_tbl_prop_collector_factories. Add a system internal // into internal ones in int_tbl_prop_collector_factories. Add a system internal
// one too. // one too.
extern void GetIntTblPropCollectorFactory( extern void GetIntTblPropCollectorFactory(
const ColumnFamilyOptions& cf_options, const ImmutableCFOptions& ioptions,
std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories); int_tbl_prop_collector_factories);
@ -328,7 +328,8 @@ class ColumnFamilyData {
Version* dummy_versions, Cache* table_cache, Version* dummy_versions, Cache* table_cache,
WriteBufferManager* write_buffer_manager, WriteBufferManager* write_buffer_manager,
const ColumnFamilyOptions& options, const ColumnFamilyOptions& options,
const DBOptions* db_options, const EnvOptions& env_options, const ImmutableDBOptions& db_options,
const EnvOptions& env_options,
ColumnFamilySet* column_family_set); ColumnFamilySet* column_family_set);
uint32_t id_; uint32_t id_;
@ -343,7 +344,7 @@ class ColumnFamilyData {
std::vector<std::unique_ptr<IntTblPropCollectorFactory>> std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
int_tbl_prop_collector_factories_; int_tbl_prop_collector_factories_;
const Options options_; const ColumnFamilyOptions initial_cf_options_;
const ImmutableCFOptions ioptions_; const ImmutableCFOptions ioptions_;
MutableCFOptions mutable_cf_options_; MutableCFOptions mutable_cf_options_;
@ -439,7 +440,8 @@ class ColumnFamilySet {
ColumnFamilyData* current_; ColumnFamilyData* current_;
}; };
ColumnFamilySet(const std::string& dbname, const DBOptions* db_options, ColumnFamilySet(const std::string& dbname,
const ImmutableDBOptions* db_options,
const EnvOptions& env_options, Cache* table_cache, const EnvOptions& env_options, Cache* table_cache,
WriteBufferManager* write_buffer_manager, WriteBufferManager* write_buffer_manager,
WriteController* write_controller); WriteController* write_controller);
@ -496,7 +498,7 @@ class ColumnFamilySet {
ColumnFamilyData* default_cfd_cache_; ColumnFamilyData* default_cfd_cache_;
const std::string db_name_; const std::string db_name_;
const DBOptions* const db_options_; const ImmutableDBOptions* const db_options_;
const EnvOptions env_options_; const EnvOptions env_options_;
Cache* table_cache_; Cache* table_cache_;
WriteBufferManager* write_buffer_manager_; WriteBufferManager* write_buffer_manager_;

@ -2178,8 +2178,8 @@ TEST_F(ColumnFamilyTest, SanitizeOptions) {
original.write_buffer_size = original.write_buffer_size =
l * 4 * 1024 * 1024 + i * 1024 * 1024 + j * 1024 + k; l * 4 * 1024 * 1024 + i * 1024 * 1024 + j * 1024 + k;
ColumnFamilyOptions result = ColumnFamilyOptions result = SanitizeOptions(
SanitizeOptions(db_options, nullptr, original); ImmutableDBOptions(db_options), nullptr, original);
ASSERT_TRUE(result.level0_stop_writes_trigger >= ASSERT_TRUE(result.level0_stop_writes_trigger >=
result.level0_slowdown_writes_trigger); result.level0_slowdown_writes_trigger);
ASSERT_TRUE(result.level0_slowdown_writes_trigger >= ASSERT_TRUE(result.level0_slowdown_writes_trigger >=

@ -151,9 +151,9 @@ Status CompactedDBImpl::Open(const Options& options,
std::unique_ptr<CompactedDBImpl> db(new CompactedDBImpl(db_options, dbname)); std::unique_ptr<CompactedDBImpl> db(new CompactedDBImpl(db_options, dbname));
Status s = db->Init(options); Status s = db->Init(options);
if (s.ok()) { if (s.ok()) {
Log(INFO_LEVEL, db->db_options_.info_log, Log(INFO_LEVEL, db->immutable_db_options_.info_log,
"Opened the db as fully compacted mode"); "Opened the db as fully compacted mode");
LogFlush(db->db_options_.info_log); LogFlush(db->immutable_db_options_.info_log);
*dbptr = db.release(); *dbptr = db.release();
} }
return s; return s;

@ -262,7 +262,7 @@ void CompactionJob::AggregateStatistics() {
} }
CompactionJob::CompactionJob( CompactionJob::CompactionJob(
int job_id, Compaction* compaction, const DBOptions& db_options, int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
const EnvOptions& env_options, VersionSet* versions, const EnvOptions& env_options, VersionSet* versions,
std::atomic<bool>* shutting_down, LogBuffer* log_buffer, std::atomic<bool>* shutting_down, LogBuffer* log_buffer,
Directory* db_directory, Directory* output_directory, Statistics* stats, Directory* db_directory, Directory* output_directory, Statistics* stats,
@ -539,7 +539,7 @@ Status CompactionJob::Run() {
thread.join(); thread.join();
} }
if (output_directory_ && !db_options_.disableDataSync) { if (output_directory_ && !db_options_.disable_data_sync) {
output_directory_->Fsync(); output_directory_->Fsync();
} }
@ -963,7 +963,7 @@ Status CompactionJob::FinishCompactionOutputFile(
sub_compact->total_bytes += current_bytes; sub_compact->total_bytes += current_bytes;
// Finish and check for file errors // Finish and check for file errors
if (s.ok() && !db_options_.disableDataSync) { if (s.ok() && !db_options_.disable_data_sync) {
StopWatch sw(env_, stats_, COMPACTION_OUTFILE_SYNC_MICROS); StopWatch sw(env_, stats_, COMPACTION_OUTFILE_SYNC_MICROS);
s = sub_compact->outfile->Sync(db_options_.use_fsync); s = sub_compact->outfile->Sync(db_options_.use_fsync);
} }

@ -37,6 +37,7 @@
#include "rocksdb/transaction_log.h" #include "rocksdb/transaction_log.h"
#include "table/scoped_arena_iterator.h" #include "table/scoped_arena_iterator.h"
#include "util/autovector.h" #include "util/autovector.h"
#include "util/db_options.h"
#include "util/event_logger.h" #include "util/event_logger.h"
#include "util/stop_watch.h" #include "util/stop_watch.h"
#include "util/thread_local.h" #include "util/thread_local.h"
@ -52,7 +53,8 @@ class Arena;
class CompactionJob { class CompactionJob {
public: public:
CompactionJob(int job_id, Compaction* compaction, const DBOptions& db_options, CompactionJob(int job_id, Compaction* compaction,
const ImmutableDBOptions& db_options,
const EnvOptions& env_options, VersionSet* versions, const EnvOptions& env_options, VersionSet* versions,
std::atomic<bool>* shutting_down, LogBuffer* log_buffer, std::atomic<bool>* shutting_down, LogBuffer* log_buffer,
Directory* db_directory, Directory* output_directory, Directory* db_directory, Directory* output_directory,
@ -120,7 +122,7 @@ class CompactionJob {
// DBImpl state // DBImpl state
const std::string& dbname_; const std::string& dbname_;
const DBOptions& db_options_; const ImmutableDBOptions& db_options_;
const EnvOptions& env_options_; const EnvOptions& env_options_;
Env* env_; Env* env_;

@ -68,7 +68,8 @@ class CompactionJobTest : public testing::Test {
CompactionJobTest() CompactionJobTest()
: env_(Env::Default()), : env_(Env::Default()),
dbname_(test::TmpDir() + "/compaction_job_test"), dbname_(test::TmpDir() + "/compaction_job_test"),
mutable_cf_options_(Options()), db_options_(),
mutable_cf_options_(cf_options_),
table_cache_(NewLRUCache(50000, 16)), table_cache_(NewLRUCache(50000, 16)),
write_buffer_manager_(db_options_.db_write_buffer_size), write_buffer_manager_(db_options_.db_write_buffer_size),
versions_(new VersionSet(dbname_, &db_options_, env_options_, versions_(new VersionSet(dbname_, &db_options_, env_options_,
@ -280,11 +281,11 @@ class CompactionJobTest : public testing::Test {
Env* env_; Env* env_;
std::string dbname_; std::string dbname_;
EnvOptions env_options_; EnvOptions env_options_;
ImmutableDBOptions db_options_;
ColumnFamilyOptions cf_options_;
MutableCFOptions mutable_cf_options_; MutableCFOptions mutable_cf_options_;
std::shared_ptr<Cache> table_cache_; std::shared_ptr<Cache> table_cache_;
WriteController write_controller_; WriteController write_controller_;
DBOptions db_options_;
ColumnFamilyOptions cf_options_;
WriteBufferManager write_buffer_manager_; WriteBufferManager write_buffer_manager_;
std::unique_ptr<VersionSet> versions_; std::unique_ptr<VersionSet> versions_;
InstrumentedMutex mutex_; InstrumentedMutex mutex_;

@ -35,10 +35,10 @@ Status DBImpl::DisableFileDeletions() {
InstrumentedMutexLock l(&mutex_); InstrumentedMutexLock l(&mutex_);
++disable_delete_obsolete_files_; ++disable_delete_obsolete_files_;
if (disable_delete_obsolete_files_ == 1) { if (disable_delete_obsolete_files_ == 1) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"File Deletions Disabled"); "File Deletions Disabled");
} else { } else {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, immutable_db_options_.info_log,
"File Deletions Disabled, but already disabled. Counter: %d", "File Deletions Disabled, but already disabled. Counter: %d",
disable_delete_obsolete_files_); disable_delete_obsolete_files_);
} }
@ -59,12 +59,12 @@ Status DBImpl::EnableFileDeletions(bool force) {
--disable_delete_obsolete_files_; --disable_delete_obsolete_files_;
} }
if (disable_delete_obsolete_files_ == 0) { if (disable_delete_obsolete_files_ == 0) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"File Deletions Enabled"); "File Deletions Enabled");
should_purge_files = true; should_purge_files = true;
FindObsoleteFiles(&job_context, true); FindObsoleteFiles(&job_context, true);
} else { } else {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, immutable_db_options_.info_log,
"File Deletions Enable, but not really enabled. Counter: %d", "File Deletions Enable, but not really enabled. Counter: %d",
disable_delete_obsolete_files_); disable_delete_obsolete_files_);
} }
@ -73,7 +73,7 @@ Status DBImpl::EnableFileDeletions(bool force) {
PurgeObsoleteFiles(job_context); PurgeObsoleteFiles(job_context);
} }
job_context.Clean(); job_context.Clean();
LogFlush(db_options_.info_log); LogFlush(immutable_db_options_.info_log);
return Status::OK(); return Status::OK();
} }
@ -110,7 +110,7 @@ Status DBImpl::GetLiveFiles(std::vector<std::string>& ret,
if (!status.ok()) { if (!status.ok()) {
mutex_.Unlock(); mutex_.Unlock();
Log(InfoLogLevel::ERROR_LEVEL, db_options_.info_log, Log(InfoLogLevel::ERROR_LEVEL, immutable_db_options_.info_log,
"Cannot Flush data %s\n", status.ToString().c_str()); "Cannot Flush data %s\n", status.ToString().c_str());
return status; return status;
} }

File diff suppressed because it is too large Load Diff

@ -40,6 +40,7 @@
#include "rocksdb/write_buffer_manager.h" #include "rocksdb/write_buffer_manager.h"
#include "table/scoped_arena_iterator.h" #include "table/scoped_arena_iterator.h"
#include "util/autovector.h" #include "util/autovector.h"
#include "util/db_options.h"
#include "util/event_logger.h" #include "util/event_logger.h"
#include "util/hash.h" #include "util/hash.h"
#include "util/instrumented_mutex.h" #include "util/instrumented_mutex.h"
@ -167,7 +168,7 @@ class DBImpl : public DB {
using DB::GetOptions; using DB::GetOptions;
virtual Options GetOptions(ColumnFamilyHandle* column_family) const override; virtual Options GetOptions(ColumnFamilyHandle* column_family) const override;
using DB::GetDBOptions; using DB::GetDBOptions;
virtual const DBOptions& GetDBOptions() const override; virtual DBOptions GetDBOptions() const override;
using DB::Flush; using DB::Flush;
virtual Status Flush(const FlushOptions& options, virtual Status Flush(const FlushOptions& options,
ColumnFamilyHandle* column_family) override; ColumnFamilyHandle* column_family) override;
@ -456,7 +457,7 @@ class DBImpl : public DB {
~RecoveredTransaction() { delete batch_; } ~RecoveredTransaction() { delete batch_; }
}; };
bool allow_2pc() const { return db_options_.allow_2pc; } bool allow_2pc() const { return immutable_db_options_.allow_2pc; }
std::unordered_map<std::string, RecoveredTransaction*> std::unordered_map<std::string, RecoveredTransaction*>
recovered_transactions() { recovered_transactions() {
@ -507,7 +508,8 @@ class DBImpl : public DB {
Env* const env_; Env* const env_;
const std::string dbname_; const std::string dbname_;
unique_ptr<VersionSet> versions_; unique_ptr<VersionSet> versions_;
const DBOptions db_options_; const ImmutableDBOptions immutable_db_options_;
MutableDBOptions mutable_db_options_;
Statistics* stats_; Statistics* stats_;
std::unordered_map<std::string, RecoveredTransaction*> std::unordered_map<std::string, RecoveredTransaction*>
recovered_transactions_; recovered_transactions_;
@ -1071,11 +1073,10 @@ class DBImpl : public DB {
size_t GetWalPreallocateBlockSize(uint64_t write_buffer_size) const; size_t GetWalPreallocateBlockSize(uint64_t write_buffer_size) const;
}; };
// Sanitize db options. The caller should delete result.info_log if
// it is not equal to src.info_log.
extern Options SanitizeOptions(const std::string& db, extern Options SanitizeOptions(const std::string& db,
const InternalKeyComparator* icmp, const InternalKeyComparator* icmp,
const Options& src); const Options& src);
extern DBOptions SanitizeOptions(const std::string& db, const DBOptions& src); extern DBOptions SanitizeOptions(const std::string& db, const DBOptions& src);
// Fix user-supplied options to be reasonable // Fix user-supplied options to be reasonable

@ -209,8 +209,8 @@ Status DBImpl::AddFile(ColumnFamilyHandle* column_family,
for (; j < num_files; j++) { for (; j < num_files; j++) {
StopWatch sw(env_, nullptr, 0, &micro_list[j], false); StopWatch sw(env_, nullptr, 0, &micro_list[j], false);
db_fname_list[j] = db_fname_list[j] =
TableFileName(db_options_.db_paths, meta_list[j].fd.GetNumber(), TableFileName(immutable_db_options_.db_paths,
meta_list[j].fd.GetPathId()); meta_list[j].fd.GetNumber(), meta_list[j].fd.GetPathId());
if (move_file) { if (move_file) {
status = env_->LinkFile(file_info_list[j].file_path, db_fname_list[j]); status = env_->LinkFile(file_info_list[j].file_path, db_fname_list[j]);
if (status.IsNotSupported()) { if (status.IsNotSupported()) {
@ -226,7 +226,7 @@ Status DBImpl::AddFile(ColumnFamilyHandle* column_family,
for (size_t i = 0; i < j; i++) { for (size_t i = 0; i < j; i++) {
Status s = env_->DeleteFile(db_fname_list[i]); Status s = env_->DeleteFile(db_fname_list[i]);
if (!s.ok()) { if (!s.ok()) {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, immutable_db_options_.info_log,
"AddFile() clean up for file %s failed : %s", "AddFile() clean up for file %s failed : %s",
db_fname_list[i].c_str(), s.ToString().c_str()); db_fname_list[i].c_str(), s.ToString().c_str());
} }
@ -340,7 +340,7 @@ Status DBImpl::AddFile(ColumnFamilyHandle* column_family,
for (size_t i = 0; i < num_files; i++) { for (size_t i = 0; i < num_files; i++) {
Status s = env_->DeleteFile(db_fname_list[i]); Status s = env_->DeleteFile(db_fname_list[i]);
if (!s.ok()) { if (!s.ok()) {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, immutable_db_options_.info_log,
"AddFile() clean up for file %s failed : %s", "AddFile() clean up for file %s failed : %s",
db_fname_list[i].c_str(), s.ToString().c_str()); db_fname_list[i].c_str(), s.ToString().c_str());
} }
@ -350,7 +350,7 @@ Status DBImpl::AddFile(ColumnFamilyHandle* column_family,
for (size_t i = 0; i < num_files; i++) { for (size_t i = 0; i < num_files; i++) {
Status s = env_->DeleteFile(file_info_list[i].file_path); Status s = env_->DeleteFile(file_info_list[i].file_path);
if (!s.ok()) { if (!s.ok()) {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, immutable_db_options_.info_log,
"%s was added to DB successfully but failed to remove original " "%s was added to DB successfully but failed to remove original "
"file " "file "
"link : %s", "link : %s",

@ -61,7 +61,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
assert(column_family); assert(column_family);
if (target_level < 1) { if (target_level < 1) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"PromoteL0 FAILED. Invalid target level %d\n", target_level); "PromoteL0 FAILED. Invalid target level %d\n", target_level);
return Status::InvalidArgument("Invalid target level"); return Status::InvalidArgument("Invalid target level");
} }
@ -75,7 +75,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
const auto* vstorage = cfd->current()->storage_info(); const auto* vstorage = cfd->current()->storage_info();
if (target_level >= vstorage->num_levels()) { if (target_level >= vstorage->num_levels()) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"PromoteL0 FAILED. Target level %d does not exist\n", target_level); "PromoteL0 FAILED. Target level %d does not exist\n", target_level);
job_context.Clean(); job_context.Clean();
return Status::InvalidArgument("Target level does not exist"); return Status::InvalidArgument("Target level does not exist");
@ -94,7 +94,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
for (size_t i = 0; i < l0_files.size(); ++i) { for (size_t i = 0; i < l0_files.size(); ++i) {
auto f = l0_files[i]; auto f = l0_files[i];
if (f->being_compacted) { if (f->being_compacted) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"PromoteL0 FAILED. File %" PRIu64 " being compacted\n", "PromoteL0 FAILED. File %" PRIu64 " being compacted\n",
f->fd.GetNumber()); f->fd.GetNumber());
job_context.Clean(); job_context.Clean();
@ -104,7 +104,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
if (i == 0) continue; if (i == 0) continue;
auto prev_f = l0_files[i - 1]; auto prev_f = l0_files[i - 1];
if (icmp->Compare(prev_f->largest, f->smallest) >= 0) { if (icmp->Compare(prev_f->largest, f->smallest) >= 0) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"PromoteL0 FAILED. Files %" PRIu64 " and %" PRIu64 "PromoteL0 FAILED. Files %" PRIu64 " and %" PRIu64
" have overlapping ranges\n", " have overlapping ranges\n",
prev_f->fd.GetNumber(), f->fd.GetNumber()); prev_f->fd.GetNumber(), f->fd.GetNumber());
@ -116,7 +116,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
// Check that all levels up to target_level are empty. // Check that all levels up to target_level are empty.
for (int level = 1; level <= target_level; ++level) { for (int level = 1; level <= target_level; ++level) {
if (vstorage->NumLevelFiles(level) > 0) { if (vstorage->NumLevelFiles(level) > 0) {
Log(InfoLogLevel::INFO_LEVEL, db_options_.info_log, Log(InfoLogLevel::INFO_LEVEL, immutable_db_options_.info_log,
"PromoteL0 FAILED. Level %d not empty\n", level); "PromoteL0 FAILED. Level %d not empty\n", level);
job_context.Clean(); job_context.Clean();
return Status::InvalidArgument( return Status::InvalidArgument(
@ -141,7 +141,7 @@ Status DBImpl::PromoteL0(ColumnFamilyHandle* column_family, int target_level) {
cfd, &job_context, *cfd->GetLatestMutableCFOptions()); cfd, &job_context, *cfd->GetLatestMutableCFOptions());
} }
} // lock released here } // lock released here
LogFlush(db_options_.info_log); LogFlush(immutable_db_options_.info_log);
job_context.Clean(); job_context.Clean();
return status; return status;

@ -19,8 +19,9 @@ namespace rocksdb {
DBImplReadOnly::DBImplReadOnly(const DBOptions& db_options, DBImplReadOnly::DBImplReadOnly(const DBOptions& db_options,
const std::string& dbname) const std::string& dbname)
: DBImpl(db_options, dbname) { : DBImpl(db_options, dbname) {
Log(INFO_LEVEL, db_options_.info_log, "Opening the db in read only mode"); Log(INFO_LEVEL, immutable_db_options_.info_log,
LogFlush(db_options_.info_log); "Opening the db in read only mode");
LogFlush(immutable_db_options_.info_log);
} }
DBImplReadOnly::~DBImplReadOnly() { DBImplReadOnly::~DBImplReadOnly() {

@ -16,12 +16,12 @@
#include <vector> #include <vector>
#include "db/filename.h" #include "db/filename.h"
#include "rocksdb/options.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
namespace rocksdb { namespace rocksdb {
void DumpDBFileSummary(const DBOptions& options, const std::string& dbname) { void DumpDBFileSummary(const ImmutableDBOptions& options,
const std::string& dbname) {
if (options.info_log == nullptr) { if (options.info_log == nullptr) {
return; return;
} }

@ -6,8 +6,9 @@
#include <string> #include <string>
#include "rocksdb/options.h" #include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
void DumpDBFileSummary(const DBOptions& options, const std::string& dbname); void DumpDBFileSummary(const ImmutableDBOptions& options,
const std::string& dbname);
} // namespace rocksdb } // namespace rocksdb

@ -45,8 +45,9 @@ class DBOptionsTest : public DBTestBase {
std::unordered_map<std::string, std::string> GetRandomizedMutableCFOptionsMap( std::unordered_map<std::string, std::string> GetRandomizedMutableCFOptionsMap(
Random* rnd) { Random* rnd) {
Options options; Options options;
ImmutableDBOptions db_options(options);
test::RandomInitCFOptions(&options, rnd); test::RandomInitCFOptions(&options, rnd);
auto sanitized_options = SanitizeOptions(options, nullptr, options); auto sanitized_options = SanitizeOptions(db_options, nullptr, options);
auto opt_map = GetMutableCFOptionsMap(sanitized_options); auto opt_map = GetMutableCFOptionsMap(sanitized_options);
delete options.compaction_filter; delete options.compaction_filter;
return opt_map; return opt_map;

@ -2811,7 +2811,7 @@ class ModelDB : public DB {
} }
using DB::GetDBOptions; using DB::GetDBOptions;
virtual const DBOptions& GetDBOptions() const override { return options_; } virtual DBOptions GetDBOptions() const override { return options_; }
using DB::Flush; using DB::Flush;
virtual Status Flush(const rocksdb::FlushOptions& options, virtual Status Flush(const rocksdb::FlushOptions& options,

@ -651,7 +651,7 @@ class RecoveryTestHelper {
// Create WAL files with values filled in // Create WAL files with values filled in
static void FillData(DBWALTest* test, const Options& options, static void FillData(DBWALTest* test, const Options& options,
const size_t wal_count, size_t* count) { const size_t wal_count, size_t* count) {
const DBOptions& db_options = options; const ImmutableDBOptions db_options(options);
*count = 0; *count = 0;

@ -386,10 +386,10 @@ Status SetIdentityFile(Env* env, const std::string& dbname) {
return s; return s;
} }
Status SyncManifest(Env* env, const DBOptions* db_options, Status SyncManifest(Env* env, const ImmutableDBOptions* db_options,
WritableFileWriter* file) { WritableFileWriter* file) {
TEST_KILL_RANDOM("SyncManifest:0", rocksdb_kill_odds * REDUCE_ODDS2); TEST_KILL_RANDOM("SyncManifest:0", rocksdb_kill_odds * REDUCE_ODDS2);
if (db_options->disableDataSync) { if (db_options->disable_data_sync) {
return Status::OK(); return Status::OK();
} else { } else {
StopWatch sw(env, db_options->statistics.get(), MANIFEST_FILE_SYNC_MICROS); StopWatch sw(env, db_options->statistics.get(), MANIFEST_FILE_SYNC_MICROS);

@ -20,6 +20,7 @@
#include "rocksdb/slice.h" #include "rocksdb/slice.h"
#include "rocksdb/status.h" #include "rocksdb/status.h"
#include "rocksdb/transaction_log.h" #include "rocksdb/transaction_log.h"
#include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
@ -159,7 +160,7 @@ extern Status SetCurrentFile(Env* env, const std::string& dbname,
extern Status SetIdentityFile(Env* env, const std::string& dbname); extern Status SetIdentityFile(Env* env, const std::string& dbname);
// Sync manifest file `file`. // Sync manifest file `file`.
extern Status SyncManifest(Env* env, const DBOptions* db_options, extern Status SyncManifest(Env* env, const ImmutableDBOptions* db_options,
WritableFileWriter* file); WritableFileWriter* file);
} // namespace rocksdb } // namespace rocksdb

@ -56,7 +56,7 @@
namespace rocksdb { namespace rocksdb {
FlushJob::FlushJob(const std::string& dbname, ColumnFamilyData* cfd, FlushJob::FlushJob(const std::string& dbname, ColumnFamilyData* cfd,
const DBOptions& db_options, const ImmutableDBOptions& db_options,
const MutableCFOptions& mutable_cf_options, const MutableCFOptions& mutable_cf_options,
const EnvOptions& env_options, VersionSet* versions, const EnvOptions& env_options, VersionSet* versions,
InstrumentedMutex* db_mutex, InstrumentedMutex* db_mutex,
@ -294,7 +294,7 @@ Status FlushJob::WriteLevel0Table() {
meta_.fd.GetFileSize(), s.ToString().c_str(), meta_.fd.GetFileSize(), s.ToString().c_str(),
meta_.marked_for_compaction ? " (needs compaction)" : ""); meta_.marked_for_compaction ? " (needs compaction)" : "");
if (!db_options_.disableDataSync && output_file_directory_ != nullptr) { if (!db_options_.disable_data_sync && output_file_directory_ != nullptr) {
output_file_directory_->Fsync(); output_file_directory_->Fsync();
} }
TEST_SYNC_POINT("FlushJob::WriteLevel0Table"); TEST_SYNC_POINT("FlushJob::WriteLevel0Table");

@ -34,6 +34,7 @@
#include "rocksdb/transaction_log.h" #include "rocksdb/transaction_log.h"
#include "table/scoped_arena_iterator.h" #include "table/scoped_arena_iterator.h"
#include "util/autovector.h" #include "util/autovector.h"
#include "util/db_options.h"
#include "util/event_logger.h" #include "util/event_logger.h"
#include "util/instrumented_mutex.h" #include "util/instrumented_mutex.h"
#include "util/stop_watch.h" #include "util/stop_watch.h"
@ -53,7 +54,7 @@ class FlushJob {
// TODO(icanadi) make effort to reduce number of parameters here // TODO(icanadi) make effort to reduce number of parameters here
// IMPORTANT: mutable_cf_options needs to be alive while FlushJob is alive // IMPORTANT: mutable_cf_options needs to be alive while FlushJob is alive
FlushJob(const std::string& dbname, ColumnFamilyData* cfd, FlushJob(const std::string& dbname, ColumnFamilyData* cfd,
const DBOptions& db_options, const ImmutableDBOptions& db_options,
const MutableCFOptions& mutable_cf_options, const MutableCFOptions& mutable_cf_options,
const EnvOptions& env_options, VersionSet* versions, const EnvOptions& env_options, VersionSet* versions,
InstrumentedMutex* db_mutex, std::atomic<bool>* shutting_down, InstrumentedMutex* db_mutex, std::atomic<bool>* shutting_down,
@ -78,7 +79,7 @@ class FlushJob {
Status WriteLevel0Table(); Status WriteLevel0Table();
const std::string& dbname_; const std::string& dbname_;
ColumnFamilyData* cfd_; ColumnFamilyData* cfd_;
const DBOptions& db_options_; const ImmutableDBOptions& db_options_;
const MutableCFOptions& mutable_cf_options_; const MutableCFOptions& mutable_cf_options_;
const EnvOptions& env_options_; const EnvOptions& env_options_;
VersionSet* versions_; VersionSet* versions_;

@ -28,6 +28,8 @@ class FlushJobTest : public testing::Test {
FlushJobTest() FlushJobTest()
: env_(Env::Default()), : env_(Env::Default()),
dbname_(test::TmpDir() + "/flush_job_test"), dbname_(test::TmpDir() + "/flush_job_test"),
options_(),
db_options_(options_),
table_cache_(NewLRUCache(50000, 16)), table_cache_(NewLRUCache(50000, 16)),
write_buffer_manager_(db_options_.db_write_buffer_size), write_buffer_manager_(db_options_.db_write_buffer_size),
versions_(new VersionSet(dbname_, &db_options_, env_options_, versions_(new VersionSet(dbname_, &db_options_, env_options_,
@ -74,9 +76,10 @@ class FlushJobTest : public testing::Test {
Env* env_; Env* env_;
std::string dbname_; std::string dbname_;
EnvOptions env_options_; EnvOptions env_options_;
Options options_;
ImmutableDBOptions db_options_;
std::shared_ptr<Cache> table_cache_; std::shared_ptr<Cache> table_cache_;
WriteController write_controller_; WriteController write_controller_;
DBOptions db_options_;
WriteBufferManager write_buffer_manager_; WriteBufferManager write_buffer_manager_;
ColumnFamilyOptions cf_options_; ColumnFamilyOptions cf_options_;
std::unique_ptr<VersionSet> versions_; std::unique_ptr<VersionSet> versions_;

@ -57,14 +57,16 @@ class MemTableListTest : public testing::Test {
// Create a mock VersionSet // Create a mock VersionSet
DBOptions db_options; DBOptions db_options;
ImmutableDBOptions immutable_db_options(db_options);
EnvOptions env_options; EnvOptions env_options;
shared_ptr<Cache> table_cache(NewLRUCache(50000, 16)); shared_ptr<Cache> table_cache(NewLRUCache(50000, 16));
WriteBufferManager write_buffer_manager(db_options.db_write_buffer_size); WriteBufferManager write_buffer_manager(db_options.db_write_buffer_size);
WriteController write_controller(10000000u); WriteController write_controller(10000000u);
CreateDB(); CreateDB();
VersionSet versions(dbname, &db_options, env_options, table_cache.get(), VersionSet versions(dbname, &immutable_db_options, env_options,
&write_buffer_manager, &write_controller); table_cache.get(), &write_buffer_manager,
&write_controller);
// Create mock default ColumnFamilyData // Create mock default ColumnFamilyData
ColumnFamilyOptions cf_options; ColumnFamilyOptions cf_options;

@ -99,10 +99,11 @@ class Repairer {
env_(db_options.env), env_(db_options.env),
env_options_(), env_options_(),
db_options_(SanitizeOptions(dbname_, db_options)), db_options_(SanitizeOptions(dbname_, db_options)),
immutable_db_options_(db_options_),
icmp_(default_cf_opts.comparator), icmp_(default_cf_opts.comparator),
default_cf_opts_(default_cf_opts), default_cf_opts_(default_cf_opts),
default_cf_iopts_( default_cf_iopts_(
ImmutableCFOptions(Options(db_options_, default_cf_opts))), ImmutableCFOptions(immutable_db_options_, default_cf_opts)),
unknown_cf_opts_(unknown_cf_opts), unknown_cf_opts_(unknown_cf_opts),
create_unknown_cfs_(create_unknown_cfs), create_unknown_cfs_(create_unknown_cfs),
raw_table_cache_( raw_table_cache_(
@ -113,8 +114,8 @@ class Repairer {
raw_table_cache_.get())), raw_table_cache_.get())),
wb_(db_options_.db_write_buffer_size), wb_(db_options_.db_write_buffer_size),
wc_(db_options_.delayed_write_rate), wc_(db_options_.delayed_write_rate),
vset_(dbname_, &db_options_, env_options_, raw_table_cache_.get(), &wb_, vset_(dbname_, &immutable_db_options_, env_options_,
&wc_), raw_table_cache_.get(), &wb_, &wc_),
next_file_number_(1) { next_file_number_(1) {
for (const auto& cfd : column_families) { for (const auto& cfd : column_families) {
cf_name_to_opts_[cfd.name] = cfd.options; cf_name_to_opts_[cfd.name] = cfd.options;
@ -222,6 +223,7 @@ class Repairer {
Env* const env_; Env* const env_;
const EnvOptions env_options_; const EnvOptions env_options_;
const DBOptions db_options_; const DBOptions db_options_;
const ImmutableDBOptions immutable_db_options_;
const InternalKeyComparator icmp_; const InternalKeyComparator icmp_;
const ColumnFamilyOptions default_cf_opts_; const ColumnFamilyOptions default_cf_opts_;
const ImmutableCFOptions default_cf_iopts_; // table_cache_ holds reference const ImmutableCFOptions default_cf_iopts_; // table_cache_ holds reference

@ -256,7 +256,7 @@ void TestCustomizedTablePropertiesCollector(
int_tbl_prop_collector_factories.emplace_back( int_tbl_prop_collector_factories.emplace_back(
new RegularKeysStartWithAFactory(backward_mode)); new RegularKeysStartWithAFactory(backward_mode));
} else { } else {
GetIntTblPropCollectorFactory(options, &int_tbl_prop_collector_factories); GetIntTblPropCollectorFactory(ioptions, &int_tbl_prop_collector_factories);
} }
MakeBuilder(options, ioptions, internal_comparator, MakeBuilder(options, ioptions, internal_comparator,
&int_tbl_prop_collector_factories, &writer, &builder); &int_tbl_prop_collector_factories, &writer, &builder);
@ -393,7 +393,8 @@ void TestInternalKeyPropertiesCollector(
options = SanitizeOptions("db", // just a place holder options = SanitizeOptions("db", // just a place holder
&pikc, &pikc,
options); options);
GetIntTblPropCollectorFactory(options, &int_tbl_prop_collector_factories); ImmutableCFOptions ioptions(options);
GetIntTblPropCollectorFactory(ioptions, &int_tbl_prop_collector_factories);
options.comparator = comparator; options.comparator = comparator;
} else { } else {
int_tbl_prop_collector_factories.emplace_back( int_tbl_prop_collector_factories.emplace_back(

@ -16,7 +16,7 @@
namespace rocksdb { namespace rocksdb {
TransactionLogIteratorImpl::TransactionLogIteratorImpl( TransactionLogIteratorImpl::TransactionLogIteratorImpl(
const std::string& dir, const DBOptions* options, const std::string& dir, const ImmutableDBOptions* options,
const TransactionLogIterator::ReadOptions& read_options, const TransactionLogIterator::ReadOptions& read_options,
const EnvOptions& soptions, const SequenceNumber seq, const EnvOptions& soptions, const SequenceNumber seq,
std::unique_ptr<VectorLogPtr> files, VersionSet const* const versions) std::unique_ptr<VectorLogPtr> files, VersionSet const* const versions)

@ -2,19 +2,20 @@
// This source code is licensed under the BSD-style license found in the // 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 // 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. // of patent rights can be found in the PATENTS file in the same directory.
#pragma once
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
#pragma once
#include <vector> #include <vector>
#include "db/filename.h"
#include "db/log_reader.h"
#include "db/version_set.h"
#include "port/port.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "rocksdb/options.h" #include "rocksdb/options.h"
#include "rocksdb/types.h"
#include "rocksdb/transaction_log.h" #include "rocksdb/transaction_log.h"
#include "db/version_set.h" #include "rocksdb/types.h"
#include "db/log_reader.h" #include "util/db_options.h"
#include "db/filename.h"
#include "port/port.h"
namespace rocksdb { namespace rocksdb {
@ -58,7 +59,7 @@ class LogFileImpl : public LogFile {
class TransactionLogIteratorImpl : public TransactionLogIterator { class TransactionLogIteratorImpl : public TransactionLogIterator {
public: public:
TransactionLogIteratorImpl( TransactionLogIteratorImpl(
const std::string& dir, const DBOptions* options, const std::string& dir, const ImmutableDBOptions* options,
const TransactionLogIterator::ReadOptions& read_options, const TransactionLogIterator::ReadOptions& read_options,
const EnvOptions& soptions, const SequenceNumber seqNum, const EnvOptions& soptions, const SequenceNumber seqNum,
std::unique_ptr<VectorLogPtr> files, VersionSet const* const versions); std::unique_ptr<VectorLogPtr> files, VersionSet const* const versions);
@ -73,7 +74,7 @@ class TransactionLogIteratorImpl : public TransactionLogIterator {
private: private:
const std::string& dir_; const std::string& dir_;
const DBOptions* options_; const ImmutableDBOptions* options_;
const TransactionLogIterator::ReadOptions read_options_; const TransactionLogIterator::ReadOptions read_options_;
const EnvOptions& soptions_; const EnvOptions& soptions_;
SequenceNumber startingSequenceNumber_; SequenceNumber startingSequenceNumber_;

@ -2093,7 +2093,8 @@ struct VersionSet::ManifestWriter {
: done(false), cv(mu), cfd(_cfd), edit_list(e) {} : done(false), cv(mu), cfd(_cfd), edit_list(e) {}
}; };
VersionSet::VersionSet(const std::string& dbname, const DBOptions* db_options, VersionSet::VersionSet(const std::string& dbname,
const ImmutableDBOptions* db_options,
const EnvOptions& storage_options, Cache* table_cache, const EnvOptions& storage_options, Cache* table_cache,
WriteBufferManager* write_buffer_manager, WriteBufferManager* write_buffer_manager,
WriteController* write_controller) WriteController* write_controller)
@ -2335,8 +2336,9 @@ Status VersionSet::LogAndApply(ColumnFamilyData* column_family_data,
// If we just created a new descriptor file, install it by writing a // If we just created a new descriptor file, install it by writing a
// new CURRENT file that points to it. // new CURRENT file that points to it.
if (s.ok() && new_descriptor_log) { if (s.ok() && new_descriptor_log) {
s = SetCurrentFile(env_, dbname_, pending_manifest_file_number_, s = SetCurrentFile(
db_options_->disableDataSync ? nullptr : db_directory); env_, dbname_, pending_manifest_file_number_,
db_options_->disable_data_sync ? nullptr : db_directory);
} }
if (s.ok()) { if (s.ok()) {
@ -2847,12 +2849,13 @@ Status VersionSet::ReduceNumberOfLevels(const std::string& dbname,
"Number of levels needs to be bigger than 1"); "Number of levels needs to be bigger than 1");
} }
ImmutableDBOptions db_options(*options);
ColumnFamilyOptions cf_options(*options); ColumnFamilyOptions cf_options(*options);
std::shared_ptr<Cache> tc(NewLRUCache(options->max_open_files - 10, std::shared_ptr<Cache> tc(NewLRUCache(options->max_open_files - 10,
options->table_cache_numshardbits)); options->table_cache_numshardbits));
WriteController wc(options->delayed_write_rate); WriteController wc(options->delayed_write_rate);
WriteBufferManager wb(options->db_write_buffer_size); WriteBufferManager wb(options->db_write_buffer_size);
VersionSet versions(dbname, options, env_options, tc.get(), &wb, &wc); VersionSet versions(dbname, &db_options, env_options, tc.get(), &wb, &wc);
Status status; Status status;
std::vector<ColumnFamilyDescriptor> dummy; std::vector<ColumnFamilyDescriptor> dummy;

@ -28,18 +28,19 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "db/dbformat.h" #include "db/column_family.h"
#include "db/version_builder.h"
#include "db/version_edit.h"
#include "port/port.h"
#include "db/table_cache.h"
#include "db/compaction.h" #include "db/compaction.h"
#include "db/compaction_picker.h" #include "db/compaction_picker.h"
#include "db/column_family.h" #include "db/dbformat.h"
#include "db/log_reader.h"
#include "db/file_indexer.h" #include "db/file_indexer.h"
#include "db/log_reader.h"
#include "db/table_cache.h"
#include "db/version_builder.h"
#include "db/version_edit.h"
#include "db/write_controller.h" #include "db/write_controller.h"
#include "port/port.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "util/db_options.h"
#include "util/instrumented_mutex.h" #include "util/instrumented_mutex.h"
namespace rocksdb { namespace rocksdb {
@ -574,7 +575,7 @@ class Version {
class VersionSet { class VersionSet {
public: public:
VersionSet(const std::string& dbname, const DBOptions* db_options, VersionSet(const std::string& dbname, const ImmutableDBOptions* db_options,
const EnvOptions& env_options, Cache* table_cache, const EnvOptions& env_options, Cache* table_cache,
WriteBufferManager* write_buffer_manager, WriteBufferManager* write_buffer_manager,
WriteController* write_controller); WriteController* write_controller);
@ -756,7 +757,7 @@ class VersionSet {
Env* const env_; Env* const env_;
const std::string dbname_; const std::string dbname_;
const DBOptions* const db_options_; const ImmutableDBOptions* const db_options_;
std::atomic<uint64_t> next_file_number_; std::atomic<uint64_t> next_file_number_;
uint64_t manifest_file_number_; uint64_t manifest_file_number_;
uint64_t options_file_number_; uint64_t options_file_number_;

@ -128,8 +128,8 @@ Status WalManager::GetUpdatesSince(
// b. get sorted non-empty archived logs // b. get sorted non-empty archived logs
// c. delete what should be deleted // c. delete what should be deleted
void WalManager::PurgeObsoleteWALFiles() { void WalManager::PurgeObsoleteWALFiles() {
bool const ttl_enabled = db_options_.WAL_ttl_seconds > 0; bool const ttl_enabled = db_options_.wal_ttl_seconds > 0;
bool const size_limit_enabled = db_options_.WAL_size_limit_MB > 0; bool const size_limit_enabled = db_options_.wal_size_limit_mb > 0;
if (!ttl_enabled && !size_limit_enabled) { if (!ttl_enabled && !size_limit_enabled) {
return; return;
} }
@ -144,7 +144,7 @@ void WalManager::PurgeObsoleteWALFiles() {
} }
uint64_t const now_seconds = static_cast<uint64_t>(current_time); uint64_t const now_seconds = static_cast<uint64_t>(current_time);
uint64_t const time_to_check = (ttl_enabled && !size_limit_enabled) uint64_t const time_to_check = (ttl_enabled && !size_limit_enabled)
? db_options_.WAL_ttl_seconds / 2 ? db_options_.wal_ttl_seconds / 2
: kDefaultIntervalToDeleteObsoleteWAL; : kDefaultIntervalToDeleteObsoleteWAL;
if (purge_wal_files_last_run_ + time_to_check > now_seconds) { if (purge_wal_files_last_run_ + time_to_check > now_seconds) {
@ -180,7 +180,7 @@ void WalManager::PurgeObsoleteWALFiles() {
file_path.c_str(), s.ToString().c_str()); file_path.c_str(), s.ToString().c_str());
continue; continue;
} }
if (now_seconds - file_m_time > db_options_.WAL_ttl_seconds) { if (now_seconds - file_m_time > db_options_.wal_ttl_seconds) {
s = env_->DeleteFile(file_path); s = env_->DeleteFile(file_path);
if (!s.ok()) { if (!s.ok()) {
Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log, Log(InfoLogLevel::WARN_LEVEL, db_options_.info_log,
@ -229,7 +229,7 @@ void WalManager::PurgeObsoleteWALFiles() {
} }
size_t const files_keep_num = size_t const files_keep_num =
db_options_.WAL_size_limit_MB * 1024 * 1024 / log_file_size; db_options_.wal_size_limit_mb * 1024 * 1024 / log_file_size;
if (log_files_num <= files_keep_num) { if (log_files_num <= files_keep_num) {
return; return;
} }

@ -17,22 +17,21 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include "db/version_set.h"
#include "port/port.h" #include "port/port.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "rocksdb/options.h"
#include "rocksdb/types.h"
#include "rocksdb/transaction_log.h"
#include "rocksdb/status.h" #include "rocksdb/status.h"
#include "rocksdb/transaction_log.h"
#include "db/version_set.h" #include "rocksdb/types.h"
#include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
class WalManager { class WalManager {
public: public:
WalManager(const DBOptions& db_options, const EnvOptions& env_options) WalManager(const ImmutableDBOptions& db_options,
const EnvOptions& env_options)
: db_options_(db_options), : db_options_(db_options),
env_options_(env_options), env_options_(env_options),
env_(db_options.env), env_(db_options.env),
@ -75,7 +74,7 @@ class WalManager {
SequenceNumber* sequence); SequenceNumber* sequence);
// ------- state from DBImpl ------ // ------- state from DBImpl ------
const DBOptions& db_options_; const ImmutableDBOptions& db_options_;
const EnvOptions& env_options_; const EnvOptions& env_options_;
Env* env_; Env* env_;

@ -33,6 +33,7 @@ class WalManagerTest : public testing::Test {
WalManagerTest() WalManagerTest()
: env_(new MockEnv(Env::Default())), : env_(new MockEnv(Env::Default())),
dbname_(test::TmpDir() + "/wal_manager_test"), dbname_(test::TmpDir() + "/wal_manager_test"),
db_options_(),
table_cache_(NewLRUCache(50000, 16)), table_cache_(NewLRUCache(50000, 16)),
write_buffer_manager_(db_options_.db_write_buffer_size), write_buffer_manager_(db_options_.db_write_buffer_size),
current_log_number_(0) { current_log_number_(0) {
@ -100,10 +101,10 @@ class WalManagerTest : public testing::Test {
std::unique_ptr<MockEnv> env_; std::unique_ptr<MockEnv> env_;
std::string dbname_; std::string dbname_;
ImmutableDBOptions db_options_;
WriteController write_controller_; WriteController write_controller_;
EnvOptions env_options_; EnvOptions env_options_;
std::shared_ptr<Cache> table_cache_; std::shared_ptr<Cache> table_cache_;
DBOptions db_options_;
WriteBufferManager write_buffer_manager_; WriteBufferManager write_buffer_manager_;
std::unique_ptr<VersionSet> versions_; std::unique_ptr<VersionSet> versions_;
std::unique_ptr<WalManager> wal_manager_; std::unique_ptr<WalManager> wal_manager_;
@ -205,8 +206,8 @@ int CountRecords(TransactionLogIterator* iter) {
} // namespace } // namespace
TEST_F(WalManagerTest, WALArchivalSizeLimit) { TEST_F(WalManagerTest, WALArchivalSizeLimit) {
db_options_.WAL_ttl_seconds = 0; db_options_.wal_ttl_seconds = 0;
db_options_.WAL_size_limit_MB = 1000; db_options_.wal_size_limit_mb = 1000;
Init(); Init();
// TEST : Create WalManager with huge size limit and no ttl. // TEST : Create WalManager with huge size limit and no ttl.
@ -214,7 +215,7 @@ TEST_F(WalManagerTest, WALArchivalSizeLimit) {
// Count the archived log files that survived. // Count the archived log files that survived.
// Assert that all of them did. // Assert that all of them did.
// Change size limit. Re-open WalManager. // Change size limit. Re-open WalManager.
// Assert that archive is not greater than WAL_size_limit_MB after // Assert that archive is not greater than wal_size_limit_mb after
// PurgeObsoleteWALFiles() // PurgeObsoleteWALFiles()
// Set ttl and time_to_check_ to small values. Re-open db. // Set ttl and time_to_check_ to small values. Re-open db.
// Assert that there are no archived logs left. // Assert that there are no archived logs left.
@ -226,14 +227,14 @@ TEST_F(WalManagerTest, WALArchivalSizeLimit) {
ListSpecificFiles(env_.get(), archive_dir, kLogFile); ListSpecificFiles(env_.get(), archive_dir, kLogFile);
ASSERT_EQ(log_files.size(), 20U); ASSERT_EQ(log_files.size(), 20U);
db_options_.WAL_size_limit_MB = 8; db_options_.wal_size_limit_mb = 8;
Reopen(); Reopen();
wal_manager_->PurgeObsoleteWALFiles(); wal_manager_->PurgeObsoleteWALFiles();
uint64_t archive_size = GetLogDirSize(archive_dir, env_.get()); uint64_t archive_size = GetLogDirSize(archive_dir, env_.get());
ASSERT_TRUE(archive_size <= db_options_.WAL_size_limit_MB * 1024 * 1024); ASSERT_TRUE(archive_size <= db_options_.wal_size_limit_mb * 1024 * 1024);
db_options_.WAL_ttl_seconds = 1; db_options_.wal_ttl_seconds = 1;
env_->FakeSleepForMicroseconds(2 * 1000 * 1000); env_->FakeSleepForMicroseconds(2 * 1000 * 1000);
Reopen(); Reopen();
wal_manager_->PurgeObsoleteWALFiles(); wal_manager_->PurgeObsoleteWALFiles();
@ -243,7 +244,7 @@ TEST_F(WalManagerTest, WALArchivalSizeLimit) {
} }
TEST_F(WalManagerTest, WALArchivalTtl) { TEST_F(WalManagerTest, WALArchivalTtl) {
db_options_.WAL_ttl_seconds = 1000; db_options_.wal_ttl_seconds = 1000;
Init(); Init();
// TEST : Create WalManager with a ttl and no size limit. // TEST : Create WalManager with a ttl and no size limit.
@ -259,7 +260,7 @@ TEST_F(WalManagerTest, WALArchivalTtl) {
ListSpecificFiles(env_.get(), archive_dir, kLogFile); ListSpecificFiles(env_.get(), archive_dir, kLogFile);
ASSERT_GT(log_files.size(), 0U); ASSERT_GT(log_files.size(), 0U);
db_options_.WAL_ttl_seconds = 1; db_options_.wal_ttl_seconds = 1;
env_->FakeSleepForMicroseconds(3 * 1000 * 1000); env_->FakeSleepForMicroseconds(3 * 1000 * 1000);
Reopen(); Reopen();
wal_manager_->PurgeObsoleteWALFiles(); wal_manager_->PurgeObsoleteWALFiles();

@ -701,7 +701,7 @@ class DB {
return GetOptions(DefaultColumnFamily()); return GetOptions(DefaultColumnFamily());
} }
virtual const DBOptions& GetDBOptions() const = 0; virtual DBOptions GetDBOptions() const = 0;
// Flush all mem-table data. // Flush all mem-table data.
virtual Status Flush(const FlushOptions& options, virtual Status Flush(const FlushOptions& options,

@ -224,7 +224,7 @@ class StackableDB : public DB {
} }
using DB::GetDBOptions; using DB::GetDBOptions;
virtual const DBOptions& GetDBOptions() const override { virtual DBOptions GetDBOptions() const override {
return db_->GetDBOptions(); return db_->GetDBOptions();
} }

@ -88,18 +88,21 @@ LIB_SOURCES = \
util/arena.cc \ util/arena.cc \
util/bloom.cc \ util/bloom.cc \
util/build_version.cc \ util/build_version.cc \
util/cf_options.cc \
util/clock_cache.cc \ util/clock_cache.cc \
util/coding.cc \ util/coding.cc \
util/comparator.cc \ util/comparator.cc \
util/compaction_job_stats_impl.cc \ util/compaction_job_stats_impl.cc \
util/concurrent_arena.cc \ util/concurrent_arena.cc \
util/crc32c.cc \ util/crc32c.cc \
util/db_options.cc \
util/delete_scheduler.cc \ util/delete_scheduler.cc \
util/dynamic_bloom.cc \ util/dynamic_bloom.cc \
util/env.cc \ util/env.cc \
util/env_chroot.cc \ util/env_chroot.cc \
util/env_hdfs.cc \ util/env_hdfs.cc \
util/env_posix.cc \ util/env_posix.cc \
util/event_logger.cc \
util/file_util.cc \ util/file_util.cc \
util/file_reader_writer.cc \ util/file_reader_writer.cc \
util/filter_policy.cc \ util/filter_policy.cc \
@ -109,13 +112,39 @@ LIB_SOURCES = \
util/instrumented_mutex.cc \ util/instrumented_mutex.cc \
util/iostats_context.cc \ util/iostats_context.cc \
util/io_posix.cc \ util/io_posix.cc \
util/log_buffer.cc \
util/logging.cc \
util/lru_cache.cc \ util/lru_cache.cc \
util/threadpool_imp.cc \ util/memenv.cc \
util/transaction_test_util.cc \ util/murmurhash.cc \
util/options.cc \
util/options_helper.cc \
util/options_parser.cc \
util/options_sanity_check.cc \
util/perf_context.cc \
util/perf_level.cc \
util/random.cc \
util/rate_limiter.cc \
util/sharded_cache.cc \ util/sharded_cache.cc \
util/slice.cc \
util/sst_file_manager_impl.cc \ util/sst_file_manager_impl.cc \
util/statistics.cc \
util/status.cc \
util/status_message.cc \
util/string_util.cc \
util/sync_point.cc \
util/thread_local.cc \
util/thread_status_impl.cc \
util/thread_status_updater.cc \
util/thread_status_updater_debug.cc \
util/thread_status_util.cc \
util/thread_status_util_debug.cc \
util/threadpool_imp.cc \
util/transaction_test_util.cc \
util/xfunc.cc \
util/xxhash.cc \
utilities/backupable/backupable_db.cc \ utilities/backupable/backupable_db.cc \
utilities/blob_db/blob_db.cc \ utilities/blob_db/blob_db.cc \
utilities/convenience/info_log_finder.cc \ utilities/convenience/info_log_finder.cc \
utilities/checkpoint/checkpoint.cc \ utilities/checkpoint/checkpoint.cc \
utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc \ utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc \
@ -156,34 +185,6 @@ LIB_SOURCES = \
utilities/date_tiered/date_tiered_db_impl.cc \ utilities/date_tiered/date_tiered_db_impl.cc \
utilities/write_batch_with_index/write_batch_with_index.cc \ utilities/write_batch_with_index/write_batch_with_index.cc \
utilities/write_batch_with_index/write_batch_with_index_internal.cc \ utilities/write_batch_with_index/write_batch_with_index_internal.cc \
util/cf_options.cc \
util/event_logger.cc \
util/log_buffer.cc \
util/logging.cc \
util/memenv.cc \
util/murmurhash.cc \
util/options.cc \
util/options_helper.cc \
util/options_parser.cc \
util/options_sanity_check.cc \
util/perf_context.cc \
util/perf_level.cc \
util/random.cc \
util/rate_limiter.cc \
util/slice.cc \
util/statistics.cc \
util/status.cc \
util/status_message.cc \
util/string_util.cc \
util/sync_point.cc \
util/thread_local.cc \
util/thread_status_impl.cc \
util/thread_status_updater.cc \
util/thread_status_updater_debug.cc \
util/thread_status_util.cc \
util/thread_status_util_debug.cc \
util/xfunc.cc \
util/xxhash.cc \
TOOL_LIB_SOURCES = \ TOOL_LIB_SOURCES = \
tools/ldb_cmd.cc \ tools/ldb_cmd.cc \

@ -881,7 +881,8 @@ void DumpManifestFile(std::string file, bool verbose, bool hex, bool json) {
options.num_levels = 64; options.num_levels = 64;
WriteController wc(options.delayed_write_rate); WriteController wc(options.delayed_write_rate);
WriteBufferManager wb(options.db_write_buffer_size); WriteBufferManager wb(options.db_write_buffer_size);
VersionSet versions(dbname, &options, sopt, tc.get(), &wb, &wc); ImmutableDBOptions immutable_db_options(options);
VersionSet versions(dbname, &immutable_db_options, sopt, tc.get(), &wb, &wc);
Status s = versions.DumpManifest(options, file, verbose, hex, json); Status s = versions.DumpManifest(options, file, verbose, hex, json);
if (!s.ok()) { if (!s.ok()) {
printf("Error in processing file %s %s\n", file.c_str(), printf("Error in processing file %s %s\n", file.c_str(),
@ -1585,13 +1586,14 @@ Options ReduceDBLevelsCommand::PrepareOptionsForOpenDB() {
Status ReduceDBLevelsCommand::GetOldNumOfLevels(Options& opt, Status ReduceDBLevelsCommand::GetOldNumOfLevels(Options& opt,
int* levels) { int* levels) {
ImmutableDBOptions db_options(opt);
EnvOptions soptions; EnvOptions soptions;
std::shared_ptr<Cache> tc( std::shared_ptr<Cache> tc(
NewLRUCache(opt.max_open_files - 10, opt.table_cache_numshardbits)); NewLRUCache(opt.max_open_files - 10, opt.table_cache_numshardbits));
const InternalKeyComparator cmp(opt.comparator); const InternalKeyComparator cmp(opt.comparator);
WriteController wc(opt.delayed_write_rate); WriteController wc(opt.delayed_write_rate);
WriteBufferManager wb(opt.db_write_buffer_size); WriteBufferManager wb(opt.db_write_buffer_size);
VersionSet versions(db_path_, &opt, soptions, tc.get(), &wb, &wc); VersionSet versions(db_path_, &db_options, soptions, tc.get(), &wb, &wc);
std::vector<ColumnFamilyDescriptor> dummy; std::vector<ColumnFamilyDescriptor> dummy;
ColumnFamilyDescriptor dummy_descriptor(kDefaultColumnFamilyName, ColumnFamilyDescriptor dummy_descriptor(kDefaultColumnFamilyName,
ColumnFamilyOptions(opt)); ColumnFamilyOptions(opt));

@ -16,51 +16,62 @@
#include "port/port.h" #include "port/port.h"
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "rocksdb/options.h" #include "rocksdb/options.h"
#include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
ImmutableCFOptions::ImmutableCFOptions(const Options& options) ImmutableCFOptions::ImmutableCFOptions(const Options& options)
: compaction_style(options.compaction_style), : ImmutableCFOptions(ImmutableDBOptions(options), options) {}
compaction_pri(options.compaction_pri),
compaction_options_universal(options.compaction_options_universal), ImmutableCFOptions::ImmutableCFOptions(const ImmutableDBOptions& db_options,
compaction_options_fifo(options.compaction_options_fifo), const ColumnFamilyOptions& cf_options)
prefix_extractor(options.prefix_extractor.get()), : compaction_style(cf_options.compaction_style),
comparator(options.comparator), compaction_pri(cf_options.compaction_pri),
merge_operator(options.merge_operator.get()), compaction_options_universal(cf_options.compaction_options_universal),
compaction_filter(options.compaction_filter), compaction_options_fifo(cf_options.compaction_options_fifo),
compaction_filter_factory(options.compaction_filter_factory.get()), prefix_extractor(cf_options.prefix_extractor.get()),
inplace_update_support(options.inplace_update_support), comparator(cf_options.comparator),
inplace_callback(options.inplace_callback), merge_operator(cf_options.merge_operator.get()),
info_log(options.info_log.get()), compaction_filter(cf_options.compaction_filter),
statistics(options.statistics.get()), compaction_filter_factory(cf_options.compaction_filter_factory.get()),
env(options.env), min_write_buffer_number_to_merge(
delayed_write_rate(options.delayed_write_rate), cf_options.min_write_buffer_number_to_merge),
allow_mmap_reads(options.allow_mmap_reads), max_write_buffer_number_to_maintain(
allow_mmap_writes(options.allow_mmap_writes), cf_options.max_write_buffer_number_to_maintain),
db_paths(options.db_paths), inplace_update_support(cf_options.inplace_update_support),
memtable_factory(options.memtable_factory.get()), inplace_callback(cf_options.inplace_callback),
table_factory(options.table_factory.get()), info_log(db_options.info_log.get()),
statistics(db_options.statistics.get()),
env(db_options.env),
delayed_write_rate(db_options.delayed_write_rate),
allow_mmap_reads(db_options.allow_mmap_reads),
allow_mmap_writes(db_options.allow_mmap_writes),
db_paths(db_options.db_paths),
memtable_factory(cf_options.memtable_factory.get()),
table_factory(cf_options.table_factory.get()),
table_properties_collector_factories( table_properties_collector_factories(
options.table_properties_collector_factories), cf_options.table_properties_collector_factories),
advise_random_on_open(options.advise_random_on_open), advise_random_on_open(db_options.advise_random_on_open),
bloom_locality(options.bloom_locality), bloom_locality(cf_options.bloom_locality),
purge_redundant_kvs_while_flush(options.purge_redundant_kvs_while_flush), purge_redundant_kvs_while_flush(
disable_data_sync(options.disableDataSync), cf_options.purge_redundant_kvs_while_flush),
use_fsync(options.use_fsync), disable_data_sync(db_options.disable_data_sync),
compression_per_level(options.compression_per_level), use_fsync(db_options.use_fsync),
bottommost_compression(options.bottommost_compression), compression_per_level(cf_options.compression_per_level),
compression_opts(options.compression_opts), bottommost_compression(cf_options.bottommost_compression),
compression_opts(cf_options.compression_opts),
level_compaction_dynamic_level_bytes( level_compaction_dynamic_level_bytes(
options.level_compaction_dynamic_level_bytes), cf_options.level_compaction_dynamic_level_bytes),
access_hint_on_compaction_start(options.access_hint_on_compaction_start), access_hint_on_compaction_start(
db_options.access_hint_on_compaction_start),
new_table_reader_for_compaction_inputs( new_table_reader_for_compaction_inputs(
options.new_table_reader_for_compaction_inputs), db_options.new_table_reader_for_compaction_inputs),
compaction_readahead_size(options.compaction_readahead_size), compaction_readahead_size(db_options.compaction_readahead_size),
num_levels(options.num_levels), num_levels(cf_options.num_levels),
optimize_filters_for_hits(options.optimize_filters_for_hits), optimize_filters_for_hits(cf_options.optimize_filters_for_hits),
listeners(options.listeners), listeners(db_options.listeners),
row_cache(options.row_cache), row_cache(db_options.row_cache),
max_subcompactions(options.max_subcompactions) {} max_subcompactions(db_options.max_subcompactions) {}
// Multiple two operands. If they overflow, return op1. // Multiple two operands. If they overflow, return op1.
uint64_t MultiplyCheckOverflow(uint64_t op1, int op2) { uint64_t MultiplyCheckOverflow(uint64_t op1, int op2) {

@ -10,6 +10,7 @@
#include "rocksdb/options.h" #include "rocksdb/options.h"
#include "util/compression.h" #include "util/compression.h"
#include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
@ -18,8 +19,12 @@ namespace rocksdb {
// of DB. Raw pointers defined in this struct do not have ownership to the data // of DB. Raw pointers defined in this struct do not have ownership to the data
// they point to. Options contains shared_ptr to these data. // they point to. Options contains shared_ptr to these data.
struct ImmutableCFOptions { struct ImmutableCFOptions {
ImmutableCFOptions();
explicit ImmutableCFOptions(const Options& options); explicit ImmutableCFOptions(const Options& options);
ImmutableCFOptions(const ImmutableDBOptions& db_options,
const ColumnFamilyOptions& cf_options);
CompactionStyle compaction_style; CompactionStyle compaction_style;
CompactionPri compaction_pri; CompactionPri compaction_pri;
@ -37,6 +42,10 @@ struct ImmutableCFOptions {
CompactionFilterFactory* compaction_filter_factory; CompactionFilterFactory* compaction_filter_factory;
int min_write_buffer_number_to_merge;
int max_write_buffer_number_to_maintain;
bool inplace_update_support; bool inplace_update_support;
UpdateStatus (*inplace_callback)(char* existing_value, UpdateStatus (*inplace_callback)(char* existing_value,

@ -0,0 +1,233 @@
// Copyright (c) 2011-present, 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.
#include "util/db_options.h"
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <inttypes.h>
#include "port/port.h"
#include "rocksdb/cache.h"
#include "rocksdb/env.h"
#include "rocksdb/sst_file_manager.h"
#include "rocksdb/wal_filter.h"
namespace rocksdb {
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),
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_open_files(options.max_open_files),
max_file_opening_threads(options.max_file_opening_threads),
max_total_wal_size(options.max_total_wal_size),
statistics(options.statistics),
disable_data_sync(options.disableDataSync),
use_fsync(options.use_fsync),
db_paths(options.db_paths),
db_log_dir(options.db_log_dir),
wal_dir(options.wal_dir),
delete_obsolete_files_period_micros(
options.delete_obsolete_files_period_micros),
base_background_compactions(options.base_background_compactions),
max_background_compactions(options.max_background_compactions),
max_subcompactions(options.max_subcompactions),
max_background_flushes(options.max_background_flushes),
max_log_file_size(options.max_log_file_size),
log_file_time_to_roll(options.log_file_time_to_roll),
keep_log_file_num(options.keep_log_file_num),
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),
wal_ttl_seconds(options.WAL_ttl_seconds),
wal_size_limit_mb(options.WAL_size_limit_MB),
manifest_preallocation_size(options.manifest_preallocation_size),
allow_os_buffer(options.allow_os_buffer),
allow_mmap_reads(options.allow_mmap_reads),
allow_mmap_writes(options.allow_mmap_writes),
allow_fallocate(options.allow_fallocate),
is_fd_close_on_exec(options.is_fd_close_on_exec),
stats_dump_period_sec(options.stats_dump_period_sec),
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),
compaction_readahead_size(options.compaction_readahead_size),
random_access_max_buffer_size(options.random_access_max_buffer_size),
writable_file_max_buffer_size(options.writable_file_max_buffer_size),
use_adaptive_mutex(options.use_adaptive_mutex),
bytes_per_sync(options.bytes_per_sync),
wal_bytes_per_sync(options.wal_bytes_per_sync),
listeners(options.listeners),
enable_thread_tracking(options.enable_thread_tracking),
delayed_write_rate(options.delayed_write_rate),
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),
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),
avoid_flush_during_recovery(options.avoid_flush_during_recovery) {
}
void ImmutableDBOptions::Dump(Logger* log) const {
Header(log, " Options.error_if_exists: %d",
error_if_exists);
Header(log, " Options.create_if_missing: %d",
create_if_missing);
Header(log, " Options.paranoid_checks: %d",
paranoid_checks);
Header(log, " Options.env: %p", env);
Header(log, " Options.info_log: %p",
info_log.get());
Header(log, " Options.max_open_files: %d",
max_open_files);
Header(log, " Options.max_file_opening_threads: %d",
max_file_opening_threads);
Header(log, " Options.max_total_wal_size: %" PRIu64,
max_total_wal_size);
Header(log, " Options.disableDataSync: %d",
disable_data_sync);
Header(log, " Options.use_fsync: %d", use_fsync);
Header(log,
" Options.max_log_file_size: %" ROCKSDB_PRIszt,
max_log_file_size);
Header(log, " Options.max_manifest_file_size: %" PRIu64,
max_manifest_file_size);
Header(log,
" Options.log_file_time_to_roll: %" ROCKSDB_PRIszt,
log_file_time_to_roll);
Header(log,
" Options.keep_log_file_num: %" ROCKSDB_PRIszt,
keep_log_file_num);
Header(log,
" Options.recycle_log_file_num: %" ROCKSDB_PRIszt,
recycle_log_file_num);
Header(log, " Options.allow_os_buffer: %d",
allow_os_buffer);
Header(log, " Options.allow_mmap_reads: %d",
allow_mmap_reads);
Header(log, " Options.allow_fallocate: %d",
allow_fallocate);
Header(log, " Options.allow_mmap_writes: %d",
allow_mmap_writes);
Header(log, " Options.create_missing_column_families: %d",
create_missing_column_families);
Header(log, " Options.db_log_dir: %s",
db_log_dir.c_str());
Header(log, " Options.wal_dir: %s",
wal_dir.c_str());
Header(log, " Options.table_cache_numshardbits: %d",
table_cache_numshardbits);
Header(log, " Options.delete_obsolete_files_period_micros: %" PRIu64,
delete_obsolete_files_period_micros);
Header(log, " Options.base_background_compactions: %d",
base_background_compactions);
Header(log, " Options.max_background_compactions: %d",
max_background_compactions);
Header(log, " Options.max_subcompactions: %" PRIu32,
max_subcompactions);
Header(log, " Options.max_background_flushes: %d",
max_background_flushes);
Header(log, " Options.WAL_ttl_seconds: %" PRIu64,
wal_ttl_seconds);
Header(log, " Options.WAL_size_limit_MB: %" PRIu64,
wal_size_limit_mb);
Header(log,
" Options.manifest_preallocation_size: %" ROCKSDB_PRIszt,
manifest_preallocation_size);
Header(log, " Options.allow_os_buffer: %d",
allow_os_buffer);
Header(log, " Options.allow_mmap_reads: %d",
allow_mmap_reads);
Header(log, " Options.allow_mmap_writes: %d",
allow_mmap_writes);
Header(log, " Options.is_fd_close_on_exec: %d",
is_fd_close_on_exec);
Header(log, " Options.stats_dump_period_sec: %u",
stats_dump_period_sec);
Header(log, " Options.advise_random_on_open: %d",
advise_random_on_open);
Header(log,
" Options.db_write_buffer_size: %" ROCKSDB_PRIszt,
db_write_buffer_size);
Header(log, " Options.access_hint_on_compaction_start: %d",
static_cast<int>(access_hint_on_compaction_start));
Header(log, " Options.new_table_reader_for_compaction_inputs: %d",
new_table_reader_for_compaction_inputs);
Header(log,
" Options.compaction_readahead_size: %" ROCKSDB_PRIszt,
compaction_readahead_size);
Header(log,
" Options.random_access_max_buffer_size: %" ROCKSDB_PRIszt,
random_access_max_buffer_size);
Header(log,
" Options.writable_file_max_buffer_size: %" ROCKSDB_PRIszt,
writable_file_max_buffer_size);
Header(log, " Options.use_adaptive_mutex: %d",
use_adaptive_mutex);
Header(log, " Options.rate_limiter: %p",
rate_limiter.get());
Header(
log, " Options.sst_file_manager.rate_bytes_per_sec: %" PRIi64,
sst_file_manager ? sst_file_manager->GetDeleteRateBytesPerSecond() : 0);
Header(log, " Options.bytes_per_sync: %" PRIu64,
bytes_per_sync);
Header(log, " Options.wal_bytes_per_sync: %" PRIu64,
wal_bytes_per_sync);
Header(log, " Options.wal_recovery_mode: %d",
wal_recovery_mode);
Header(log, " Options.enable_thread_tracking: %d",
enable_thread_tracking);
Log(log, " Options.delayed_write_rate : %" PRIu64,
delayed_write_rate);
Header(log, " Options.allow_concurrent_memtable_write: %d",
allow_concurrent_memtable_write);
Header(log, " Options.enable_write_thread_adaptive_yield: %d",
enable_write_thread_adaptive_yield);
Header(log, " Options.write_thread_max_yield_usec: %" PRIu64,
write_thread_max_yield_usec);
Header(log, " Options.write_thread_slow_yield_usec: %" PRIu64,
write_thread_slow_yield_usec);
if (row_cache) {
Header(log, " Options.row_cache: %" PRIu64,
row_cache->GetCapacity());
} else {
Header(log, " Options.row_cache: None");
}
#ifndef ROCKSDB_LITE
Header(log, " Options.wal_filter: %s",
wal_filter ? wal_filter->Name() : "None");
#endif // ROCKDB_LITE
Header(log, " Options.avoid_flush_during_recovery: %d",
avoid_flush_during_recovery);
}
MutableDBOptions::MutableDBOptions(const DBOptions& options) {}
void MutableDBOptions::Dump(Logger* log) const {}
} // namespace rocksdb

@ -0,0 +1,96 @@
// Copyright (c) 2011-present, 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 <string>
#include <vector>
#include "rocksdb/options.h"
namespace rocksdb {
struct ImmutableDBOptions {
ImmutableDBOptions();
explicit ImmutableDBOptions(const DBOptions& options);
void Dump(Logger* log) const;
bool create_if_missing;
bool create_missing_column_families;
bool error_if_exists;
bool paranoid_checks;
Env* env;
std::shared_ptr<RateLimiter> rate_limiter;
std::shared_ptr<SstFileManager> sst_file_manager;
std::shared_ptr<Logger> info_log;
InfoLogLevel info_log_level;
int max_open_files;
int max_file_opening_threads;
uint64_t max_total_wal_size;
std::shared_ptr<Statistics> statistics;
bool disable_data_sync;
bool use_fsync;
std::vector<DbPath> db_paths;
std::string db_log_dir;
std::string wal_dir;
uint64_t delete_obsolete_files_period_micros;
int base_background_compactions;
int max_background_compactions;
uint32_t max_subcompactions;
int max_background_flushes;
size_t max_log_file_size;
size_t log_file_time_to_roll;
size_t keep_log_file_num;
size_t recycle_log_file_num;
uint64_t max_manifest_file_size;
int table_cache_numshardbits;
uint64_t wal_ttl_seconds;
uint64_t wal_size_limit_mb;
size_t manifest_preallocation_size;
bool allow_os_buffer;
bool allow_mmap_reads;
bool allow_mmap_writes;
bool allow_fallocate;
bool is_fd_close_on_exec;
unsigned int stats_dump_period_sec;
bool advise_random_on_open;
size_t db_write_buffer_size;
std::shared_ptr<WriteBufferManager> write_buffer_manager;
DBOptions::AccessHint access_hint_on_compaction_start;
bool new_table_reader_for_compaction_inputs;
size_t compaction_readahead_size;
size_t random_access_max_buffer_size;
size_t writable_file_max_buffer_size;
bool use_adaptive_mutex;
uint64_t bytes_per_sync;
uint64_t wal_bytes_per_sync;
std::vector<std::shared_ptr<EventListener>> listeners;
bool enable_thread_tracking;
uint64_t delayed_write_rate;
bool allow_concurrent_memtable_write;
bool enable_write_thread_adaptive_yield;
uint64_t write_thread_max_yield_usec;
uint64_t write_thread_slow_yield_usec;
bool skip_stats_update_on_db_open;
WALRecoveryMode wal_recovery_mode;
bool allow_2pc;
std::shared_ptr<Cache> row_cache;
#ifndef ROCKSDB_LITE
WalFilter* wal_filter;
#endif // ROCKSDB_LITE
bool fail_if_options_file_error;
bool dump_malloc_stats;
bool avoid_flush_during_recovery;
};
struct MutableDBOptions {
explicit MutableDBOptions(const MutableDBOptions& options) = default;
explicit MutableDBOptions(const DBOptions& options);
void Dump(Logger* log) const;
};
} // namespace rocksdb

@ -9,7 +9,6 @@
#include <algorithm> #include <algorithm>
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "rocksdb/options.h"
#include "util/sst_file_manager_impl.h" #include "util/sst_file_manager_impl.h"
#include "util/file_reader_writer.h" #include "util/file_reader_writer.h"
@ -82,8 +81,8 @@ Status CreateFile(Env* env, const std::string& destination,
return dest_writer->Append(Slice(contents)); return dest_writer->Append(Slice(contents));
} }
Status DeleteSSTFile(const DBOptions* db_options, const std::string& fname, Status DeleteSSTFile(const ImmutableDBOptions* db_options,
uint32_t path_id) { const std::string& fname, uint32_t path_id) {
// TODO(tec): support sst_file_manager for multiple path_ids // TODO(tec): support sst_file_manager for multiple path_ids
auto sfm = auto sfm =
static_cast<SstFileManagerImpl*>(db_options->sst_file_manager.get()); static_cast<SstFileManagerImpl*>(db_options->sst_file_manager.get());

@ -6,10 +6,10 @@
#pragma once #pragma once
#include <string> #include <string>
#include "rocksdb/env.h"
#include "rocksdb/status.h" #include "rocksdb/status.h"
#include "rocksdb/types.h" #include "rocksdb/types.h"
#include "rocksdb/env.h" #include "util/db_options.h"
#include "rocksdb/options.h"
namespace rocksdb { namespace rocksdb {
@ -19,7 +19,7 @@ extern Status CopyFile(Env* env, const std::string& source,
extern Status CreateFile(Env* env, const std::string& destination, extern Status CreateFile(Env* env, const std::string& destination,
const std::string& contents); const std::string& contents);
extern Status DeleteSSTFile(const DBOptions* db_options, extern Status DeleteSSTFile(const ImmutableDBOptions* db_options,
const std::string& fname, uint32_t path_id); const std::string& fname, uint32_t path_id);
} // namespace rocksdb } // namespace rocksdb

@ -26,6 +26,99 @@
namespace rocksdb { namespace rocksdb {
DBOptions BuildDBOptions(const ImmutableDBOptions& immutable_db_options,
const MutableDBOptions& mutable_db_options) {
DBOptions options;
options.create_if_missing = immutable_db_options.create_if_missing;
options.create_missing_column_families =
immutable_db_options.create_missing_column_families;
options.error_if_exists = immutable_db_options.error_if_exists;
options.paranoid_checks = immutable_db_options.paranoid_checks;
options.env = immutable_db_options.env;
options.rate_limiter = immutable_db_options.rate_limiter;
options.sst_file_manager = immutable_db_options.sst_file_manager;
options.info_log = immutable_db_options.info_log;
options.info_log_level = immutable_db_options.info_log_level;
options.max_open_files = immutable_db_options.max_open_files;
options.max_file_opening_threads =
immutable_db_options.max_file_opening_threads;
options.max_total_wal_size = immutable_db_options.max_total_wal_size;
options.statistics = immutable_db_options.statistics;
options.disableDataSync = immutable_db_options.disable_data_sync;
options.use_fsync = immutable_db_options.use_fsync;
options.db_paths = immutable_db_options.db_paths;
options.db_log_dir = immutable_db_options.db_log_dir;
options.wal_dir = immutable_db_options.wal_dir;
options.delete_obsolete_files_period_micros =
immutable_db_options.delete_obsolete_files_period_micros;
options.base_background_compactions =
immutable_db_options.base_background_compactions;
options.max_background_compactions =
immutable_db_options.max_background_compactions;
options.max_subcompactions = immutable_db_options.max_subcompactions;
options.max_background_flushes = immutable_db_options.max_background_flushes;
options.max_log_file_size = immutable_db_options.max_log_file_size;
options.log_file_time_to_roll = immutable_db_options.log_file_time_to_roll;
options.keep_log_file_num = immutable_db_options.keep_log_file_num;
options.recycle_log_file_num = immutable_db_options.recycle_log_file_num;
options.max_manifest_file_size = immutable_db_options.max_manifest_file_size;
options.table_cache_numshardbits =
immutable_db_options.table_cache_numshardbits;
options.WAL_ttl_seconds = immutable_db_options.wal_ttl_seconds;
options.WAL_size_limit_MB = immutable_db_options.wal_size_limit_mb;
options.manifest_preallocation_size =
immutable_db_options.manifest_preallocation_size;
options.allow_os_buffer = immutable_db_options.allow_os_buffer;
options.allow_mmap_reads = immutable_db_options.allow_mmap_reads;
options.allow_mmap_writes = immutable_db_options.allow_mmap_writes;
options.allow_fallocate = immutable_db_options.allow_fallocate;
options.is_fd_close_on_exec = immutable_db_options.is_fd_close_on_exec;
options.stats_dump_period_sec = immutable_db_options.stats_dump_period_sec;
options.advise_random_on_open = immutable_db_options.advise_random_on_open;
options.db_write_buffer_size = immutable_db_options.db_write_buffer_size;
options.write_buffer_manager = immutable_db_options.write_buffer_manager;
options.access_hint_on_compaction_start =
immutable_db_options.access_hint_on_compaction_start;
options.new_table_reader_for_compaction_inputs =
immutable_db_options.new_table_reader_for_compaction_inputs;
options.compaction_readahead_size =
immutable_db_options.compaction_readahead_size;
options.random_access_max_buffer_size =
immutable_db_options.random_access_max_buffer_size;
options.writable_file_max_buffer_size =
immutable_db_options.writable_file_max_buffer_size;
options.use_adaptive_mutex = immutable_db_options.use_adaptive_mutex;
options.bytes_per_sync = immutable_db_options.bytes_per_sync;
options.wal_bytes_per_sync = immutable_db_options.wal_bytes_per_sync;
options.listeners = immutable_db_options.listeners;
options.enable_thread_tracking = immutable_db_options.enable_thread_tracking;
options.delayed_write_rate = immutable_db_options.delayed_write_rate;
options.allow_concurrent_memtable_write =
immutable_db_options.allow_concurrent_memtable_write;
options.enable_write_thread_adaptive_yield =
immutable_db_options.enable_write_thread_adaptive_yield;
options.write_thread_max_yield_usec =
immutable_db_options.write_thread_max_yield_usec;
options.write_thread_slow_yield_usec =
immutable_db_options.write_thread_slow_yield_usec;
options.skip_stats_update_on_db_open =
immutable_db_options.skip_stats_update_on_db_open;
options.wal_recovery_mode = immutable_db_options.wal_recovery_mode;
options.allow_2pc = immutable_db_options.allow_2pc;
options.row_cache = immutable_db_options.row_cache;
#ifndef ROCKSDB_LITE
options.wal_filter = immutable_db_options.wal_filter;
#endif // ROCKSDB_LITE
options.fail_if_options_file_error =
immutable_db_options.fail_if_options_file_error;
options.dump_malloc_stats = immutable_db_options.dump_malloc_stats;
options.avoid_flush_during_recovery =
immutable_db_options.avoid_flush_during_recovery;
return options;
}
ColumnFamilyOptions BuildColumnFamilyOptions( ColumnFamilyOptions BuildColumnFamilyOptions(
const ColumnFamilyOptions& options, const ColumnFamilyOptions& options,
const MutableCFOptions& mutable_cf_options) { const MutableCFOptions& mutable_cf_options) {

@ -13,9 +13,13 @@
#include "rocksdb/status.h" #include "rocksdb/status.h"
#include "rocksdb/table.h" #include "rocksdb/table.h"
#include "util/cf_options.h" #include "util/cf_options.h"
#include "util/db_options.h"
namespace rocksdb { namespace rocksdb {
DBOptions BuildDBOptions(const ImmutableDBOptions& immutable_db_options,
const MutableDBOptions& mutable_db_options);
ColumnFamilyOptions BuildColumnFamilyOptions( ColumnFamilyOptions BuildColumnFamilyOptions(
const ColumnFamilyOptions& ioptions, const ColumnFamilyOptions& ioptions,
const MutableCFOptions& mutable_cf_options); const MutableCFOptions& mutable_cf_options);

Loading…
Cancel
Save