share one chain verifier

This commit is contained in:
debris 2016-12-05 15:15:28 +01:00
parent 36db70eb86
commit 2409eb293c
3 changed files with 12 additions and 14 deletions

View File

@ -47,6 +47,7 @@ use std::sync::Arc;
use parking_lot::RwLock;
use tokio_core::reactor::Handle;
use network::Magic;
use verification::ChainVerifier;
/// Sync errors.
#[derive(Debug)]
@ -81,11 +82,12 @@ pub fn create_sync_connection_factory(handle: &Handle, network: Magic, db: db::S
threads_num: 4,
};
let sync_chain = Arc::new(RwLock::new(SyncChain::new(db)));
let sync_chain = Arc::new(RwLock::new(SyncChain::new(db.clone())));
let chain_verifier = Arc::new(ChainVerifier::new(db, network));
let sync_executor = SyncExecutor::new(sync_chain.clone());
let sync_server = Arc::new(SynchronizationServer::new(sync_chain.clone(), sync_executor.clone()));
let sync_client_core = SynchronizationClientCore::new(sync_client_config, handle, sync_executor.clone(), sync_chain.clone(), network);
let verifier = AsyncVerifier::new(network, sync_chain, sync_client_core.clone());
let sync_client_core = SynchronizationClientCore::new(sync_client_config, handle, sync_executor.clone(), sync_chain.clone(), chain_verifier.clone());
let verifier = AsyncVerifier::new(chain_verifier, sync_chain, sync_client_core.clone());
let sync_client = SynchronizationClient::new(sync_client_core, verifier);
let sync_node = Arc::new(SyncNode::new(sync_server, sync_client, sync_executor));
SyncConnectionFactory::with_local_node(sync_node)

View File

@ -30,7 +30,6 @@ use compact_block_builder::build_compact_block;
use hash_queue::HashPosition;
use miner::transaction_fee_rate;
use verification::ChainVerifier;
use network::Magic;
use time;
use std::time::Duration;
@ -298,8 +297,8 @@ pub struct SynchronizationClientCore<T: TaskExecutor> {
orphaned_blocks_pool: OrphanBlocksPool,
/// Orphaned transactions pool.
orphaned_transactions_pool: OrphanTransactionsPool,
/// Network config
network: Magic,
/// Chain verifier
chain_verifier: Arc<ChainVerifier>,
/// Verify block headers?
verify_headers: bool,
/// Verifying blocks by peer
@ -655,7 +654,6 @@ impl<T> ClientCore for SynchronizationClientCore<T> where T: TaskExecutor {
// validate blocks headers before scheduling
let chain = self.chain.read();
let verifier = ChainVerifier::new(chain.storage(), self.network);
let mut block_header_provider = MessageBlockHeadersProvider::new(&*chain);
let mut blocks_hashes: Vec<H256> = Vec::with_capacity(blocks_headers.len());
let mut prev_block_hash = header0.previous_header_hash.clone();
@ -669,7 +667,7 @@ impl<T> ClientCore for SynchronizationClientCore<T> where T: TaskExecutor {
// verify header
if self.verify_headers {
if let Err(error) = verifier.verify_block_header(&block_header_provider, &block_header_hash, &block_header) {
if let Err(error) = self.chain_verifier.verify_block_header(&block_header_provider, &block_header_hash, &block_header) {
warn!(target: "sync", "Error verifying header {:?} from peer#{} `headers` message: {:?}", block_header_hash.to_reversed_str(), peer_index, error);
return;
}
@ -1088,7 +1086,7 @@ impl<T> VerificationSink for SynchronizationClientCore<T> where T: TaskExecutor
impl<T> SynchronizationClientCore<T> where T: TaskExecutor {
/// Create new synchronization client core
pub fn new(config: Config, handle: &Handle, executor: Arc<Mutex<T>>, chain: ChainRef, network: Magic) -> Arc<Mutex<Self>> {
pub fn new(config: Config, handle: &Handle, executor: Arc<Mutex<T>>, chain: ChainRef, chain_verifier: Arc<ChainVerifier>) -> Arc<Mutex<Self>> {
let sync = Arc::new(Mutex::new(
SynchronizationClientCore {
state: State::Saturated,
@ -1099,7 +1097,7 @@ impl<T> SynchronizationClientCore<T> where T: TaskExecutor {
chain: chain.clone(),
orphaned_blocks_pool: OrphanBlocksPool::new(),
orphaned_transactions_pool: OrphanTransactionsPool::new(),
network: network,
chain_verifier: chain_verifier,
verify_headers: true,
verifying_blocks_by_peer: HashMap::new(),
verifying_blocks_futures: HashMap::new(),
@ -1683,7 +1681,6 @@ pub mod tests {
use synchronization_verifier::tests::DummyVerifier;
use synchronization_server::ServerTaskIndex;
use primitives::hash::H256;
use network::Magic;
use p2p::event_loop;
use test_data;
use db::{self, BlockHeaderProvider};

View File

@ -60,9 +60,8 @@ struct EmptyTransactionOutputProvider {
impl AsyncVerifier {
/// Create new async verifier
pub fn new<T: VerificationSink>(network: Magic, chain: ChainRef, sink: Arc<Mutex<T>>) -> Self {
pub fn new<T: VerificationSink>(verifier: Arc<ChainVerifier>, chain: ChainRef, sink: Arc<Mutex<T>>) -> Self {
let (verification_work_sender, verification_work_receiver) = channel();
let verifier = ChainVerifier::new(chain.read().storage(), network);
AsyncVerifier {
verification_work_sender: verification_work_sender,
verification_worker_thread: Some(thread::Builder::new()
@ -75,7 +74,7 @@ impl AsyncVerifier {
}
/// Thread procedure for handling verification tasks
fn verification_worker_proc<T: VerificationSink>(sink: Arc<Mutex<T>>, chain: ChainRef, verifier: ChainVerifier, work_receiver: Receiver<VerificationTask>) {
fn verification_worker_proc<T: VerificationSink>(sink: Arc<Mutex<T>>, chain: ChainRef, verifier: Arc<ChainVerifier>, work_receiver: Receiver<VerificationTask>) {
while let Ok(task) = work_receiver.recv() {
match task {
VerificationTask::Stop => break,