Stop downloading unnecessary blocks in Zebra acceptance tests (#3072)

* Implement graceful shutdown for the peer set

* Use the minimum lookahead limit in acceptance tests

* Enable a doctest that compiles with newly public modules
This commit is contained in:
teor 2021-11-19 11:55:38 +10:00 committed by GitHub
parent 9b17bbce3d
commit 375a997d2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 66 additions and 13 deletions

View File

@ -6,10 +6,14 @@
//! don't fit the async context well. //! don't fit the async context well.
mod inbound; mod inbound;
#[allow(missing_docs)]
pub mod mempool; pub mod mempool;
pub mod metrics; pub mod metrics;
#[allow(missing_docs)]
pub mod sync; pub mod sync;
#[allow(missing_docs)]
pub mod tokio; pub mod tokio;
#[allow(missing_docs)]
pub mod tracing; pub mod tracing;
pub use inbound::Inbound; pub use inbound::Inbound;

View File

@ -1,3 +1,10 @@
//! The inbound service handles requests from Zebra's peers.
//!
//! It downloads and verifies gossiped blocks and mempool transactions,
//! when Zebra is close to the chain tip.
//!
//! It also responds to peer requests for blocks, transactions, and peer addresses.
use std::{ use std::{
future::Future, future::Future,
pin::Pin, pin::Pin,
@ -128,6 +135,10 @@ pub struct Inbound {
} }
impl Inbound { impl Inbound {
/// Create a new inbound service.
///
/// The address book and peer set use the newly created inbound service.
/// So they are sent via the `network_setup` channel after initialization.
pub fn new( pub fn new(
network_setup: oneshot::Receiver<NetworkSetupData>, network_setup: oneshot::Receiver<NetworkSetupData>,
state: State, state: State,

View File

@ -42,7 +42,7 @@ use zebra_state::{ChainTipChange, TipAction};
use crate::components::sync::SyncStatus; use crate::components::sync::SyncStatus;
mod config; pub mod config;
mod crawler; mod crawler;
pub mod downloads; pub mod downloads;
mod error; mod error;

View File

@ -13,7 +13,7 @@
//! //!
//! # Example //! # Example
//! //!
//! ```compile_fail //! ```
//! use zebrad::components::mempool; //! use zebrad::components::mempool;
//! # //! #
//! # use zebra_chain::parameters::Network; //! # use zebra_chain::parameters::Network;

View File

@ -1,3 +1,7 @@
//! The syncer downloads and verifies large numbers of blocks from peers to Zebra.
//!
//! It is used when Zebra is a long way behind the current chain tip.
use std::{collections::HashSet, pin::Pin, sync::Arc, time::Duration}; use std::{collections::HashSet, pin::Pin, sync::Arc, time::Duration};
use color_eyre::eyre::{eyre, Report}; use color_eyre::eyre::{eyre, Report};
@ -69,7 +73,12 @@ const BLOCK_DOWNLOAD_RETRY_LIMIT: usize = 2;
/// Once these malicious blocks start failing validation, the syncer will cancel all /// Once these malicious blocks start failing validation, the syncer will cancel all
/// the pending download and verify tasks, drop all the blocks, and start a new /// the pending download and verify tasks, drop all the blocks, and start a new
/// ObtainTips with a new set of peers. /// ObtainTips with a new set of peers.
const MIN_LOOKAHEAD_LIMIT: usize = zebra_consensus::MAX_CHECKPOINT_HEIGHT_GAP * 2; pub const MIN_LOOKAHEAD_LIMIT: usize = zebra_consensus::MAX_CHECKPOINT_HEIGHT_GAP * 2;
/// The default for the user-specified lookahead limit.
///
/// See [`MIN_LOOKAHEAD_LIMIT`] for details.
pub const DEFAULT_LOOKAHEAD_LIMIT: usize = zebra_consensus::MAX_CHECKPOINT_HEIGHT_GAP * 5;
/// Controls how long we wait for a tips response to return. /// Controls how long we wait for a tips response to return.
/// ///

View File

@ -1,3 +1,5 @@
//! Tracing and logging infrastructure for Zebra.
mod component; mod component;
mod endpoint; mod endpoint;
mod flame; mod flame;

View File

@ -8,11 +8,12 @@ use std::{net::SocketAddr, path::PathBuf};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::components::mempool::Config as MempoolSection;
use zebra_consensus::Config as ConsensusSection; use zebra_consensus::Config as ConsensusSection;
use zebra_network::Config as NetworkSection; use zebra_network::Config as NetworkSection;
use zebra_state::Config as StateSection; use zebra_state::Config as StateSection;
use crate::components::{mempool::Config as MempoolSection, sync};
/// Configuration for `zebrad`. /// Configuration for `zebrad`.
/// ///
/// The `zebrad` config is a TOML-encoded version of this structure. The meaning /// The `zebrad` config is a TOML-encoded version of this structure. The meaning
@ -180,7 +181,7 @@ impl Default for SyncSection {
fn default() -> Self { fn default() -> Self {
Self { Self {
max_concurrent_block_requests: 50, max_concurrent_block_requests: 50,
lookahead_limit: 2_000, lookahead_limit: sync::DEFAULT_LOOKAHEAD_LIMIT,
} }
} }
} }

View File

@ -36,11 +36,10 @@ extern crate tracing;
/// parameterized by 'a), *not* that the object itself has 'static lifetime. /// parameterized by 'a), *not* that the object itself has 'static lifetime.
pub type BoxError = Box<dyn std::error::Error + Send + Sync + 'static>; pub type BoxError = Box<dyn std::error::Error + Send + Sync + 'static>;
mod components;
pub mod application; pub mod application;
pub mod async_ext; pub mod async_ext;
pub mod commands; pub mod commands;
pub mod components;
pub mod config; pub mod config;
pub mod prelude; pub mod prelude;
pub mod sentry; pub mod sentry;

View File

@ -46,7 +46,10 @@ use zebra_test::{
net::random_known_port, net::random_known_port,
prelude::*, prelude::*,
}; };
use zebrad::config::ZebradConfig; use zebrad::{
components::{mempool, sync},
config::{SyncSection, ZebradConfig},
};
/// The amount of time we wait after launching `zebrad`. /// The amount of time we wait after launching `zebrad`.
/// ///
@ -54,18 +57,41 @@ use zebrad::config::ZebradConfig;
/// metrics or tracing test failures in Windows CI. /// metrics or tracing test failures in Windows CI.
const LAUNCH_DELAY: Duration = Duration::from_secs(10); const LAUNCH_DELAY: Duration = Duration::from_secs(10);
/// Returns a config with:
/// - a Zcash listener on an unused port on IPv4 localhost, and
/// - an ephemeral state,
/// - the minimum syncer lookahead limit, and
/// - shorter task intervals, to improve test coverage.
fn default_test_config() -> Result<ZebradConfig> { fn default_test_config() -> Result<ZebradConfig> {
let auto_port_ipv4_local = zebra_network::Config { const TEST_DURATION: Duration = Duration::from_secs(30);
let network = zebra_network::Config {
// The OS automatically chooses an unused port.
listen_addr: "127.0.0.1:0".parse()?, listen_addr: "127.0.0.1:0".parse()?,
crawl_new_peer_interval: Duration::from_secs(30), crawl_new_peer_interval: TEST_DURATION,
..zebra_network::Config::default() ..zebra_network::Config::default()
}; };
let local_ephemeral = ZebradConfig {
let sync = SyncSection {
// Avoid downloading unnecessary blocks.
lookahead_limit: sync::MIN_LOOKAHEAD_LIMIT,
..SyncSection::default()
};
let mempool = mempool::Config {
eviction_memory_time: TEST_DURATION,
..mempool::Config::default()
};
let config = ZebradConfig {
network,
state: zebra_state::Config::ephemeral(), state: zebra_state::Config::ephemeral(),
network: auto_port_ipv4_local, sync,
mempool,
..ZebradConfig::default() ..ZebradConfig::default()
}; };
Ok(local_ephemeral)
Ok(config)
} }
fn persistent_test_config() -> Result<ZebradConfig> { fn persistent_test_config() -> Result<ZebradConfig> {
@ -949,6 +975,7 @@ fn sync_until(
fn cached_mandatory_checkpoint_test_config() -> Result<ZebradConfig> { fn cached_mandatory_checkpoint_test_config() -> Result<ZebradConfig> {
let mut config = persistent_test_config()?; let mut config = persistent_test_config()?;
config.state.cache_dir = "/zebrad-cache".into(); config.state.cache_dir = "/zebrad-cache".into();
config.sync.lookahead_limit = sync::DEFAULT_LOOKAHEAD_LIMIT;
Ok(config) Ok(config)
} }