From 2919430e4fff2fecf5358e8c06723d13d68d8d9c Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 15 Nov 2016 18:01:33 +0300 Subject: [PATCH 1/2] process nonfatal db insert errors --- sync/src/synchronization_client.rs | 39 +++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/sync/src/synchronization_client.rs b/sync/src/synchronization_client.rs index ba6b3fd5..48877f03 100644 --- a/sync/src/synchronization_client.rs +++ b/sync/src/synchronization_client.rs @@ -18,7 +18,7 @@ use synchronization_peers::Peers; use synchronization_chain::{Chain, ChainRef, BlockState, HeadersIntersection}; #[cfg(test)] use synchronization_chain::{Information as ChainInformation}; -use verification::{ChainVerifier, Error as VerificationError, Verify}; +use verification::{ChainVerifier, Verify}; use synchronization_executor::{Task, TaskExecutor}; use synchronization_manager::{manage_synchronization_peers_blocks, manage_synchronization_peers_inventory, manage_unknown_orphaned_blocks, MANAGEMENT_INTERVAL_MS, ManagePeersConfig, ManageUnknownBlocksConfig}; @@ -192,7 +192,7 @@ pub trait Client : Send + 'static { fn on_peer_disconnected(&mut self, peer_index: usize); fn get_peers_nearly_blocks_waiter(&mut self, peer_index: usize) -> (bool, Option>); fn on_block_verification_success(&mut self, block: Block); - fn on_block_verification_error(&mut self, err: &VerificationError, hash: &H256); + fn on_block_verification_error(&mut self, err: &str, hash: &H256); } /// Synchronization peer blocks waiter @@ -208,7 +208,7 @@ pub struct PeersBlocksWaiter { pub struct Config { /// Number of threads to allocate in synchronization CpuPool. pub threads_num: usize, - /// Do not verify incoming blocks before inserting to db. +/// Do not verify incoming blocks before inserting to db. pub skip_verification: bool, } @@ -404,7 +404,7 @@ impl Client for SynchronizationClient where T: TaskExecutor { fn on_block_verification_success(&mut self, block: Block) { let hash = block.hash(); // insert block to the storage - { + match { let mut chain = self.chain.write(); // remove block from verification queue @@ -413,19 +413,30 @@ impl Client for SynchronizationClient where T: TaskExecutor { if chain.forget_with_state_leave_header(&hash, BlockState::Verifying) != HashPosition::Missing { // block was in verification queue => insert to storage chain.insert_best_block(hash.clone(), block) - .expect("Error inserting to db."); + } else { + Ok(()) + } + } { + Ok(_) => { + // awake threads, waiting for this block insertion + self.awake_waiting_threads(&hash); + + // continue with synchronization + self.execute_synchronization_tasks(None); + }, + Err(db::Error::Consistency(e)) => { + // process as verification error + self.on_block_verification_error(&format!("{:?}", db::Error::Consistency(e)), &hash); + }, + Err(e) => { + // process as irrecoverable failure + panic!("Block {:?} insertion failed with error {:?}", hash, e); } } - - // awake threads, waiting for this block insertion - self.awake_waiting_threads(&hash); - - // continue with synchronization - self.execute_synchronization_tasks(None); } /// Process failed block verification - fn on_block_verification_error(&mut self, err: &VerificationError, hash: &H256) { + fn on_block_verification_error(&mut self, err: &str, hash: &H256) { warn!(target: "sync", "Block {:?} verification failed with error {:?}", hash, err); { @@ -893,8 +904,8 @@ impl SynchronizationClient where T: TaskExecutor { Ok(_chain) => { sync.lock().on_block_verification_success(block) }, - Err(err) => { - sync.lock().on_block_verification_error(&err, &block.hash()) + Err(e) => { + sync.lock().on_block_verification_error(&format!("{:?}", e), &block.hash()) } } }, From cd61b461b23bd405f6062e2d3a063289f6574e61 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 15 Nov 2016 18:03:14 +0300 Subject: [PATCH 2/2] added TODO --- sync/src/synchronization_client.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sync/src/synchronization_client.rs b/sync/src/synchronization_client.rs index 48877f03..5128bcb4 100644 --- a/sync/src/synchronization_client.rs +++ b/sync/src/synchronization_client.rs @@ -1403,4 +1403,9 @@ pub mod tests { assert_eq!(tasks, vec![Task::RequestBlocks(2, vec![block1.hash()])]); } } + + #[test] + fn sync_after_db_insert_nonfatal_fail() { + // TODO: implement me + } }