From 957e12e4ca28438ca2c64ca4a1870210f2b3e9b7 Mon Sep 17 00:00:00 2001 From: Conrado Gouvea Date: Wed, 15 Sep 2021 19:13:29 -0300 Subject: [PATCH] Pass sync_status to mempool (#2754) * Pass sync_status to mempool * Update zebrad/src/components/mempool.rs Co-authored-by: Deirdre Connolly * Remove enabled flag for now; will be handled in #2723 Co-authored-by: Deirdre Connolly --- zebrad/src/commands/start.rs | 12 ++++++------ zebrad/src/components/inbound/tests.rs | 4 +++- zebrad/src/components/mempool.rs | 8 ++++++++ zebrad/src/components/mempool/tests.rs | 9 ++++++++- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/zebrad/src/commands/start.rs b/zebrad/src/commands/start.rs index 10de9abc2..f956ad5f3 100644 --- a/zebrad/src/commands/start.rs +++ b/zebrad/src/commands/start.rs @@ -85,12 +85,17 @@ impl StartCmd { let (peer_set, address_book) = zebra_network::init(config.network.clone(), inbound, latest_chain_tip).await; + info!("initializing syncer"); + let (syncer, sync_status) = + ChainSync::new(&config, peer_set.clone(), state.clone(), chain_verifier); + info!("initializing mempool"); let mempool_service = BoxService::new(Mempool::new( config.network.network, peer_set.clone(), - state.clone(), + state, tx_verifier, + sync_status.clone(), )); let mempool = ServiceBuilder::new().buffer(20).service(mempool_service); @@ -98,11 +103,6 @@ impl StartCmd { .send((peer_set.clone(), address_book, mempool)) .map_err(|_| eyre!("could not send setup data to inbound service"))?; - info!("initializing syncer"); - // TODO: use sync_status to activate the mempool (#2592) - let (syncer, sync_status) = - ChainSync::new(&config, peer_set.clone(), state, chain_verifier); - select! { result = syncer.sync().fuse() => result, _ = mempool::Crawler::spawn(peer_set, sync_status).fuse() => { diff --git a/zebrad/src/components/inbound/tests.rs b/zebrad/src/components/inbound/tests.rs index 6cfeec2d1..2c1b4b2b5 100644 --- a/zebrad/src/components/inbound/tests.rs +++ b/zebrad/src/components/inbound/tests.rs @@ -1,7 +1,7 @@ use std::{collections::HashSet, net::SocketAddr, str::FromStr, sync::Arc}; use super::mempool::{unmined_transactions_in_blocks, Mempool}; -use crate::components::tests::mock_peer_set; +use crate::components::{sync::SyncStatus, tests::mock_peer_set}; use tokio::sync::oneshot; use tower::{builder::ServiceBuilder, util::BoxService, ServiceExt}; @@ -23,6 +23,7 @@ async fn mempool_requests_for_transactions() { let (peer_set, _) = mock_peer_set(); let address_book = AddressBook::new(SocketAddr::from_str("0.0.0.0:0").unwrap(), Span::none()); let address_book = Arc::new(std::sync::Mutex::new(address_book)); + let (sync_status, _recent_syncs) = SyncStatus::new(); let (state, _, _) = zebra_state::init(state_config, network); let state_service = ServiceBuilder::new().buffer(1).service(state); @@ -36,6 +37,7 @@ async fn mempool_requests_for_transactions() { peer_set.clone(), state_service.clone(), transaction_verifier, + sync_status, ); let added_transactions = add_some_stuff_to_mempool(&mut mempool_service, network); diff --git a/zebrad/src/components/mempool.rs b/zebrad/src/components/mempool.rs index f2f2f2029..f6826d1b5 100644 --- a/zebrad/src/components/mempool.rs +++ b/zebrad/src/components/mempool.rs @@ -37,6 +37,8 @@ use self::downloads::{ Downloads as TxDownloads, Gossip, TRANSACTION_DOWNLOAD_TIMEOUT, TRANSACTION_VERIFY_TIMEOUT, }; +use super::sync::SyncStatus; + type Outbound = Buffer, zn::Request>; type State = Buffer, zs::Request>; type TxVerifier = Buffer< @@ -76,6 +78,10 @@ pub struct Mempool { /// The transaction dowload and verify stream. tx_downloads: Pin>, + + /// Allows checking if we are near the tip to enable/disable the mempool. + #[allow(dead_code)] + sync_status: SyncStatus, } impl Mempool { @@ -85,6 +91,7 @@ impl Mempool { outbound: Outbound, state: State, tx_verifier: TxVerifier, + sync_status: SyncStatus, ) -> Self { let tx_downloads = Box::pin(TxDownloads::new( Timeout::new(outbound, TRANSACTION_DOWNLOAD_TIMEOUT), @@ -94,6 +101,7 @@ impl Mempool { Mempool { storage: Default::default(), tx_downloads, + sync_status, } } diff --git a/zebrad/src/components/mempool/tests.rs b/zebrad/src/components/mempool/tests.rs index 3c3760f95..844eaf0e8 100644 --- a/zebrad/src/components/mempool/tests.rs +++ b/zebrad/src/components/mempool/tests.rs @@ -16,6 +16,7 @@ async fn mempool_service_basic() -> Result<(), Report> { let consensus_config = ConsensusConfig::default(); let state_config = StateConfig::ephemeral(); let (peer_set, _) = mock_peer_set(); + let (sync_status, _recent_syncs) = SyncStatus::new(); let (state, _, _) = zebra_state::init(state_config, network); let state_service = ServiceBuilder::new().buffer(1).service(state); @@ -26,7 +27,13 @@ async fn mempool_service_basic() -> Result<(), Report> { // get the genesis block transactions from the Zcash blockchain. let genesis_transactions = unmined_transactions_in_blocks(0, network); // Start the mempool service - let mut service = Mempool::new(network, peer_set, state_service.clone(), tx_verifier); + let mut service = Mempool::new( + network, + peer_set, + state_service.clone(), + tx_verifier, + sync_status, + ); // Insert the genesis block coinbase transaction into the mempool storage. service.storage.insert(genesis_transactions.1[0].clone())?;