From 9d0473c3ad0df9a897779463b1c122e61a40cb94 Mon Sep 17 00:00:00 2001 From: librelois <elois@ifee.fr> Date: Mon, 30 Sep 2019 00:05:31 +0200 Subject: [PATCH] [fix] bc-db-reader: get_dal_block_in_local_blockchain mustn't create tx --- lib/modules-lib/bc-db-reader/src/blocks.rs | 15 ++++++------- lib/modules/blockchain/blockchain/src/dbex.rs | 6 +++--- .../blockchain/src/dubp/check/mod.rs | 3 ++- .../blockchain/src/fork/fork_algo.rs | 14 ++++++++----- .../blockchain/src/requests/received.rs | 21 ++++++++++++------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/lib/modules-lib/bc-db-reader/src/blocks.rs b/lib/modules-lib/bc-db-reader/src/blocks.rs index 2867c98a..b280dee7 100644 --- a/lib/modules-lib/bc-db-reader/src/blocks.rs +++ b/lib/modules-lib/bc-db-reader/src/blocks.rs @@ -124,12 +124,13 @@ pub fn get_fork_block<DB: DbReadable, R: DbReader>( } /// Get block hash -pub fn get_block_hash<DB: DbReadable>( +pub fn get_block_hash<DB: DbReadable, R: DbReader>( db: &DB, + r: &R, block_number: BlockNumber, ) -> Result<Option<BlockHash>, DbError> { Ok( - if let Some(block) = get_block_in_local_blockchain(db, block_number)? { + if let Some(block) = get_block_in_local_blockchain(db, r, block_number)? { block.hash() } else { None @@ -139,16 +140,12 @@ pub fn get_block_hash<DB: DbReadable>( /// Get block in local blockchain #[inline] -pub fn get_block_in_local_blockchain<DB: DbReadable>( +pub fn get_block_in_local_blockchain<DB: DbReadable, R: DbReader>( db: &DB, + r: &R, block_number: BlockNumber, ) -> Result<Option<BlockDocument>, DbError> { - db.read(|r| { - Ok( - get_dal_block_in_local_blockchain(db, r, block_number)? - .map(|dal_block| dal_block.block), - ) - }) + Ok(get_dal_block_in_local_blockchain(db, r, block_number)?.map(|dal_block| dal_block.block)) } /// Get block in local blockchain diff --git a/lib/modules/blockchain/blockchain/src/dbex.rs b/lib/modules/blockchain/blockchain/src/dbex.rs index 1aea3853..355cb65d 100644 --- a/lib/modules/blockchain/blockchain/src/dbex.rs +++ b/lib/modules/blockchain/blockchain/src/dbex.rs @@ -146,9 +146,9 @@ pub fn dbex_bc(profile_path: PathBuf, _csv: bool, _query: DbExBcQuery) -> Result durs_bc_db_reader::current_meta_datas::get_current_blockstamp(&db)? { println!("Current block: #{}.", current_blockstamp); - if let Some(current_block) = - durs_bc_db_reader::blocks::get_block_in_local_blockchain(&db, current_blockstamp.id)? - { + if let Some(current_block) = db.read(|r| { + durs_bc_db_reader::blocks::get_block_in_local_blockchain(&db, r, current_blockstamp.id) + })? { let map_pubkey = durs_bc_db_reader::blocks::get_current_frame(¤t_block, &db)?; let mut vec = map_pubkey.iter().collect::<Vec<(&PubKey, &usize)>>(); diff --git a/lib/modules/blockchain/blockchain/src/dubp/check/mod.rs b/lib/modules/blockchain/blockchain/src/dubp/check/mod.rs index caa7422b..be5d5a91 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/check/mod.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/check/mod.rs @@ -36,7 +36,7 @@ pub enum InvalidBlockError { pub fn verify_block_validity<DB, R, W>( block: &BlockDocument, db: &DB, - _r: &R, + r: &R, _wot_index: &HashMap<PubKey, WotId>, _wot_db: &BinFreeStructDb<W>, ) -> Result<(), BlockError> @@ -50,6 +50,7 @@ where // Get previous block let previous_block_opt = durs_bc_db_reader::blocks::get_block_in_local_blockchain( db, + r, BlockNumber(block.number().0 - 1), )?; diff --git a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs index 7adda645..645fef8c 100644 --- a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs +++ b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs @@ -140,11 +140,15 @@ mod tests { })?; // Local blockchain must contain at least `fork_window_size +2` blocks - assert!(durs_bc_db_reader::blocks::get_block_in_local_blockchain( - &db, - BlockNumber((fork_window_size + 1) as u32) - )? - .is_some()); + assert!(db + .read( + |r| durs_bc_db_reader::blocks::get_block_in_local_blockchain( + &db, + r, + BlockNumber((fork_window_size + 1) as u32) + ) + )? + .is_some()); // Fork tree must contain at least `fork_window_size +2` blocks assert_eq!(fork_window_size, fork_tree.size()); diff --git a/lib/modules/blockchain/blockchain/src/requests/received.rs b/lib/modules/blockchain/blockchain/src/requests/received.rs index 1de8ba25..48c4c7ef 100644 --- a/lib/modules/blockchain/blockchain/src/requests/received.rs +++ b/lib/modules/blockchain/blockchain/src/requests/received.rs @@ -37,10 +37,13 @@ pub fn receive_req( BlockchainRequest::CurrentBlock => { debug!("BlockchainModule : receive BlockchainRequest::CurrentBlock()"); - if let Ok(block_opt) = durs_bc_db_reader::blocks::get_block_in_local_blockchain( - bc.db(), - bc.current_blockstamp.id, - ) { + if let Ok(block_opt) = bc.db().read(|r| { + durs_bc_db_reader::blocks::get_block_in_local_blockchain( + bc.db(), + r, + bc.current_blockstamp.id, + ) + }) { if let Some(block) = block_opt { debug!( "BlockchainModule : send_req_response(CurrentBlock({}))", @@ -70,9 +73,13 @@ pub fn receive_req( block_number ); - if let Ok(block_opt) = - durs_bc_db_reader::blocks::get_block_in_local_blockchain(bc.db(), block_number) - { + if let Ok(block_opt) = bc.db().read(|r| { + durs_bc_db_reader::blocks::get_block_in_local_blockchain( + bc.db(), + r, + block_number, + ) + }) { if let Some(block) = block_opt { debug!( "BlockchainModule : send_req_response(BlockByNumber(#{}))", -- GitLab