From 46f9f213e01de675b39c65b03e672a1fcedcd1a0 Mon Sep 17 00:00:00 2001 From: librelois <elois@ifee.fr> Date: Sun, 8 Sep 2019 18:45:55 +0200 Subject: [PATCH] [ref] core: open blockchain DB in core --- Cargo.lock | 2 ++ lib/core/core/Cargo.toml | 2 ++ lib/core/core/src/commands/mod.rs | 30 ++++++++++++++++++- lib/core/core/src/errors.rs | 3 ++ lib/core/core/src/lib.rs | 27 +++++++---------- lib/core/core/src/router.rs | 4 +-- lib/modules/blockchain/blockchain/src/dbex.rs | 4 +-- lib/modules/blockchain/blockchain/src/lib.rs | 2 +- .../src/sync/download/json_reader_worker.rs | 2 +- 9 files changed, 51 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f73bbd70..b966b136 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -622,9 +622,11 @@ dependencies = [ "dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "dubp-currency-params 0.2.0", "dup-crypto 0.7.0", + "durs-bc-db-reader 0.3.0-dev", "durs-blockchain 0.3.0-dev", "durs-common-tools 0.2.0", "durs-conf 0.3.0-dev", + "durs-dbs-tools 0.1.0-a", "durs-message 0.3.0-dev", "durs-module 0.3.0-dev", "durs-network 0.3.0-dev", diff --git a/lib/core/core/Cargo.toml b/lib/core/core/Cargo.toml index 86f6c544..555fd03a 100644 --- a/lib/core/core/Cargo.toml +++ b/lib/core/core/Cargo.toml @@ -14,7 +14,9 @@ clear_on_drop = "0.2.3" dirs = "1.0.2" durs-blockchain = { path = "../../modules/blockchain/blockchain" } durs-common-tools = { path = "../../tools/common-tools" } +durs-bc-db-reader = { path = "../../modules-lib/bc-db-reader" } durs-conf = { path = "../conf" } +durs-dbs-tools = { path = "../../tools/dbs-tools" } dup-crypto = { path = "../../crypto" } dubp-currency-params = { path = "../../dubp/currency-params" } durs-message = { path = "../message" } diff --git a/lib/core/core/src/commands/mod.rs b/lib/core/core/src/commands/mod.rs index bfe86cc7..0c51c03b 100644 --- a/lib/core/core/src/commands/mod.rs +++ b/lib/core/core/src/commands/mod.rs @@ -21,10 +21,12 @@ pub mod modules; pub mod reset; pub mod start; +use crate::constants::DEFAULT_USER_PROFILE; use crate::errors::DursCoreError; use crate::DursCore; pub use dbex::*; use durs_conf::DuRsConf; +use durs_dbs_tools::kv_db::KvFileDbHandler; pub use durs_network::cli::sync::SyncOpt; pub use keys::KeysOpt; use log::Level; @@ -47,6 +49,20 @@ pub struct DursCoreOptions { pub profiles_path: Option<PathBuf>, } +impl DursCoreOptions { + /// Define profile path + #[inline] + pub fn define_profile_path(&self) -> PathBuf { + durs_conf::get_profile_path( + &self.profiles_path, + &self + .profile_name + .clone() + .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()), + ) + } +} + /// Dunitrust executable command pub trait DursExecutableCoreCommand { /// Execute Dunitrust command @@ -76,6 +92,14 @@ pub enum DursCommandEnum<T: ExecutableModuleCommand> { } impl<T: ExecutableModuleCommand> DursCommand<T> { + fn open_bc_db(&self, profile_path: &PathBuf) -> Result<KvFileDbHandler, DursCoreError> { + let bc_db_path = durs_conf::get_blockchain_db_path(profile_path.clone()); + durs_dbs_tools::kv_db::KvFileDbHandler::open_db( + bc_db_path.as_path(), + &durs_bc_db_reader::bc_db_schema(), + ) + .map_err(DursCoreError::FailOpenBcDb) + } /// Execute Dunitrust command pub fn execute<PlugFunc>( self, @@ -86,12 +110,16 @@ impl<T: ExecutableModuleCommand> DursCommand<T> { where PlugFunc: FnMut(&mut DursCore<DuRsConf>) -> Result<(), DursCoreError>, { + let profile_path = self.options.define_profile_path(); + let bc_db = self.open_bc_db(&profile_path)?; + match self.command { DursCommandEnum::Core(core_cmd) => DursCore::execute_core_command( + bc_db, core_cmd, self.options, - vec![], plug_modules, + profile_path, soft_name, soft_version, ), diff --git a/lib/core/core/src/errors.rs b/lib/core/core/src/errors.rs index 80d35374..9bd76606 100644 --- a/lib/core/core/src/errors.rs +++ b/lib/core/core/src/errors.rs @@ -29,6 +29,9 @@ pub enum DursCoreError { /// Generic error that impl Fail #[fail(display = "{}", _0)] Error(Error), + /// Fail to open blockchain DB. + #[fail(display = "Fail to open blockchain DB: {:?}", _0)] + FailOpenBcDb(durs_dbs_tools::DbError), /// Fail to read currency params DB #[fail(display = "Fail to read currency params DB: {}", _0)] FailReadCurrencyParamsDb(CurrencyParamsDbError), diff --git a/lib/core/core/src/lib.rs b/lib/core/core/src/lib.rs index 8c0ad966..583a10f8 100644 --- a/lib/core/core/src/lib.rs +++ b/lib/core/core/src/lib.rs @@ -40,7 +40,6 @@ mod logger; mod router; use crate::commands::*; -use crate::constants::DEFAULT_USER_PROFILE; use crate::errors::DursCoreError; use dubp_currency_params::CurrencyName; use durs_blockchain::{dbex::DbExQuery, BlockchainModule}; @@ -155,10 +154,11 @@ impl DursCore<DuRsConf> { /// Execute core command pub fn execute_core_command<PlugFunc>( + bc_db: durs_dbs_tools::kv_db::KvFileDbHandler, core_command: DursCoreCommand, durs_core_opts: DursCoreOptions, - external_followers: Vec<mpsc::Sender<DursMsg>>, mut plug_modules: PlugFunc, + profile_path: PathBuf, soft_name: &'static str, soft_version: &'static str, ) -> Result<(), DursCoreError> @@ -168,8 +168,6 @@ impl DursCore<DuRsConf> { // Instantiate durs core let mut durs_core = DursCore::<DuRsConf>::init(soft_name, soft_version, durs_core_opts, 0)?; - let profile_path = durs_core.soft_meta_datas.profile_path.clone(); - /* * CORE COMMAND PROCESSING */ @@ -183,7 +181,6 @@ impl DursCore<DuRsConf> { 0, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - vec![], )); plug_modules(&mut durs_core) } @@ -194,10 +191,9 @@ impl DursCore<DuRsConf> { durs_core.run_duration_in_secs, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - external_followers, )); plug_modules(&mut durs_core)?; - durs_core.start() + durs_core.start(bc_db) } DursCoreCommand::SyncOpt(opts) => { if opts.local_path.is_some() { @@ -217,10 +213,9 @@ impl DursCore<DuRsConf> { durs_core.run_duration_in_secs, profile_path.clone(), durs_core.soft_meta_datas.conf.clone(), - external_followers, )); plug_modules(&mut durs_core)?; - durs_core.start() + durs_core.start(bc_db) } else { Err(DursCoreError::SyncWithoutSource) } @@ -238,13 +233,7 @@ impl DursCore<DuRsConf> { run_duration_in_secs: u64, ) -> Result<DursCore<DuRsConf>, DursCoreError> { // get profile path - let profile_path = durs_conf::get_profile_path( - &durs_core_opts.profiles_path, - &durs_core_opts - .profile_name - .clone() - .unwrap_or_else(|| DEFAULT_USER_PROFILE.to_owned()), - ); + let profile_path = durs_core_opts.define_profile_path(); // Init logger logger::init( @@ -286,7 +275,10 @@ impl DursCore<DuRsConf> { }) } /// Start durs server - pub fn start(mut self) -> Result<(), DursCoreError> { + pub fn start( + mut self, + bc_db: durs_dbs_tools::kv_db::KvFileDbHandler, + ) -> Result<(), DursCoreError> { if self.network_modules_count == 0 { fatal_error!( "Dev error: no network module found: you must plug at least one network module !" @@ -329,6 +321,7 @@ impl DursCore<DuRsConf> { // Instantiate blockchain module and load is conf let mut blockchain_module = BlockchainModule::load_blockchain_conf( + bc_db, router_sender.clone(), profile_path, RequiredKeysContent::MemberKeyPair(None), diff --git a/lib/core/core/src/router.rs b/lib/core/core/src/router.rs index acba54fa..5086e572 100644 --- a/lib/core/core/src/router.rs +++ b/lib/core/core/src/router.rs @@ -41,7 +41,6 @@ enum DursMsgReceiver { fn start_broadcasting_thread( start_time: SystemTime, receiver: &mpsc::Receiver<RouterThreadMessage<DursMsg>>, - _external_followers: &[mpsc::Sender<DursMsg>], ) { // Define variables let mut modules_senders: HashMap<ModuleStaticName, mpsc::Sender<DursMsg>> = HashMap::new(); @@ -317,7 +316,6 @@ pub fn start_router( run_duration_in_secs: u64, profile_path: PathBuf, conf: DuRsConf, - external_followers: Vec<mpsc::Sender<DursMsg>>, ) -> mpsc::Sender<RouterThreadMessage<DursMsg>> { let start_time = SystemTime::now(); @@ -337,7 +335,7 @@ pub fn start_router( // Create broadcasting thread thread::spawn(move || { - start_broadcasting_thread(start_time, &broadcasting_receiver, &external_followers); + start_broadcasting_thread(start_time, &broadcasting_receiver); }); // Create conf thread channel diff --git a/lib/modules/blockchain/blockchain/src/dbex.rs b/lib/modules/blockchain/blockchain/src/dbex.rs index 4dda821e..65cc5165 100644 --- a/lib/modules/blockchain/blockchain/src/dbex.rs +++ b/lib/modules/blockchain/blockchain/src/dbex.rs @@ -111,7 +111,7 @@ pub fn dbex_bc(profile_path: PathBuf, _csv: bool, _query: DbExBcQuery) -> Result // Open databases let load_dbs_begin = SystemTime::now(); - let db = open_db(&db_path.as_path())?; + let db = durs_bc_db_reader::open_db_ro(&db_path.as_path())?; let load_dbs_duration = SystemTime::now() .duration_since(load_dbs_begin) @@ -379,7 +379,7 @@ pub fn dbex_wot(profile_path: PathBuf, csv: bool, query: &DbExWotQuery) { } DbExWotQuery::ExpireMembers(ref reverse) => { // Open blockchain database - let db = open_db(&db_path.as_path()).expect("Fail to open DB."); + let db = durs_bc_db_reader::open_db_ro(&db_path.as_path()).expect("Fail to open DB."); // Get blocks_times let all_blocks = durs_bc_db_reader::readers::block::get_blocks_in_local_blockchain( &db, diff --git a/lib/modules/blockchain/blockchain/src/lib.rs b/lib/modules/blockchain/blockchain/src/lib.rs index b71714b4..4706747b 100644 --- a/lib/modules/blockchain/blockchain/src/lib.rs +++ b/lib/modules/blockchain/blockchain/src/lib.rs @@ -181,6 +181,7 @@ impl BlockchainModule { } /// Loading blockchain configuration pub fn load_blockchain_conf( + db: Db, router_sender: mpsc::Sender<RouterThreadMessage<DursMsg>>, profile_path: PathBuf, _keys: RequiredKeysContent, @@ -189,7 +190,6 @@ impl BlockchainModule { let dbs_path = durs_conf::get_blockchain_db_path(profile_path.clone()); // Open databases - let db = open_db(&dbs_path.as_path()).unwrap_or_else(|_| fatal_error!("Fail to open DB.")); let fork_tree = durs_bc_db_reader::readers::current_meta_datas::get_fork_tree(&db) .unwrap_or_else(|_| fatal_error!("Fail to get fork tree.")); let wot_databases = WotsV10DBs::open(Some(&dbs_path)); diff --git a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs index 11328f1c..d288cca0 100644 --- a/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs +++ b/lib/modules/blockchain/blockchain/src/sync/download/json_reader_worker.rs @@ -96,7 +96,7 @@ pub fn json_reader_worker( // Get current local blockstamp debug!("Get local current blockstamp..."); let db_path = durs_conf::get_blockchain_db_path(profile_path); - let db = open_db(&db_path).expect("Fail to open DB."); + let db = durs_bc_db_reader::open_db_ro(&db_path).expect("Fail to open DB."); let current_blockstamp: Blockstamp = durs_bc_db_reader::readers::current_meta_datas::get_current_blockstamp(&db) .expect("get_current_blockstamp: Fail to read DB !") -- GitLab