diff --git a/lib/modules/blockchain/blockchain/src/fork/rollback.rs b/lib/modules/blockchain/blockchain/src/fork/rollback.rs index 6df5e61d044b3409e8012529ca7d207211746d79..6ff7069fc2f38afded70289626ad2fbc0819a1ff 100644 --- a/lib/modules/blockchain/blockchain/src/fork/rollback.rs +++ b/lib/modules/blockchain/blockchain/src/fork/rollback.rs @@ -88,34 +88,51 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) durs_bc_db_reader::blocks::get_fork_block(&db, w.as_ref(), *blockstamp) { new_branch_blocks.push(dal_block.clone()); - if let Ok(CheckAndApplyBlockReturn::ValidMainBlock(ValidBlockApplyReqs( - bc_db_query, - wot_dbs_queries, - tx_dbs_queries, - ))) = check_and_apply_block(bc, &db, &mut w, dal_block.block) - { - bc.current_blockstamp = *blockstamp; - // Apply db requests + match check_and_apply_block(bc, &db, &mut w, dal_block.block) { + Ok(check_and_apply_block_return) => match check_and_apply_block_return { + CheckAndApplyBlockReturn::ValidMainBlock(ValidBlockApplyReqs( + bc_db_query, + wot_dbs_queries, + tx_dbs_queries, + )) => { + bc.current_blockstamp = *blockstamp; - bc_db_query - .apply( - &db, - &mut w, - &mut bc.fork_tree, - unwrap!(bc.currency_params).fork_window_size, - None, - ) - .expect("Fatal error : Fail to apply DBWriteRequest !"); - for query in &wot_dbs_queries { - query - .apply(&db, &mut w, &blockstamp, &unwrap!(bc.currency_params)) - .expect("Fatal error : Fail to apply WotsDBsWriteRequest !"); + // Apply db requests + bc_db_query + .apply( + &db, + &mut w, + &mut bc.fork_tree, + unwrap!(bc.currency_params).fork_window_size, + None, + ) + .expect("Fatal error : Fail to apply DBWriteRequest !"); + for query in &wot_dbs_queries { + query + .apply(&db, &mut w, &blockstamp, &unwrap!(bc.currency_params)) + .expect("Fatal error : Fail to apply WotsDBsWriteRequest !"); + } + exec_currency_queries(&db, &mut w, blockstamp.id, tx_dbs_queries)?; + } + CheckAndApplyBlockReturn::ForkBlock + | CheckAndApplyBlockReturn::OrphanBlock => { + fatal_error!( + "apply_rollback(): a block in new branch is not chainable: \ + {{ block_not_chainable: {}, current_blockstamp: {} }}", + blockstamp, + bc.current_blockstamp, + ); + } + }, + Err(e) => { + new_branch_is_valid = false; + bc.invalid_forks.insert(*blockstamp); + info!( + "Blockchain: abort rollback: block {} is invalid: {:?}", + blockstamp, e + ); + break; } - exec_currency_queries(&db, &mut w, blockstamp.id, tx_dbs_queries)?; - } else { - new_branch_is_valid = false; - bc.invalid_forks.insert(*blockstamp); - break; } } else { fatal_error!( @@ -162,7 +179,9 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) } } Err(DbError::WriteAbort { .. }) => { - // reload dbs + // Reset current blockstamp + bc.current_blockstamp = old_current_blockstamp; + // Reload wot file let dbs_path = durs_conf::get_blockchain_db_path(bc.profile_path.clone()); bc.wot_databases = WotsV10DBs::open(Some(&dbs_path)); }