diff --git a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs index 3a8ef7e097eeabe1f63020999b8d957a953c2215..ca1d11729bcde5c791d94d60b58decc2cb97b7bd 100644 --- a/lib/modules-lib/bc-db-reader/src/indexes/identities.rs +++ b/lib/modules-lib/bc-db-reader/src/indexes/identities.rs @@ -284,7 +284,7 @@ mod test { wot_id as u32, &KvFileDbHandler::db_value(&idty_bin)?, )?; - Ok(w) + Ok(WriteResp::from(w)) })?; wot_id += 1; } @@ -296,7 +296,7 @@ mod test { CurrentMetaDataKey::NextWotId.to_u32(), &DbValue::U64(wot_id), )?; - Ok(w) + Ok(WriteResp::from(w)) })?; // Test default filters diff --git a/lib/modules-lib/bc-db-reader/src/lib.rs b/lib/modules-lib/bc-db-reader/src/lib.rs index 7b63de381ba6fd9f4e4eef1bbc36d6be1df57258..143f4fe5a7499ddf09b4ab3573e80b00efc6185d 100644 --- a/lib/modules-lib/bc-db-reader/src/lib.rs +++ b/lib/modules-lib/bc-db-reader/src/lib.rs @@ -40,7 +40,7 @@ pub mod traits; pub use durs_dbs_tools::kv_db_old::{ from_db_value, KvFileDbRead as DbReadable, KvFileDbReader as Reader, KvFileDbRoHandler as BcDbRo, KvFileDbSchema, KvFileDbStoreType, KvFileDbValue as DbValue, - Readable as DbReader, + Readable as DbReader, WriteResp, }; pub use durs_dbs_tools::DbError; #[cfg(feature = "mock")] diff --git a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs index f6ac03136c9a5a3b7f3ddc8677e23ae8ca3ff0e9..260dc8b9158ea9771e6fdf50f6f176cfacdb6ca1 100644 --- a/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs +++ b/lib/modules/blockchain/bc-db-writer/src/indexes/transactions.rs @@ -282,7 +282,7 @@ mod tests { &vec![tx_doc.issuers()[0], tortue_pubkey], false, )?; - Ok(w) + Ok(WriteResp::from(w)) })?; db.write(|mut w| { @@ -299,7 +299,7 @@ mod tests { )?; // Apply first g1 transaction apply_and_write_tx(&db, &mut w, &tx_doc, true)?; - Ok(w) + Ok(WriteResp::from(w)) })?; // Check new UTXOS // TODO @@ -319,7 +319,7 @@ mod tests { } else { panic!(dbg!("No block consumed sources")); } - Ok(w) + Ok(WriteResp::from(w)) })?; // UTXOS must be empty diff --git a/lib/modules/blockchain/bc-db-writer/src/lib.rs b/lib/modules/blockchain/bc-db-writer/src/lib.rs index b48b1570a8fdfbdb9f72c8de39df896d57216a03..76dff17f2c4d59448611857ac7d21062072674be 100644 --- a/lib/modules/blockchain/bc-db-writer/src/lib.rs +++ b/lib/modules/blockchain/bc-db-writer/src/lib.rs @@ -39,7 +39,7 @@ pub mod writers; pub use durs_dbs_tools::kv_db_old::{ KvFileDbHandler, KvFileDbRead as DbReadable, KvFileDbRoHandler, KvFileDbSchema, - KvFileDbStoreType, KvFileDbValue, KvFileDbWriter as DbWriter, + KvFileDbStoreType, KvFileDbValue, KvFileDbWriter as DbWriter, WriteResp, }; pub use durs_dbs_tools::{ open_free_struct_db, open_free_struct_file_db, open_free_struct_memory_db, diff --git a/lib/modules/blockchain/blockchain/src/dunp/receiver.rs b/lib/modules/blockchain/blockchain/src/dunp/receiver.rs index dc969299cba74e0fd3a596648c5f22f04a4b0dd2..0a9678eda15fd333b9c8f88805511ce6055015ef 100644 --- a/lib/modules/blockchain/blockchain/src/dunp/receiver.rs +++ b/lib/modules/blockchain/blockchain/src/dunp/receiver.rs @@ -136,7 +136,7 @@ pub fn receive_blocks(bc: &mut BlockchainModule, blocks: Vec<BlockDocument>) { } }, } - Ok(w) + Ok(WriteResp::from(w)) }) .unwrap_or_else(|_| fatal_error!("Fail to check or apply block: {}.", blockstamp)); bc.db = Some(db); diff --git a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs index e7dd9f761d468a8d80707718b678d635e57509e4..72984cdfea49a8762ff34119ec530576f2ff1a89 100644 --- a/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs +++ b/lib/modules/blockchain/blockchain/src/fork/fork_algo.rs @@ -133,7 +133,7 @@ mod tests { }, )?; } - Ok(w) + Ok(WriteResp::from(w)) })?; // Local blockchain must contain at least `fork_window_size +2` blocks @@ -211,7 +211,7 @@ mod tests { }, )?, ); - Ok(w) + Ok(WriteResp::from(w)) })?; // Must fork @@ -287,7 +287,7 @@ mod tests { )?, ); } - Ok(w) + Ok(WriteResp::from(w)) }) } } diff --git a/lib/modules/blockchain/blockchain/src/fork/rollback.rs b/lib/modules/blockchain/blockchain/src/fork/rollback.rs index 8b4cd210f39b670a5391babc9ce1e466a7bbef23..e045220cbaa4f2274b64063f9e45a60416e0f5d7 100644 --- a/lib/modules/blockchain/blockchain/src/fork/rollback.rs +++ b/lib/modules/blockchain/blockchain/src/fork/rollback.rs @@ -157,7 +157,7 @@ pub fn apply_rollback(bc: &mut BlockchainModule, new_bc_branch: Vec<Blockstamp>) } durs_bc_db_writer::blocks::fork_tree::save_fork_tree(&db, &mut w, &bc.fork_tree)?; - Ok(w) + Ok(WriteResp::from(w)) } else { Err(DbError::WriteAbort { reason: "Abort rollback: new branch is invalid.".to_owned(), diff --git a/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs b/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs index 946afaed8ae81158db62be9795d217ad67c5626e..b1ff85ad2e214e56d40256c6e011331c5d4b2475 100644 --- a/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs +++ b/lib/modules/blockchain/blockchain/src/fork/stackable_blocks.rs @@ -77,12 +77,11 @@ pub fn apply_stackable_blocks(bc: &mut BlockchainModule) { .expect("DB error : Fail to save fork tree !"); debug!("success to stackable_block({})", stackable_block_number); - bc.current_blockstamp = stackable_block_blockstamp; events::sent::send_event( bc, &BlockchainEvent::StackUpValidBlock(Box::new(new_current_block)), ); - Ok(w) + Ok(WriteResp::new(w, stackable_block_blockstamp)) } Ok(re) => { warn!( @@ -105,8 +104,12 @@ pub fn apply_stackable_blocks(bc: &mut BlockchainModule) { } }); bc.db = Some(db); + match db_write_result { - Ok(()) => continue 'blocks, + Ok(new_current_blockstamp) => { + bc.current_blockstamp = new_current_blockstamp; + continue 'blocks; + } Err(e) => { debug!( "Invalid stackable block {}: {:?}", diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs index 4f009c35628e50321ae024cdb2f4b62359509e68..ac7a77118515454732385c860e5e3a1e1b4d8901 100644 --- a/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs +++ b/lib/modules/blockchain/blockchain/src/sync/apply/blocks_worker.rs @@ -58,7 +58,7 @@ pub fn execute( fork_window_size, Some(target_blockstamp), )?; - Ok(w) + Ok(WriteResp::from(w)) }) .expect("Fatal error : Fail to apply BlocksDBsWriteQuery !"); @@ -91,7 +91,7 @@ pub fn execute( info!("Save db..."); db.write(|mut w| { durs_bc_db_writer::blocks::fork_tree::save_fork_tree(&db, &mut w, &fork_tree)?; - Ok(w) + Ok(WriteResp::from(w)) }) .unwrap_or_else(|_| fatal_error!("DB corrupted, please reset data.")); diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs b/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs index 0d8b0f2b2eaca6319de2be2b0b4d3a2dede119fb..46bfd528d63a26cd482ff26e49046b3798552e0e 100644 --- a/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs +++ b/lib/modules/blockchain/blockchain/src/sync/apply/mod.rs @@ -29,7 +29,7 @@ use dubp_currency_params::{CurrencyName, CurrencyParameters}; use dup_crypto::keys::PubKey; use durs_bc_db_reader::BcDbRead; use durs_bc_db_writer::writers::requests::WotsDBsWriteQuery; -use durs_bc_db_writer::WotsV10DBs; +use durs_bc_db_writer::{WotsV10DBs, WriteResp}; use durs_common_tools::fatal_error; use durs_network_documents::url::Url; use durs_wot::data::rusty::RustyWebOfTrust; @@ -122,7 +122,7 @@ impl BlockApplicator { &self.wot_databases.wot_db, &expire_certs, ); - Ok(w) + Ok(WriteResp::from(w)) }) .expect("Fail to apply valid block."); self.db = Some(db); diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs index 52ae0b285c534e325913c148d16cbcb9f7bfbfc7..19cd296139943587dca88d4d3741d62086707074 100644 --- a/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs +++ b/lib/modules/blockchain/blockchain/src/sync/apply/txs_worker.rs @@ -40,7 +40,7 @@ pub fn execute( // Apply db request db.write(|mut w| { req.apply(&db, &mut w, None, in_fork_window)?; - Ok(w) + Ok(WriteResp::from(w)) }) .expect("Fatal error : Fail to apply CurrencyDBsWriteQuery !"); wait_begin = Instant::now(); diff --git a/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs b/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs index 2cb3c86b2568b24b6e824be6732894f4f4854899..1cef4417e5eea4a66189040cb00ae5c687edb115 100644 --- a/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs +++ b/lib/modules/blockchain/blockchain/src/sync/apply/wot_worker.rs @@ -38,7 +38,7 @@ pub fn execute( SyncJobsMess::WotsDBsWriteQuery(blockstamp, currency_params, req) => { db.write(|mut w| { req.apply(&db, &mut w, &blockstamp, ¤cy_params.deref())?; - Ok(w) + Ok(WriteResp::from(w)) }) .unwrap_or_else(|_| { fatal_error!("Fail to apply WotsDBsWriteQuery ({})", blockstamp) diff --git a/lib/tests-tools/bc-db-tests-tools/src/mocks.rs b/lib/tests-tools/bc-db-tests-tools/src/mocks.rs index e5742c3b14d9fada6ecdae094f4397eda8229a74..1323d8461a27a2227ac867235f808009bb64e2de 100644 --- a/lib/tests-tools/bc-db-tests-tools/src/mocks.rs +++ b/lib/tests-tools/bc-db-tests-tools/src/mocks.rs @@ -20,7 +20,7 @@ use durs_bc_db_reader::blocks::fork_tree::ForkTree; use durs_bc_db_reader::blocks::BlockDb; use durs_bc_db_writer::blocks::{insert_new_fork_block, insert_new_head_block}; use durs_bc_db_writer::current_metadata::update_current_metadata; -use durs_bc_db_writer::{Db, DbError}; +use durs_bc_db_writer::{Db, DbError, WriteResp}; /// Warning : This function does not update the indexes and considers /// that your block is valid (so chainable on the main chain). @@ -42,7 +42,7 @@ pub fn insert_main_block( expire_certs: None, }, )?; - Ok(w) + Ok(WriteResp::from(w)) }) } @@ -63,7 +63,7 @@ pub fn insert_fork_block( expire_certs: None, }, )?; - Ok(w) + Ok(WriteResp::from(w)) })?; Ok(orphan) } diff --git a/lib/tools/dbs-tools/src/kv_db_old.rs b/lib/tools/dbs-tools/src/kv_db_old.rs index 5d4b06825dd06ba8555f317f554e224e3f661d6e..a061e68766c683d52c11dc5befa7d8bfab2b6b2d 100644 --- a/lib/tools/dbs-tools/src/kv_db_old.rs +++ b/lib/tools/dbs-tools/src/kv_db_old.rs @@ -7,7 +7,7 @@ mod file; pub use file::MockKvFileDbReader; pub use file::{ from_db_value, KvFileDbHandler, KvFileDbRead, KvFileDbReader, KvFileDbRoHandler, - KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter, + KvFileDbSchema, KvFileDbStoreType, KvFileDbWriter, WriteResp, }; pub use rkv::{ store::multi::Iter, IntegerStore, MultiIntegerStore, MultiStore, diff --git a/lib/tools/dbs-tools/src/kv_db_old/file.rs b/lib/tools/dbs-tools/src/kv_db_old/file.rs index 24ba05bb9f85283b63b2b94e8cd9decb5eb05d5d..cd38a926bcf9a4c25ebe23fc7cf1e664e76d2901 100644 --- a/lib/tools/dbs-tools/src/kv_db_old/file.rs +++ b/lib/tools/dbs-tools/src/kv_db_old/file.rs @@ -410,18 +410,38 @@ impl KvFileDbHandler { } /// Write datas in database /// /!\ The written data are visible to readers but not persisted on the disk until a save() is performed. - pub fn write<F>(&self, f: F) -> Result<(), DbError> + pub fn write<D, F>(&self, f: F) -> Result<D, DbError> where - F: FnOnce(KvFileDbWriter) -> Result<KvFileDbWriter, DbError>, + F: FnOnce(KvFileDbWriter) -> Result<WriteResp<D>, DbError>, { f(KvFileDbWriter { buffer: Vec::with_capacity(0), writer: self.arc().read()?.write()?, })? - .writer - .commit()?; + .commit() + } +} - Ok(()) +/// Write transaction response +pub struct WriteResp<'w, D> { + writer: KvFileDbWriter<'w>, + datas: D, +} + +impl<'w, D> WriteResp<'w, D> { + fn commit(self) -> Result<D, DbError> { + self.writer.writer.commit()?; + Ok(self.datas) + } + /// Instantiate WriteResp + pub fn new(writer: KvFileDbWriter<'w>, datas: D) -> WriteResp<'w, D> { + WriteResp { writer, datas } + } +} + +impl<'w> From<KvFileDbWriter<'w>> for WriteResp<'w, ()> { + fn from(writer: KvFileDbWriter<'w>) -> WriteResp<'w, ()> { + WriteResp { writer, datas: () } } } @@ -456,7 +476,7 @@ mod tests { db.write(|mut w| { store_test1.put(w.as_mut(), 3, &Value::Str("toto"))?; - Ok(w) + Ok(WriteResp::from(w)) })?; let ro_db = KvFileDbRoHandler::open_db_ro(tmp_dir.path(), &schema)?; @@ -468,7 +488,7 @@ mod tests { db.write(|mut w| { store_test1.put(w.as_mut(), 3, &Value::Str("titi"))?; - Ok(w) + Ok(WriteResp::from(w)) })?; assert_eq!( @@ -482,7 +502,7 @@ mod tests { Some("titi".to_owned()), get_int_store_str_val(&ro_db, "test1", 3)? ); - Ok(w) + Ok(WriteResp::from(w)) })?; let db_path = tmp_dir.path().to_owned();