Skip to content

Commit

Permalink
feat: make rocksdb configurable via config file
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Config file must be updated with new db configurations
as below otherwise node won't start.

```json
{
+    "db": {
+        "backend": "rocksdb",
+        "rocksdb": {
+            "path": "db"
+        }
+    }
}
```
  • Loading branch information
Jan Xie committed Jan 26, 2019
1 parent 687a64c commit f46b4fa
Show file tree
Hide file tree
Showing 7 changed files with 150 additions and 38 deletions.
107 changes: 98 additions & 9 deletions db/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,76 @@ pub struct DBConfig {
/// RocksDB specific db configurations.
///
/// https://docs.rs/rocksdb/0.6.0/rocksdb/struct.Options.html
#[derive(Clone, Debug, Deserialize)]
#[derive(Clone, Debug, Default, Deserialize)]
pub struct RocksDBConfig {
pub path: PathBuf,

// Options in rust-rocksdb/src/db_options.rs
pub increase_parallelism: Option<i32>,
pub optimize_level_style_compaction: Option<usize>,
pub create_if_missing: Option<bool>,
pub create_missing_column_families: Option<bool>,
// set_compression_type
// set_compression_per_level
// set_merge_operator
// add_merge_operator
// set_compaction_filter
// set_comparator
// set_prefix_extractor
// add_comparator
pub optimize_for_point_lookup: Option<u64>,
pub set_max_open_files: Option<i32>,
pub set_use_fsync: Option<bool>,
pub set_bytes_per_sync: Option<u64>,
pub set_allow_concurrent_memtable_write: Option<bool>,
pub set_use_direct_reads: Option<bool>,
pub set_use_direct_io_for_flush_and_compaction: Option<bool>,
// deprecated: pub set_allow_os_buffer: Option<bool>,
pub set_table_cache_num_shard_bits: Option<i32>,
pub set_min_write_buffer_number: Option<i32>,
pub set_max_write_buffer_number: Option<i32>,
pub set_write_buffer_size: Option<usize>,
pub set_max_bytes_for_level_base: Option<u64>,
pub set_max_bytes_for_level_multiplier: Option<f64>,
pub set_max_manifest_file_size: Option<usize>,
pub set_target_file_size_base: Option<u64>,
pub set_min_write_buffer_number_to_merge: Option<i32>,
pub set_level_zero_file_num_compaction_trigger: Option<i32>,
pub set_level_zero_slowdown_writes_trigger: Option<i32>,
pub set_level_zero_stop_writes_trigger: Option<i32>,
// set_compaction_style
pub set_max_background_compactions: Option<i32>,
pub set_max_background_flushes: Option<i32>,
pub set_disable_auto_compactions: Option<bool>,
// set_block_based_table_factory
pub set_report_bg_io_stats: Option<bool>,
// set_wal_recovery_mode
pub enable_statistics: Option<String>,
pub set_stats_dump_period_sec: Option<u32>,
pub set_advise_random_on_open: Option<bool>,
pub set_num_levels: Option<i32>,
}

impl Default for RocksDBConfig {
fn default() -> Self {
RocksDBConfig {
path: Default::default(),
create_if_missing: None,
create_missing_column_families: None,
}
}
/// Macro to set Rocksdb options.
///
/// e.g.
/// ```
/// set_rocksdb_options!(self, opts, increase_parallelism, optimize_level_style_compaction, ...);
/// ```
/// =>
/// ```
/// if let Some(x) = self.increase_parallelism {
/// opts.increase_parallelism(x);
/// }
/// if let Some(x) = self.optimize_level_style_compaction {
/// opts.optimize_level_style_compaction(x);
/// }
/// ...
/// ```
macro_rules! set_rocksdb_options {
($self:ident, $opts:ident, $($name:tt),*) => {{
$( if let Some(x) = $self.$name { $opts.$name(x); } )*
}}
}

impl RocksDBConfig {
Expand All @@ -37,6 +92,40 @@ impl RocksDBConfig {
opts.create_missing_column_families(
self.create_missing_column_families.unwrap_or(true));

if let Some(_) = self.enable_statistics {
opts.enable_statistics();
}

set_rocksdb_options!(self, opts,
increase_parallelism,
optimize_level_style_compaction,
optimize_for_point_lookup,
set_max_open_files,
set_use_fsync,
set_bytes_per_sync,
set_allow_concurrent_memtable_write,
set_use_direct_reads,
set_use_direct_io_for_flush_and_compaction,
set_table_cache_num_shard_bits,
set_min_write_buffer_number,
set_max_write_buffer_number,
set_write_buffer_size,
set_max_bytes_for_level_base,
set_max_bytes_for_level_multiplier,
set_max_manifest_file_size,
set_target_file_size_base,
set_min_write_buffer_number_to_merge,
set_level_zero_file_num_compaction_trigger,
set_level_zero_slowdown_writes_trigger,
set_level_zero_stop_writes_trigger,
set_max_background_compactions,
set_max_background_flushes,
set_disable_auto_compactions,
set_report_bg_io_stats,
set_stats_dump_period_sec,
set_advise_random_on_open,
set_num_levels
);
opts
}
}
21 changes: 19 additions & 2 deletions db/src/diskdb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ mod tests {

#[test]
#[should_panic]
fn panic_if_missing() {
fn test_panic_if_missing() {
let tmp_dir = tempfile::Builder::new()
.prefix("panic_if_missing").tempdir().unwrap();
.prefix("test_panic_if_missing").tempdir().unwrap();
let config = RocksDBConfig {
path: tmp_dir.as_ref().to_path_buf(),
create_if_missing: Some(false),
Expand All @@ -119,6 +119,23 @@ mod tests {
RocksDB::open(&config, 2); // panic
}

#[test]
fn test_enable_statistics() {
let opts = RocksDBConfig::default().to_db_options();
assert!(opts.get_statistics().is_none());

let tmp_dir = tempfile::Builder::new()
.prefix("test_enable_statistics").tempdir().unwrap();
let config = RocksDBConfig {
path: tmp_dir.as_ref().to_path_buf(),
enable_statistics: Some("".to_owned()),
set_stats_dump_period_sec: Some(60),
..Default::default()
};
let opts = config.to_db_options();
assert!(opts.get_statistics().is_some());
}

#[test]
fn write_and_read() {
let db = setup_db("write_and_read", 2);
Expand Down
6 changes: 6 additions & 0 deletions nodes_template/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
},

"data_dir": "default",
"db": {
"backend": "rocksdb",
"rocksdb": {
"path": "db"
}
},
"chain": {
"spec": "spec/dev.json"
},
Expand Down
8 changes: 6 additions & 2 deletions shared/src/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ mod tests {
use super::super::COLUMNS;
use super::*;
use ckb_chain_spec::consensus::Consensus;
use ckb_db::diskdb::RocksDB;
use ckb_db::{RocksDB, RocksDBConfig};
use tempfile;

#[test]
Expand All @@ -169,7 +169,11 @@ mod tests {
.prefix("index_init")
.tempdir()
.unwrap();
let db = RocksDB::open(tmp_dir, COLUMNS);
let config = RocksDBConfig {
path: tmp_dir.as_ref().to_path_buf(),
..Default::default()
};
let db = RocksDB::open(&config, COLUMNS);
let store = ChainKVStore::new(db);
let consensus = Consensus::default();
let block = consensus.genesis_block();
Expand Down
2 changes: 0 additions & 2 deletions shared/src/shared.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@ use ckb_core::transaction_meta::TransactionMeta;
use ckb_core::uncle::UncleBlock;
use ckb_db::{KeyValueDB, MemoryKeyValueDB, RocksDB, DBConfig};
use ckb_util::RwLock;
use dir::Directories;
use fnv::FnvHashSet;
use numext_fixed_hash::H256;
use numext_fixed_uint::U256;
use std::path::Path;
use std::sync::Arc;

#[derive(Default, Debug, PartialEq, Clone, Eq)]
Expand Down
37 changes: 16 additions & 21 deletions shared/src/store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -319,16 +319,23 @@ mod tests {
use super::super::COLUMNS;
use super::*;
use ckb_chain_spec::consensus::Consensus;
use ckb_db::diskdb::RocksDB;
use ckb_db::{RocksDB, RocksDBConfig};
use tempfile;

fn setup_db(prefix: &str, columns: u32) -> RocksDB {
let tmp_dir = tempfile::Builder::new()
.prefix(prefix).tempdir().unwrap();
let config = RocksDBConfig {
path: tmp_dir.as_ref().to_path_buf(),
..Default::default()
};

RocksDB::open(&config, columns)
}

#[test]
fn save_and_get_output_root() {
let tmp_dir = tempfile::Builder::new()
.prefix("save_and_get_output_root")
.tempdir()
.unwrap();
let db = RocksDB::open(tmp_dir, COLUMNS);
let db = setup_db("save_and_get_output_root", COLUMNS);
let store = ChainKVStore::new(db);

let ret = store.save_with_batch(|batch| {
Expand All @@ -350,11 +357,7 @@ mod tests {

#[test]
fn save_and_get_block() {
let tmp_dir = tempfile::Builder::new()
.prefix("save_and_get_block")
.tempdir()
.unwrap();
let db = RocksDB::open(tmp_dir, COLUMNS);
let db = setup_db("save_and_get_block", COLUMNS);
let store = ChainKVStore::new(db);
let consensus = Consensus::default();
let block = consensus.genesis_block();
Expand All @@ -370,11 +373,7 @@ mod tests {

#[test]
fn save_and_get_block_with_transactions() {
let tmp_dir = tempfile::Builder::new()
.prefix("save_and_get_block_with_transaction")
.tempdir()
.unwrap();
let db = RocksDB::open(tmp_dir, COLUMNS);
let db = setup_db("save_and_get_block_with_transactions", COLUMNS);
let store = ChainKVStore::new(db);
let block = BlockBuilder::default()
.commit_transaction(TransactionBuilder::default().build())
Expand All @@ -393,11 +392,7 @@ mod tests {

#[test]
fn save_and_get_block_ext() {
let tmp_dir = tempfile::Builder::new()
.prefix("save_and_get_block_ext")
.tempdir()
.unwrap();
let db = RocksDB::open(tmp_dir, COLUMNS);
let db = setup_db("save_and_get_block_ext", COLUMNS);
let store = ChainKVStore::new(db);
let consensus = Consensus::default();
let block = consensus.genesis_block();
Expand Down
7 changes: 5 additions & 2 deletions src/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,15 +209,18 @@ pub mod test {
let test_conifg = r#"{
"db": {
"rocksdb": {
"create_if_missing": true
"create_if_missing": true,
"enable_statistics": ""
}
}
}"#;
let config_path = tmp_dir.path().join("config.json");
write_file(&config_path, test_conifg);
let setup = override_default_config_file(&config_path).unwrap();
assert_eq!(setup.configs.db.backend, "rocksdb");
assert_eq!(setup.configs.db.rocksdb.unwrap().create_if_missing, Some(true));
let rocksdb_config = setup.configs.db.rocksdb.unwrap();
assert_eq!(rocksdb_config.create_if_missing, Some(true));
assert_eq!(rocksdb_config.enable_statistics, Some("".to_owned()));
}

#[test]
Expand Down

0 comments on commit f46b4fa

Please sign in to comment.