mirror of
https://github.com/pezkuwichain/revive-differential-tests.git
synced 2026-04-25 11:37:59 +00:00
98b62d705f
* Generate schema for the metadata file * Groundwork for dyn traits * Make the ethereum node trait object compatible * Allow for compilers to be created in the dyn trait * Add more identifiers to the platform * Implement the dyn compiler trait for compilers * Support the dyn compiler in the builder pattern * Introduce a geth platform * Provide a common node implementation for substrate chains * Add all of the platforms that we support * Add a way to convert platform identifier into a platform * Replace infra with the dyn infra * Remoe all references to leader and follower * Remove the old traits * Remove an un-needed dependency * Update the default values for the platforms * Final set of renames * Update the default values of the cli * Update tests
53 lines
1.8 KiB
Rust
53 lines
1.8 KiB
Rust
//! This crate implements concurrent handling of testing node.
|
|
|
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
|
|
|
use anyhow::Context as _;
|
|
use revive_dt_config::*;
|
|
use revive_dt_core::Platform;
|
|
use revive_dt_node_interaction::EthereumNode;
|
|
|
|
/// The node pool starts one or more [Node] which then can be accessed
|
|
/// in a round robbin fashion.
|
|
pub struct NodePool {
|
|
next: AtomicUsize,
|
|
nodes: Vec<Box<dyn EthereumNode + Send + Sync>>,
|
|
}
|
|
|
|
impl NodePool {
|
|
/// Create a new Pool. This will start as many nodes as there are workers in `config`.
|
|
pub fn new(context: Context, platform: &dyn Platform) -> anyhow::Result<Self> {
|
|
let concurrency_configuration = AsRef::<ConcurrencyConfiguration>::as_ref(&context);
|
|
let nodes = concurrency_configuration.number_of_nodes;
|
|
|
|
let mut handles = Vec::with_capacity(nodes);
|
|
for _ in 0..nodes {
|
|
let context = context.clone();
|
|
handles.push(platform.new_node(context)?);
|
|
}
|
|
|
|
let mut nodes = Vec::with_capacity(nodes);
|
|
for handle in handles {
|
|
nodes.push(
|
|
handle
|
|
.join()
|
|
.map_err(|error| anyhow::anyhow!("failed to spawn node: {:?}", error))
|
|
.context("Failed to join node spawn thread")?
|
|
.map_err(|error| anyhow::anyhow!("node failed to spawn: {error}"))
|
|
.context("Node failed to spawn")?,
|
|
);
|
|
}
|
|
|
|
Ok(Self {
|
|
nodes,
|
|
next: Default::default(),
|
|
})
|
|
}
|
|
|
|
/// Get a handle to the next node.
|
|
pub fn round_robbin(&self) -> &dyn EthereumNode {
|
|
let current = self.next.fetch_add(1, Ordering::SeqCst) % self.nodes.len();
|
|
self.nodes.get(current).unwrap().as_ref()
|
|
}
|
|
}
|