From d98d18ef09062ae3f375777f2840b991d6a3a27a Mon Sep 17 00:00:00 2001 From: librelois <elois@ifee.fr> Date: Mon, 3 Feb 2020 01:20:29 +0100 Subject: [PATCH] [ref] db-tools: write transactions must be able to return datas --- .../bc-db-reader/src/indexes/identities.rs | 4 +-- lib/modules-lib/bc-db-reader/src/lib.rs | 2 +- .../bc-db-writer/src/indexes/transactions.rs | 6 ++-- .../blockchain/bc-db-writer/src/lib.rs | 2 +- .../blockchain/src/dunp/receiver.rs | 2 +- .../blockchain/src/fork/fork_algo.rs | 6 ++-- .../blockchain/src/fork/rollback.rs | 2 +- .../blockchain/src/fork/stackable_blocks.rs | 9 +++-- .../src/sync/apply/blocks_worker.rs | 4 +-- .../blockchain/src/sync/apply/mod.rs | 4 +-- .../blockchain/src/sync/apply/txs_worker.rs | 2 +- .../blockchain/src/sync/apply/wot_worker.rs | 2 +- .../bc-db-tests-tools/src/mocks.rs | 6 ++-- lib/tools/dbs-tools/src/kv_db_old.rs | 2 +- lib/tools/dbs-tools/src/kv_db_old/file.rs | 36 ++++++++++++++----- 15 files changed, 56 insertions(+), 33 deletions(-) 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 3a8ef7e0..ca1d1172 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 7b63de38..143f4fe5 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 f6ac0313..260dc8b9 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 b48b1570..76dff17f 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 dc969299..0a9678ed 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 e7dd9f76..72984cdf 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 8b4cd210..e045220c 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 946afaed..b1ff85ad 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 4f009c35..ac7a7711 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 0d8b0f2b..46bfd528 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 52ae0b28..19cd2961 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 2cb3c86b..1cef4417 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 e5742c3b..1323d846 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 5d4b0682..a061e687 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 24ba05bb..cd38a926 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(); -- GitLab