Unverified Commit 397b6d22 authored by yiwu-arbug's avatar yiwu-arbug Committed by GitHub

Add GetTitanOptions() and other options related changes (#32)

Summary:
* Add `GetTitanOptions()` and `GetTitanDBOptions()` API.
* Fix `SetOptions()` fail when `blob_run_mode` is not set.
* Update info log around printing options.

Test Plan:
Updated test.
Signed-off-by: 's avatarYi Wu <yiwu@pingcap.com>
parent cd7a32a9
...@@ -127,11 +127,19 @@ class TitanDB : public StackableDB { ...@@ -127,11 +127,19 @@ class TitanDB : public StackableDB {
using rocksdb::StackableDB::GetOptions; using rocksdb::StackableDB::GetOptions;
Options GetOptions(ColumnFamilyHandle* column_family) const override = 0; Options GetOptions(ColumnFamilyHandle* column_family) const override = 0;
virtual TitanOptions GetTitanOptions(
ColumnFamilyHandle* column_family) const = 0;
virtual TitanOptions GetTitanOptions() const {
return GetTitanOptions(DefaultColumnFamily());
}
using rocksdb::StackableDB::SetOptions; using rocksdb::StackableDB::SetOptions;
Status SetOptions(ColumnFamilyHandle* column_family, Status SetOptions(ColumnFamilyHandle* column_family,
const std::unordered_map<std::string, std::string>& const std::unordered_map<std::string, std::string>&
new_options) override = 0; new_options) override = 0;
virtual TitanDBOptions GetTitanDBOptions() const = 0;
struct Properties { struct Properties {
// "rocksdb.titandb.live-blob-size" - returns total blob value size // "rocksdb.titandb.live-blob-size" - returns total blob value size
// referenced by LSM tree. // referenced by LSM tree.
......
...@@ -121,7 +121,8 @@ struct TitanCFOptions : public ColumnFamilyOptions { ...@@ -121,7 +121,8 @@ struct TitanCFOptions : public ColumnFamilyOptions {
TitanCFOptions() = default; TitanCFOptions() = default;
explicit TitanCFOptions(const ColumnFamilyOptions& options) explicit TitanCFOptions(const ColumnFamilyOptions& options)
: ColumnFamilyOptions(options) {} : ColumnFamilyOptions(options) {}
explicit TitanCFOptions(const ImmutableTitanCFOptions&, explicit TitanCFOptions(const ColumnFamilyOptions&,
const ImmutableTitanCFOptions&,
const MutableTitanCFOptions&); const MutableTitanCFOptions&);
TitanCFOptions& operator=(const ColumnFamilyOptions& options) { TitanCFOptions& operator=(const ColumnFamilyOptions& options) {
...@@ -129,8 +130,6 @@ struct TitanCFOptions : public ColumnFamilyOptions { ...@@ -129,8 +130,6 @@ struct TitanCFOptions : public ColumnFamilyOptions {
return *this; return *this;
} }
std::string ToString() const;
void Dump(Logger* logger) const; void Dump(Logger* logger) const;
}; };
......
...@@ -200,6 +200,10 @@ Status TitanDBImpl::Open(const std::vector<TitanCFDescriptor>& descs, ...@@ -200,6 +200,10 @@ Status TitanDBImpl::Open(const std::vector<TitanCFDescriptor>& descs,
// While we need to preserve original table_factory for GetOptions. // While we need to preserve original table_factory for GetOptions.
auto& base_table_factory = base_descs[i].options.table_factory; auto& base_table_factory = base_descs[i].options.table_factory;
assert(base_table_factory != nullptr); assert(base_table_factory != nullptr);
immutable_cf_options_.emplace(cf_id,
ImmutableTitanCFOptions(descs[i].options));
mutable_cf_options_.emplace(cf_id,
MutableTitanCFOptions(descs[i].options));
base_table_factory_[cf_id] = base_table_factory; base_table_factory_[cf_id] = base_table_factory;
titan_table_factory_[cf_id] = std::make_shared<TitanTableFactory>( titan_table_factory_[cf_id] = std::make_shared<TitanTableFactory>(
db_options_, descs[i].options, blob_manager_, &mutex_, vset_.get(), db_options_, descs[i].options, blob_manager_, &mutex_, vset_.get(),
...@@ -328,6 +332,10 @@ Status TitanDBImpl::CreateColumnFamilies( ...@@ -328,6 +332,10 @@ Status TitanDBImpl::CreateColumnFamilies(
for (size_t i = 0; i < descs.size(); i++) { for (size_t i = 0; i < descs.size(); i++) {
uint32_t cf_id = (*handles)[i]->GetID(); uint32_t cf_id = (*handles)[i]->GetID();
column_families.emplace(cf_id, descs[i].options); column_families.emplace(cf_id, descs[i].options);
immutable_cf_options_.emplace(
cf_id, ImmutableTitanCFOptions(descs[i].options));
mutable_cf_options_.emplace(cf_id,
MutableTitanCFOptions(descs[i].options));
base_table_factory_[cf_id] = base_table_factory[i]; base_table_factory_[cf_id] = base_table_factory[i];
titan_table_factory_[cf_id] = titan_table_factory[i]; titan_table_factory_[cf_id] = titan_table_factory[i];
} }
...@@ -597,9 +605,19 @@ Status TitanDBImpl::SetOptions( ...@@ -597,9 +605,19 @@ Status TitanDBImpl::SetOptions(
auto opts = new_options; auto opts = new_options;
auto p = opts.find("blob_run_mode"); auto p = opts.find("blob_run_mode");
bool set_blob_run_mode = (p != opts.end()); bool set_blob_run_mode = (p != opts.end());
std::string blob_run_mode_string; TitanBlobRunMode mode = TitanBlobRunMode::kNormal;
if (set_blob_run_mode) { if (set_blob_run_mode) {
blob_run_mode_string = p->second; const std::string& blob_run_mode_string = p->second;
auto pm = blob_run_mode_string_map.find(blob_run_mode_string);
if (pm == blob_run_mode_string_map.end()) {
return Status::InvalidArgument("No blob_run_mode defined for " +
blob_run_mode_string);
} else {
mode = pm->second;
ROCKS_LOG_INFO(db_options_.info_log, "[%s] Set blob_run_mode: %s",
column_family->GetName().c_str(),
blob_run_mode_string.c_str());
}
opts.erase(p); opts.erase(p);
} }
if (opts.size() > 0) { if (opts.size() > 0) {
...@@ -608,23 +626,42 @@ Status TitanDBImpl::SetOptions( ...@@ -608,23 +626,42 @@ Status TitanDBImpl::SetOptions(
return s; return s;
} }
} }
TitanBlobRunMode mode = TitanBlobRunMode::kNormal; // Make sure base db's SetOptions sucesss before setting blob_run_mode.
auto pm = blob_run_mode_string_map.find(blob_run_mode_string); if (set_blob_run_mode) {
if (pm == blob_run_mode_string_map.end()) { uint32_t cf_id = column_family->GetID();
return Status::InvalidArgument("No blob_run_mode defined for " + {
blob_run_mode_string); MutexLock l(&mutex_);
} else { auto& table_factory = titan_table_factory_[cf_id];
mode = pm->second; table_factory->SetBlobRunMode(mode);
ROCKS_LOG_INFO(db_options_.info_log, "[%s] Set blob_run_mode: %s", mutable_cf_options_[cf_id].blob_run_mode = mode;
column_family->GetName().c_str(), }
blob_run_mode_string.c_str());
} }
return Status::OK();
}
TitanOptions TitanDBImpl::GetTitanOptions(
ColumnFamilyHandle* column_family) const {
assert(column_family != nullptr);
Options base_options = GetOptions(column_family);
TitanOptions titan_options;
*static_cast<TitanDBOptions*>(&titan_options) = db_options_;
*static_cast<DBOptions*>(&titan_options) =
static_cast<DBOptions>(base_options);
uint32_t cf_id = column_family->GetID();
{ {
MutexLock l(&mutex_); MutexLock l(&mutex_);
auto& table_factory = titan_table_factory_[column_family->GetID()]; *static_cast<TitanCFOptions*>(&titan_options) = TitanCFOptions(
table_factory->SetBlobRunMode(mode); static_cast<ColumnFamilyOptions>(base_options),
immutable_cf_options_.at(cf_id), mutable_cf_options_.at(cf_id));
} }
return Status::OK(); return titan_options;
}
TitanDBOptions TitanDBImpl::GetTitanDBOptions() const {
// Titan db_options_ is not mutable after DB open.
TitanDBOptions result = db_options_;
*static_cast<DBOptions*>(&result) = db_impl_->GetDBOptions();
return result;
} }
bool TitanDBImpl::GetProperty(ColumnFamilyHandle* column_family, bool TitanDBImpl::GetProperty(ColumnFamilyHandle* column_family,
......
...@@ -74,6 +74,13 @@ class TitanDBImpl : public TitanDB { ...@@ -74,6 +74,13 @@ class TitanDBImpl : public TitanDB {
ColumnFamilyHandle* column_family, ColumnFamilyHandle* column_family,
const std::unordered_map<std::string, std::string>& new_options) override; const std::unordered_map<std::string, std::string>& new_options) override;
using TitanDB::GetTitanOptions;
TitanOptions GetTitanOptions(
ColumnFamilyHandle* column_family) const override;
using TitanDB::GetTitanDBOptions;
TitanDBOptions GetTitanDBOptions() const override;
using TitanDB::GetProperty; using TitanDB::GetProperty;
bool GetProperty(ColumnFamilyHandle* column_family, const Slice& property, bool GetProperty(ColumnFamilyHandle* column_family, const Slice& property,
std::string* value) override; std::string* value) override;
...@@ -169,8 +176,17 @@ class TitanDBImpl : public TitanDB { ...@@ -169,8 +176,17 @@ class TitanDBImpl : public TitanDB {
// is not null. // is not null.
std::unique_ptr<TitanStats> stats_; std::unique_ptr<TitanStats> stats_;
// Guarded by mutex_.
std::unordered_map<uint32_t, ImmutableTitanCFOptions> immutable_cf_options_;
// Guarded by mutex_.
std::unordered_map<uint32_t, MutableTitanCFOptions> mutable_cf_options_;
// Guarded by mutex_.
std::unordered_map<uint32_t, std::shared_ptr<TableFactory>> std::unordered_map<uint32_t, std::shared_ptr<TableFactory>>
base_table_factory_; base_table_factory_;
// Guarded by mutex_.
std::unordered_map<uint32_t, std::shared_ptr<TitanTableFactory>> std::unordered_map<uint32_t, std::shared_ptr<TitanTableFactory>>
titan_table_factory_; titan_table_factory_;
......
...@@ -14,17 +14,23 @@ namespace rocksdb { ...@@ -14,17 +14,23 @@ namespace rocksdb {
namespace titandb { namespace titandb {
void TitanDBOptions::Dump(Logger* logger) const { void TitanDBOptions::Dump(Logger* logger) const {
ROCKS_LOG_HEADER(logger, "TitanDBOptions.dirname : %s", ROCKS_LOG_HEADER(logger, "TitanDBOptions.dirname : %s",
dirname.c_str()); dirname.c_str());
ROCKS_LOG_HEADER(logger, "TitanDBOptions.disable_background_gc : %d", ROCKS_LOG_HEADER(logger, "TitanDBOptions.disable_background_gc : %d",
static_cast<int>(disable_background_gc));
ROCKS_LOG_HEADER(logger, "TitanDBOptions.max_background_gc : %" PRIi32,
static_cast<int>(disable_background_gc)); static_cast<int>(disable_background_gc));
ROCKS_LOG_HEADER(logger,
"TitanDBOptions.max_background_gc : %" PRIi32,
max_background_gc);
ROCKS_LOG_HEADER(logger,
"TitanDBOptions.purge_obsolete_files_period: %" PRIu32,
purge_obsolete_files_period);
} }
TitanCFOptions::TitanCFOptions(const ImmutableTitanCFOptions& immutable_opts, TitanCFOptions::TitanCFOptions(const ColumnFamilyOptions& cf_opts,
const ImmutableTitanCFOptions& immutable_opts,
const MutableTitanCFOptions& mutable_opts) const MutableTitanCFOptions& mutable_opts)
: min_blob_size(immutable_opts.min_blob_size), : ColumnFamilyOptions(cf_opts),
min_blob_size(immutable_opts.min_blob_size),
blob_file_compression(immutable_opts.blob_file_compression), blob_file_compression(immutable_opts.blob_file_compression),
blob_file_target_size(immutable_opts.blob_file_target_size), blob_file_target_size(immutable_opts.blob_file_target_size),
blob_cache(immutable_opts.blob_cache), blob_cache(immutable_opts.blob_cache),
...@@ -35,24 +41,6 @@ TitanCFOptions::TitanCFOptions(const ImmutableTitanCFOptions& immutable_opts, ...@@ -35,24 +41,6 @@ TitanCFOptions::TitanCFOptions(const ImmutableTitanCFOptions& immutable_opts,
merge_small_file_threshold(immutable_opts.merge_small_file_threshold), merge_small_file_threshold(immutable_opts.merge_small_file_threshold),
blob_run_mode(mutable_opts.blob_run_mode) {} blob_run_mode(mutable_opts.blob_run_mode) {}
std::string TitanCFOptions::ToString() const {
char buf[256];
std::string str;
std::string res = "[titandb]\n";
snprintf(buf, sizeof(buf), "min_blob_size = %" PRIu64 "\n", min_blob_size);
res += buf;
GetStringFromCompressionType(&str, blob_file_compression);
snprintf(buf, sizeof(buf), "blob_file_compression = %s\n", str.c_str());
res += buf;
snprintf(buf, sizeof(buf), "blob_file_target_size = %" PRIu64 "\n",
blob_file_target_size);
res += buf;
snprintf(buf, sizeof(buf), "blob_run_mode = %s\n",
blob_run_mode_to_string[blob_run_mode].c_str());
res += buf;
return res;
}
void TitanCFOptions::Dump(Logger* logger) const { void TitanCFOptions::Dump(Logger* logger) const {
ROCKS_LOG_HEADER(logger, ROCKS_LOG_HEADER(logger,
"TitanCFOptions.min_blob_size : %" PRIu64, "TitanCFOptions.min_blob_size : %" PRIu64,
......
...@@ -20,11 +20,8 @@ TableBuilder* TitanTableFactory::NewTableBuilder( ...@@ -20,11 +20,8 @@ TableBuilder* TitanTableFactory::NewTableBuilder(
WritableFileWriter* file) const { WritableFileWriter* file) const {
std::unique_ptr<TableBuilder> base_builder( std::unique_ptr<TableBuilder> base_builder(
base_factory_->NewTableBuilder(options, column_family_id, file)); base_factory_->NewTableBuilder(options, column_family_id, file));
TitanCFOptions cf_options; TitanCFOptions cf_options = cf_options_;
{ cf_options.blob_run_mode = blob_run_mode_.load();
MutexLock l(&mutex_);
cf_options = TitanCFOptions(immutable_cf_options_, mutable_cf_options_);
}
std::weak_ptr<BlobStorage> blob_storage; std::weak_ptr<BlobStorage> blob_storage;
{ {
MutexLock l(db_mutex_); MutexLock l(db_mutex_);
...@@ -36,9 +33,9 @@ TableBuilder* TitanTableFactory::NewTableBuilder( ...@@ -36,9 +33,9 @@ TableBuilder* TitanTableFactory::NewTableBuilder(
} }
std::string TitanTableFactory::GetPrintableTableOptions() const { std::string TitanTableFactory::GetPrintableTableOptions() const {
MutexLock l(&mutex_); assert(blob_run_mode_to_string.count(blob_run_mode_.load()) > 0);
return base_factory_->GetPrintableTableOptions() + return base_factory_->GetPrintableTableOptions() + " blob_run_mode: " +
TitanCFOptions(immutable_cf_options_, mutable_cf_options_).ToString(); blob_run_mode_to_string.at(blob_run_mode_.load());
} }
} // namespace titandb } // namespace titandb
......
#pragma once #pragma once
#include <atomic>
#include "blob_file_manager.h" #include "blob_file_manager.h"
#include "rocksdb/table.h" #include "rocksdb/table.h"
#include "titan/options.h" #include "titan/options.h"
...@@ -16,8 +18,8 @@ class TitanTableFactory : public TableFactory { ...@@ -16,8 +18,8 @@ class TitanTableFactory : public TableFactory {
std::shared_ptr<BlobFileManager> blob_manager, std::shared_ptr<BlobFileManager> blob_manager,
port::Mutex* db_mutex, VersionSet* vset, TitanStats* stats) port::Mutex* db_mutex, VersionSet* vset, TitanStats* stats)
: db_options_(db_options), : db_options_(db_options),
immutable_cf_options_(cf_options), cf_options_(cf_options),
mutable_cf_options_(cf_options), blob_run_mode_(cf_options.blob_run_mode),
base_factory_(cf_options.table_factory), base_factory_(cf_options.table_factory),
blob_manager_(blob_manager), blob_manager_(blob_manager),
db_mutex_(db_mutex), db_mutex_(db_mutex),
...@@ -52,21 +54,16 @@ class TitanTableFactory : public TableFactory { ...@@ -52,21 +54,16 @@ class TitanTableFactory : public TableFactory {
void* GetOptions() override { return base_factory_->GetOptions(); } void* GetOptions() override { return base_factory_->GetOptions(); }
void SetBlobRunMode(TitanBlobRunMode mode) { void SetBlobRunMode(TitanBlobRunMode mode) { blob_run_mode_.store(mode); }
MutexLock l(&mutex_);
mutable_cf_options_.blob_run_mode = mode;
}
bool IsDeleteRangeSupported() const override { bool IsDeleteRangeSupported() const override {
return base_factory_->IsDeleteRangeSupported(); return base_factory_->IsDeleteRangeSupported();
} }
private: private:
mutable port::Mutex mutex_; const TitanDBOptions db_options_;
const TitanCFOptions cf_options_;
TitanDBOptions db_options_; std::atomic<TitanBlobRunMode> blob_run_mode_;
ImmutableTitanCFOptions immutable_cf_options_;
MutableTitanCFOptions mutable_cf_options_;
std::shared_ptr<TableFactory> base_factory_; std::shared_ptr<TableFactory> base_factory_;
std::shared_ptr<BlobFileManager> blob_manager_; std::shared_ptr<BlobFileManager> blob_manager_;
port::Mutex* db_mutex_; port::Mutex* db_mutex_;
......
...@@ -613,15 +613,40 @@ TEST_F(TitanDBTest, BlobFileCorruptionErrorHandling) { ...@@ -613,15 +613,40 @@ TEST_F(TitanDBTest, BlobFileCorruptionErrorHandling) {
} }
#endif // !NDEBUG #endif // !NDEBUG
TEST_F(TitanDBTest, Options) { TEST_F(TitanDBTest, SetOptions) {
options_.write_buffer_size = 42000000;
options_.min_blob_size = 123;
options_.blob_run_mode = TitanBlobRunMode::kReadOnly;
Open(); Open();
TitanOptions titan_options = db_->GetTitanOptions();
ASSERT_EQ(42000000, titan_options.write_buffer_size);
ASSERT_EQ(123, titan_options.min_blob_size);
ASSERT_EQ(TitanBlobRunMode::kReadOnly, titan_options.blob_run_mode);
std::unordered_map<std::string, std::string> opts; std::unordered_map<std::string, std::string> opts;
// Set titan options.
opts["blob_run_mode"] = "kReadOnly"; opts["blob_run_mode"] = "kReadOnly";
ASSERT_OK(db_->SetOptions(opts)); ASSERT_OK(db_->SetOptions(opts));
titan_options = db_->GetTitanOptions();
ASSERT_EQ(TitanBlobRunMode::kReadOnly, titan_options.blob_run_mode);
opts.clear();
// Set column family options.
opts["disable_auto_compactions"] = "true"; opts["disable_auto_compactions"] = "true";
ASSERT_OK(db_->SetOptions(opts)); ASSERT_OK(db_->SetOptions(opts));
titan_options = db_->GetTitanOptions();
ASSERT_TRUE(titan_options.disable_auto_compactions);
opts.clear();
// Set DB options.
opts["max_background_jobs"] = "15";
ASSERT_OK(db_->SetDBOptions(opts));
titan_options = db_->GetTitanOptions();
ASSERT_EQ(15, titan_options.max_background_jobs);
TitanDBOptions titan_db_options = db_->GetTitanDBOptions();
ASSERT_EQ(15, titan_db_options.max_background_jobs);
} }
TEST_F(TitanDBTest, BlobRunModeBasic) { TEST_F(TitanDBTest, BlobRunModeBasic) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment