Release builds for local cluster tests (#5891)
* Release builds for test * Remove setting thread count in local cluster * Increase timeout * Move local cluster to separate job * Extract out local cluster test from bench-tps * Make local cluster inaccessible from outside crate * Update test-stable.sh to exclude local_cluster in stable, include it in local-cluster CI job * Move bench-exchange to local cluster * Remove local cluster from coverage
This commit is contained in:
parent
b757294864
commit
86213d38fe
|
@ -2837,7 +2837,6 @@ dependencies = [
|
||||||
"solana-exchange-api 0.19.0-pre0",
|
"solana-exchange-api 0.19.0-pre0",
|
||||||
"solana-exchange-program 0.19.0-pre0",
|
"solana-exchange-program 0.19.0-pre0",
|
||||||
"solana-genesis 0.19.0-pre0",
|
"solana-genesis 0.19.0-pre0",
|
||||||
"solana-local-cluster 0.19.0-pre0",
|
|
||||||
"solana-logger 0.19.0-pre0",
|
"solana-logger 0.19.0-pre0",
|
||||||
"solana-metrics 0.19.0-pre0",
|
"solana-metrics 0.19.0-pre0",
|
||||||
"solana-netutil 0.19.0-pre0",
|
"solana-netutil 0.19.0-pre0",
|
||||||
|
@ -2876,7 +2875,6 @@ dependencies = [
|
||||||
"solana-drone 0.19.0-pre0",
|
"solana-drone 0.19.0-pre0",
|
||||||
"solana-genesis 0.19.0-pre0",
|
"solana-genesis 0.19.0-pre0",
|
||||||
"solana-librapay-api 0.19.0-pre0",
|
"solana-librapay-api 0.19.0-pre0",
|
||||||
"solana-local-cluster 0.19.0-pre0",
|
|
||||||
"solana-logger 0.19.0-pre0",
|
"solana-logger 0.19.0-pre0",
|
||||||
"solana-measure 0.19.0-pre0",
|
"solana-measure 0.19.0-pre0",
|
||||||
"solana-metrics 0.19.0-pre0",
|
"solana-metrics 0.19.0-pre0",
|
||||||
|
@ -3388,9 +3386,16 @@ dependencies = [
|
||||||
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serial_test 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serial_test 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serial_test_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serial_test_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"solana-bench-exchange 0.19.0-pre0",
|
||||||
|
"solana-bench-tps 0.19.0-pre0",
|
||||||
"solana-client 0.19.0-pre0",
|
"solana-client 0.19.0-pre0",
|
||||||
"solana-core 0.19.0-pre0",
|
"solana-core 0.19.0-pre0",
|
||||||
|
"solana-drone 0.19.0-pre0",
|
||||||
|
"solana-exchange-api 0.19.0-pre0",
|
||||||
|
"solana-exchange-program 0.19.0-pre0",
|
||||||
"solana-logger 0.19.0-pre0",
|
"solana-logger 0.19.0-pre0",
|
||||||
|
"solana-move-loader-api 0.19.0-pre0",
|
||||||
|
"solana-move-loader-program 0.19.0-pre0",
|
||||||
"solana-rayon-threadlimit 0.19.0-pre0",
|
"solana-rayon-threadlimit 0.19.0-pre0",
|
||||||
"solana-runtime 0.19.0-pre0",
|
"solana-runtime 0.19.0-pre0",
|
||||||
"solana-sdk 0.19.0-pre0",
|
"solana-sdk 0.19.0-pre0",
|
||||||
|
|
|
@ -26,7 +26,6 @@ serde_yaml = "0.8.9"
|
||||||
# solana-runtime = { path = "../solana/runtime"}
|
# solana-runtime = { path = "../solana/runtime"}
|
||||||
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.19.0-pre0" }
|
solana-genesis = { path = "../genesis", version = "0.19.0-pre0" }
|
||||||
solana-local-cluster = { path = "../local_cluster", version = "0.19.0-pre0" }
|
|
||||||
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
||||||
solana-drone = { path = "../drone", version = "0.19.0-pre0" }
|
solana-drone = { path = "../drone", version = "0.19.0-pre0" }
|
||||||
solana-exchange-api = { path = "../programs/exchange_api", version = "0.19.0-pre0" }
|
solana-exchange-api = { path = "../programs/exchange_api", version = "0.19.0-pre0" }
|
||||||
|
|
|
@ -969,103 +969,3 @@ pub fn airdrop_lamports(client: &dyn Client, drone_addr: &SocketAddr, id: &Keypa
|
||||||
sleep(Duration::from_secs(2));
|
sleep(Duration::from_secs(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
|
||||||
use solana_core::validator::ValidatorConfig;
|
|
||||||
use solana_drone::drone::run_local_drone;
|
|
||||||
use solana_exchange_api::exchange_processor::process_instruction;
|
|
||||||
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use solana_runtime::bank::Bank;
|
|
||||||
use solana_runtime::bank_client::BankClient;
|
|
||||||
use solana_sdk::genesis_block::create_genesis_block;
|
|
||||||
use std::sync::mpsc::channel;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_exchange_local_cluster() {
|
|
||||||
solana_logger::setup();
|
|
||||||
|
|
||||||
const NUM_NODES: usize = 1;
|
|
||||||
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.identity = Keypair::new();
|
|
||||||
config.duration = Duration::from_secs(1);
|
|
||||||
config.fund_amount = 100_000;
|
|
||||||
config.threads = 1;
|
|
||||||
config.transfer_delay = 20; // 15
|
|
||||||
config.batch_size = 100; // 1000;
|
|
||||||
config.chunk_size = 10; // 200;
|
|
||||||
config.account_groups = 1; // 10;
|
|
||||||
let Config {
|
|
||||||
fund_amount,
|
|
||||||
batch_size,
|
|
||||||
account_groups,
|
|
||||||
..
|
|
||||||
} = config;
|
|
||||||
let accounts_in_groups = batch_size * account_groups;
|
|
||||||
|
|
||||||
let cluster = LocalCluster::new(&ClusterConfig {
|
|
||||||
node_stakes: vec![100_000; NUM_NODES],
|
|
||||||
cluster_lamports: 100_000_000_000_000,
|
|
||||||
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
|
||||||
native_instruction_processors: [solana_exchange_program!()].to_vec(),
|
|
||||||
..ClusterConfig::default()
|
|
||||||
});
|
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
|
||||||
cluster.transfer(
|
|
||||||
&cluster.funding_keypair,
|
|
||||||
&drone_keypair.pubkey(),
|
|
||||||
2_000_000_000_000,
|
|
||||||
);
|
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
|
||||||
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
|
||||||
|
|
||||||
info!("Connecting to the cluster");
|
|
||||||
let (nodes, _) = discover_cluster(&cluster.entry_point_info.gossip, NUM_NODES)
|
|
||||||
.unwrap_or_else(|err| {
|
|
||||||
error!("Failed to discover {} nodes: {:?}", NUM_NODES, err);
|
|
||||||
exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
let (client, num_clients) = get_multi_client(&nodes);
|
|
||||||
|
|
||||||
info!("clients: {}", num_clients);
|
|
||||||
assert!(num_clients >= NUM_NODES);
|
|
||||||
|
|
||||||
const NUM_SIGNERS: u64 = 2;
|
|
||||||
airdrop_lamports(
|
|
||||||
&client,
|
|
||||||
&drone_addr,
|
|
||||||
&config.identity,
|
|
||||||
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
|
||||||
);
|
|
||||||
|
|
||||||
do_bench_exchange(vec![client], config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_exchange_bank_client() {
|
|
||||||
solana_logger::setup();
|
|
||||||
let (genesis_block, identity) = create_genesis_block(100_000_000_000_000);
|
|
||||||
let mut bank = Bank::new(&genesis_block);
|
|
||||||
bank.add_instruction_processor(id(), process_instruction);
|
|
||||||
let clients = vec![BankClient::new(bank)];
|
|
||||||
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.identity = identity;
|
|
||||||
config.duration = Duration::from_secs(1);
|
|
||||||
config.fund_amount = 100_000;
|
|
||||||
config.threads = 1;
|
|
||||||
config.transfer_delay = 20; // 0;
|
|
||||||
config.batch_size = 100; // 1500;
|
|
||||||
config.chunk_size = 10; // 1500;
|
|
||||||
config.account_groups = 1; // 50;
|
|
||||||
|
|
||||||
do_bench_exchange(clients, config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
pub mod bench;
|
||||||
|
pub mod cli;
|
||||||
|
mod order_book;
|
|
@ -2,10 +2,6 @@ pub mod bench;
|
||||||
mod cli;
|
mod cli;
|
||||||
pub mod order_book;
|
pub mod order_book;
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
#[macro_use]
|
|
||||||
extern crate solana_exchange_program;
|
|
||||||
|
|
||||||
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
use crate::bench::{airdrop_lamports, create_client_accounts_file, do_bench_exchange, Config};
|
||||||
use log::*;
|
use log::*;
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
|
|
|
@ -18,7 +18,6 @@ serde_json = "1.0.40"
|
||||||
serde_yaml = "0.8.9"
|
serde_yaml = "0.8.9"
|
||||||
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
||||||
solana-genesis = { path = "../genesis", version = "0.19.0-pre0" }
|
solana-genesis = { path = "../genesis", version = "0.19.0-pre0" }
|
||||||
solana-local-cluster = { path = "../local_cluster", version = "0.19.0-pre0" }
|
|
||||||
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
||||||
solana-drone = { path = "../drone", version = "0.19.0-pre0" }
|
solana-drone = { path = "../drone", version = "0.19.0-pre0" }
|
||||||
solana-librapay-api = { path = "../programs/librapay_api", version = "0.19.0-pre0" }
|
solana-librapay-api = { path = "../programs/librapay_api", version = "0.19.0-pre0" }
|
||||||
|
|
|
@ -931,20 +931,12 @@ pub fn generate_and_fund_keypairs<T: Client>(
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use serial_test_derive::serial;
|
|
||||||
use solana_client::thin_client::create_client;
|
|
||||||
use solana_core::cluster_info::FULLNODE_PORT_RANGE;
|
|
||||||
use solana_core::validator::ValidatorConfig;
|
|
||||||
use solana_drone::drone::run_local_drone;
|
|
||||||
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::bank::Bank;
|
||||||
use solana_runtime::bank_client::BankClient;
|
use solana_runtime::bank_client::BankClient;
|
||||||
use solana_sdk::client::SyncClient;
|
use solana_sdk::client::SyncClient;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
use solana_sdk::genesis_block::create_genesis_block;
|
use solana_sdk::genesis_block::create_genesis_block;
|
||||||
use std::sync::mpsc::channel;
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_switch_directions() {
|
fn test_switch_directions() {
|
||||||
|
@ -961,70 +953,6 @@ mod tests {
|
||||||
assert_eq!(should_switch_directions(20, 101), false);
|
assert_eq!(should_switch_directions(20, 101), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_bench_tps_local_cluster(config: Config) {
|
|
||||||
solana_logger::setup();
|
|
||||||
const NUM_NODES: usize = 1;
|
|
||||||
let cluster = LocalCluster::new(&ClusterConfig {
|
|
||||||
node_stakes: vec![999_990; NUM_NODES],
|
|
||||||
cluster_lamports: 200_000_000,
|
|
||||||
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
|
||||||
native_instruction_processors: vec![solana_move_loader_program!()],
|
|
||||||
..ClusterConfig::default()
|
|
||||||
});
|
|
||||||
|
|
||||||
let drone_keypair = Keypair::new();
|
|
||||||
cluster.transfer(
|
|
||||||
&cluster.funding_keypair,
|
|
||||||
&drone_keypair.pubkey(),
|
|
||||||
100_000_000,
|
|
||||||
);
|
|
||||||
|
|
||||||
let client = create_client(
|
|
||||||
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
|
||||||
FULLNODE_PORT_RANGE,
|
|
||||||
);
|
|
||||||
|
|
||||||
let (addr_sender, addr_receiver) = channel();
|
|
||||||
run_local_drone(drone_keypair, addr_sender, None);
|
|
||||||
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
|
||||||
|
|
||||||
let lamports_per_account = 100;
|
|
||||||
|
|
||||||
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
|
||||||
&client,
|
|
||||||
Some(drone_addr),
|
|
||||||
&config.id,
|
|
||||||
config.tx_count,
|
|
||||||
lamports_per_account,
|
|
||||||
config.use_move,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
|
||||||
assert!(total > 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[serial]
|
|
||||||
fn test_bench_tps_local_cluster_solana() {
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.tx_count = 100;
|
|
||||||
config.duration = Duration::from_secs(10);
|
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
#[serial]
|
|
||||||
fn test_bench_tps_local_cluster_move() {
|
|
||||||
let mut config = Config::default();
|
|
||||||
config.tx_count = 100;
|
|
||||||
config.duration = Duration::from_secs(20);
|
|
||||||
config.use_move = true;
|
|
||||||
|
|
||||||
test_bench_tps_local_cluster(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_bench_tps_bank_client() {
|
fn test_bench_tps_bank_client() {
|
||||||
let (genesis_block, id) = create_genesis_block(10_000);
|
let (genesis_block, id) = create_genesis_block(10_000);
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
pub mod bench;
|
||||||
|
pub mod cli;
|
|
@ -1,11 +1,5 @@
|
||||||
#[cfg(test)]
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
||||||
#[macro_use]
|
use solana_bench_tps::cli;
|
||||||
extern crate solana_move_loader_program;
|
|
||||||
|
|
||||||
mod bench;
|
|
||||||
mod cli;
|
|
||||||
|
|
||||||
use crate::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
|
|
||||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
use solana_genesis::PrimordialAccountDetails;
|
use solana_genesis::PrimordialAccountDetails;
|
||||||
use solana_sdk::fee_calculator::FeeCalculator;
|
use solana_sdk::fee_calculator::FeeCalculator;
|
||||||
|
|
|
@ -22,6 +22,10 @@ steps:
|
||||||
name: "stable"
|
name: "stable"
|
||||||
timeout_in_minutes: 40
|
timeout_in_minutes: 40
|
||||||
artifact_paths: "log-*.txt"
|
artifact_paths: "log-*.txt"
|
||||||
|
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_stable_docker_image ci/test-local-cluster.sh"
|
||||||
|
name: "local-cluster"
|
||||||
|
timeout_in_minutes: 40
|
||||||
|
artifact_paths: "log-*.txt"
|
||||||
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh"
|
- command: ". ci/rust-version.sh; ci/docker-run.sh $$rust_nightly_docker_image ci/test-coverage.sh"
|
||||||
name: "coverage"
|
name: "coverage"
|
||||||
timeout_in_minutes: 40
|
timeout_in_minutes: 40
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
test-stable.sh
|
|
@ -33,7 +33,7 @@ test-stable)
|
||||||
echo "Executing $testName"
|
echo "Executing $testName"
|
||||||
|
|
||||||
_ cargo +"$rust_stable" build --all --tests --bins ${V:+--verbose}
|
_ cargo +"$rust_stable" build --all --tests --bins ${V:+--verbose}
|
||||||
_ cargo +"$rust_stable" test --all ${V:+--verbose} -- --nocapture
|
_ cargo +"$rust_stable" test --all --exclude solana-local-cluster ${V:+--verbose} --features="$ROOT_FEATURES" -- --nocapture
|
||||||
;;
|
;;
|
||||||
test-stable-perf)
|
test-stable-perf)
|
||||||
echo "Executing $testName"
|
echo "Executing $testName"
|
||||||
|
@ -44,6 +44,7 @@ test-stable-perf)
|
||||||
Cargo.toml$ \
|
Cargo.toml$ \
|
||||||
^ci/test-stable-perf.sh \
|
^ci/test-stable-perf.sh \
|
||||||
^ci/test-stable.sh \
|
^ci/test-stable.sh \
|
||||||
|
^ci/test-local-cluster.sh \
|
||||||
^core/build.rs \
|
^core/build.rs \
|
||||||
^fetch-perf-libs.sh \
|
^fetch-perf-libs.sh \
|
||||||
^programs/ \
|
^programs/ \
|
||||||
|
@ -79,6 +80,12 @@ test-stable-perf)
|
||||||
_ cargo +"$rust_stable" build --all --tests --bins ${V:+--verbose} --features="$ROOT_FEATURES"
|
_ cargo +"$rust_stable" build --all --tests --bins ${V:+--verbose} --features="$ROOT_FEATURES"
|
||||||
_ cargo +"$rust_stable" test --manifest-path=core/Cargo.toml ${V:+--verbose} --features="$ROOT_FEATURES" -- --nocapture
|
_ cargo +"$rust_stable" test --manifest-path=core/Cargo.toml ${V:+--verbose} --features="$ROOT_FEATURES" -- --nocapture
|
||||||
;;
|
;;
|
||||||
|
test-local-cluster)
|
||||||
|
echo "Executing $testName"
|
||||||
|
_ cargo +"$rust_stable" build --all --release --tests --bins ${V:+--verbose}
|
||||||
|
_ cargo +"$rust_stable" test --release --manifest-path=local_cluster/Cargo.toml ${V:+--verbose} -- --nocapture
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Error: Unknown test: $testName"
|
echo "Error: Unknown test: $testName"
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -11,9 +11,16 @@ homepage = "https://solana.com/"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
rand = "0.6.5"
|
rand = "0.6.5"
|
||||||
|
solana-bench-exchange = { path = "../bench-exchange", version = "0.19.0-pre0" }
|
||||||
|
solana-bench-tps = { path = "../bench-tps", version = "0.19.0-pre0" }
|
||||||
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
solana-core = { path = "../core", version = "0.19.0-pre0" }
|
||||||
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
solana-client = { path = "../client", version = "0.19.0-pre0" }
|
||||||
|
solana-drone = { path = "../drone", version = "0.19.0-pre0" }
|
||||||
|
solana-exchange-api = { path = "../programs/exchange_api", version = "0.19.0-pre0" }
|
||||||
|
solana-exchange-program = { path = "../programs/exchange_program", version = "0.19.0-pre0" }
|
||||||
solana-logger = { path = "../logger", version = "0.19.0-pre0" }
|
solana-logger = { path = "../logger", version = "0.19.0-pre0" }
|
||||||
|
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.19.0-pre0" }
|
||||||
|
solana-move-loader-program = { path = "../programs/move_loader_program", version = "0.19.0-pre0" }
|
||||||
solana-runtime = { path = "../runtime", version = "0.19.0-pre0" }
|
solana-runtime = { path = "../runtime", version = "0.19.0-pre0" }
|
||||||
solana-sdk = { path = "../sdk", version = "0.19.0-pre0" }
|
solana-sdk = { path = "../sdk", version = "0.19.0-pre0" }
|
||||||
solana-stake-api = { path = "../programs/stake_api", version = "0.19.0-pre0" }
|
solana-stake-api = { path = "../programs/stake_api", version = "0.19.0-pre0" }
|
||||||
|
|
|
@ -1,14 +1,40 @@
|
||||||
pub mod cluster;
|
#[cfg(test)]
|
||||||
pub mod cluster_tests;
|
mod cluster;
|
||||||
pub mod local_cluster;
|
#[cfg(test)]
|
||||||
|
mod cluster_tests;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod local_cluster;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
#[cfg(test)]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate solana_bench_exchange;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate solana_bench_tps;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
#[cfg(test)]
|
||||||
extern crate solana_core;
|
extern crate solana_core;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate solana_drone;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate solana_exchange_program;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
#[cfg(test)]
|
||||||
|
extern crate solana_move_loader_program;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
#[cfg(test)]
|
||||||
extern crate solana_storage_program;
|
extern crate solana_storage_program;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
extern crate tempfile;
|
extern crate tempfile;
|
||||||
|
|
|
@ -10,7 +10,6 @@ use solana_core::{
|
||||||
service::Service,
|
service::Service,
|
||||||
validator::{Validator, ValidatorConfig},
|
validator::{Validator, ValidatorConfig},
|
||||||
};
|
};
|
||||||
use solana_rayon_threadlimit::set_thread_count;
|
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
client::SyncClient,
|
client::SyncClient,
|
||||||
clock::DEFAULT_TICKS_PER_SLOT,
|
clock::DEFAULT_TICKS_PER_SLOT,
|
||||||
|
@ -117,8 +116,6 @@ impl LocalCluster {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(config: &ClusterConfig) -> Self {
|
pub fn new(config: &ClusterConfig) -> Self {
|
||||||
set_thread_count(1);
|
|
||||||
|
|
||||||
assert_eq!(config.validator_configs.len(), config.node_stakes.len());
|
assert_eq!(config.validator_configs.len(), config.node_stakes.len());
|
||||||
let leader_keypair = Arc::new(Keypair::new());
|
let leader_keypair = Arc::new(Keypair::new());
|
||||||
let leader_pubkey = leader_keypair.pubkey();
|
let leader_pubkey = leader_keypair.pubkey();
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
mod bench_exchange;
|
||||||
|
mod bench_tps;
|
||||||
|
mod local_cluster;
|
||||||
|
mod replicator;
|
|
@ -0,0 +1,100 @@
|
||||||
|
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
|
use solana_bench_exchange::bench::{airdrop_lamports, do_bench_exchange, Config};
|
||||||
|
use solana_core::gossip_service::{discover_cluster, get_multi_client};
|
||||||
|
use solana_core::validator::ValidatorConfig;
|
||||||
|
use solana_drone::drone::run_local_drone;
|
||||||
|
use solana_exchange_api::exchange_processor::process_instruction;
|
||||||
|
use solana_exchange_api::id;
|
||||||
|
use solana_runtime::bank::Bank;
|
||||||
|
use solana_runtime::bank_client::BankClient;
|
||||||
|
use solana_sdk::genesis_block::create_genesis_block;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use std::process::exit;
|
||||||
|
use std::sync::mpsc::channel;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_exchange_local_cluster() {
|
||||||
|
solana_logger::setup();
|
||||||
|
|
||||||
|
const NUM_NODES: usize = 1;
|
||||||
|
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.identity = Keypair::new();
|
||||||
|
config.duration = Duration::from_secs(1);
|
||||||
|
config.fund_amount = 100_000;
|
||||||
|
config.threads = 1;
|
||||||
|
config.transfer_delay = 20; // 15
|
||||||
|
config.batch_size = 100; // 1000;
|
||||||
|
config.chunk_size = 10; // 200;
|
||||||
|
config.account_groups = 1; // 10;
|
||||||
|
let Config {
|
||||||
|
fund_amount,
|
||||||
|
batch_size,
|
||||||
|
account_groups,
|
||||||
|
..
|
||||||
|
} = config;
|
||||||
|
let accounts_in_groups = batch_size * account_groups;
|
||||||
|
|
||||||
|
let cluster = LocalCluster::new(&ClusterConfig {
|
||||||
|
node_stakes: vec![100_000; NUM_NODES],
|
||||||
|
cluster_lamports: 100_000_000_000_000,
|
||||||
|
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
||||||
|
native_instruction_processors: [solana_exchange_program!()].to_vec(),
|
||||||
|
..ClusterConfig::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
let drone_keypair = Keypair::new();
|
||||||
|
cluster.transfer(
|
||||||
|
&cluster.funding_keypair,
|
||||||
|
&drone_keypair.pubkey(),
|
||||||
|
2_000_000_000_000,
|
||||||
|
);
|
||||||
|
|
||||||
|
let (addr_sender, addr_receiver) = channel();
|
||||||
|
run_local_drone(drone_keypair, addr_sender, Some(1_000_000_000_000));
|
||||||
|
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
|
info!("Connecting to the cluster");
|
||||||
|
let (nodes, _) =
|
||||||
|
discover_cluster(&cluster.entry_point_info.gossip, NUM_NODES).unwrap_or_else(|err| {
|
||||||
|
error!("Failed to discover {} nodes: {:?}", NUM_NODES, err);
|
||||||
|
exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
let (client, num_clients) = get_multi_client(&nodes);
|
||||||
|
|
||||||
|
info!("clients: {}", num_clients);
|
||||||
|
assert!(num_clients >= NUM_NODES);
|
||||||
|
|
||||||
|
const NUM_SIGNERS: u64 = 2;
|
||||||
|
airdrop_lamports(
|
||||||
|
&client,
|
||||||
|
&drone_addr,
|
||||||
|
&config.identity,
|
||||||
|
fund_amount * (accounts_in_groups + 1) as u64 * NUM_SIGNERS,
|
||||||
|
);
|
||||||
|
|
||||||
|
do_bench_exchange(vec![client], config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_exchange_bank_client() {
|
||||||
|
solana_logger::setup();
|
||||||
|
let (genesis_block, identity) = create_genesis_block(100_000_000_000_000);
|
||||||
|
let mut bank = Bank::new(&genesis_block);
|
||||||
|
bank.add_instruction_processor(id(), process_instruction);
|
||||||
|
let clients = vec![BankClient::new(bank)];
|
||||||
|
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.identity = identity;
|
||||||
|
config.duration = Duration::from_secs(1);
|
||||||
|
config.fund_amount = 100_000;
|
||||||
|
config.threads = 1;
|
||||||
|
config.transfer_delay = 20; // 0;
|
||||||
|
config.batch_size = 100; // 1500;
|
||||||
|
config.chunk_size = 10; // 1500;
|
||||||
|
config.account_groups = 1; // 50;
|
||||||
|
|
||||||
|
do_bench_exchange(clients, config);
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
|
use serial_test_derive::serial;
|
||||||
|
use solana_bench_tps::bench::{do_bench_tps, generate_and_fund_keypairs};
|
||||||
|
use solana_bench_tps::cli::Config;
|
||||||
|
use solana_client::thin_client::create_client;
|
||||||
|
use solana_core::cluster_info::FULLNODE_PORT_RANGE;
|
||||||
|
use solana_core::validator::ValidatorConfig;
|
||||||
|
use solana_drone::drone::run_local_drone;
|
||||||
|
use solana_move_loader_program;
|
||||||
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
|
use std::sync::mpsc::channel;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
fn test_bench_tps_local_cluster(config: Config) {
|
||||||
|
solana_logger::setup();
|
||||||
|
const NUM_NODES: usize = 1;
|
||||||
|
let cluster = LocalCluster::new(&ClusterConfig {
|
||||||
|
node_stakes: vec![999_990; NUM_NODES],
|
||||||
|
cluster_lamports: 200_000_000,
|
||||||
|
validator_configs: vec![ValidatorConfig::default(); NUM_NODES],
|
||||||
|
native_instruction_processors: vec![solana_move_loader_program!()],
|
||||||
|
..ClusterConfig::default()
|
||||||
|
});
|
||||||
|
|
||||||
|
let drone_keypair = Keypair::new();
|
||||||
|
cluster.transfer(
|
||||||
|
&cluster.funding_keypair,
|
||||||
|
&drone_keypair.pubkey(),
|
||||||
|
100_000_000,
|
||||||
|
);
|
||||||
|
|
||||||
|
let client = create_client(
|
||||||
|
(cluster.entry_point_info.rpc, cluster.entry_point_info.tpu),
|
||||||
|
FULLNODE_PORT_RANGE,
|
||||||
|
);
|
||||||
|
|
||||||
|
let (addr_sender, addr_receiver) = channel();
|
||||||
|
run_local_drone(drone_keypair, addr_sender, None);
|
||||||
|
let drone_addr = addr_receiver.recv_timeout(Duration::from_secs(2)).unwrap();
|
||||||
|
|
||||||
|
let lamports_per_account = 100;
|
||||||
|
|
||||||
|
let (keypairs, move_keypairs, _keypair_balance) = generate_and_fund_keypairs(
|
||||||
|
&client,
|
||||||
|
Some(drone_addr),
|
||||||
|
&config.id,
|
||||||
|
config.tx_count,
|
||||||
|
lamports_per_account,
|
||||||
|
config.use_move,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let total = do_bench_tps(vec![client], config, keypairs, 0, move_keypairs);
|
||||||
|
assert!(total > 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn test_bench_tps_local_cluster_solana() {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.tx_count = 100;
|
||||||
|
config.duration = Duration::from_secs(10);
|
||||||
|
|
||||||
|
test_bench_tps_local_cluster(config);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[serial]
|
||||||
|
fn test_bench_tps_local_cluster_move() {
|
||||||
|
let mut config = Config::default();
|
||||||
|
config.tx_count = 100;
|
||||||
|
config.duration = Duration::from_secs(20);
|
||||||
|
config.use_move = true;
|
||||||
|
|
||||||
|
test_bench_tps_local_cluster(config);
|
||||||
|
}
|
|
@ -1,16 +1,14 @@
|
||||||
extern crate solana_core;
|
use crate::{
|
||||||
|
cluster::Cluster,
|
||||||
|
cluster_tests,
|
||||||
|
local_cluster::{ClusterConfig, LocalCluster},
|
||||||
|
};
|
||||||
use log::*;
|
use log::*;
|
||||||
use serial_test_derive::serial;
|
use serial_test_derive::serial;
|
||||||
use solana_core::{
|
use solana_core::{
|
||||||
bank_forks::SnapshotConfig, blocktree::Blocktree, broadcast_stage::BroadcastStageType,
|
bank_forks::SnapshotConfig, blocktree::Blocktree, broadcast_stage::BroadcastStageType,
|
||||||
gossip_service::discover_cluster, snapshot_utils, validator::ValidatorConfig,
|
gossip_service::discover_cluster, snapshot_utils, validator::ValidatorConfig,
|
||||||
};
|
};
|
||||||
use solana_local_cluster::cluster::Cluster;
|
|
||||||
use solana_local_cluster::{
|
|
||||||
cluster_tests,
|
|
||||||
local_cluster::{ClusterConfig, LocalCluster},
|
|
||||||
};
|
|
||||||
use solana_runtime::{
|
use solana_runtime::{
|
||||||
accounts_db::AccountsDB,
|
accounts_db::AccountsDB,
|
||||||
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
|
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
|
||||||
|
@ -584,7 +582,6 @@ fn test_faulty_node(faulty_node_type: BroadcastStageType) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[ignore]
|
|
||||||
fn test_repairman_catchup() {
|
fn test_repairman_catchup() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
error!("test_repairman_catchup");
|
error!("test_repairman_catchup");
|
|
@ -1,9 +1,4 @@
|
||||||
#[macro_use]
|
use crate::local_cluster::{ClusterConfig, LocalCluster};
|
||||||
extern crate log;
|
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
extern crate solana_core;
|
|
||||||
|
|
||||||
use serial_test_derive::serial;
|
use serial_test_derive::serial;
|
||||||
use solana_client::thin_client::create_client;
|
use solana_client::thin_client::create_client;
|
||||||
use solana_core::blocktree::{create_new_tmp_ledger, get_tmp_ledger_path, Blocktree};
|
use solana_core::blocktree::{create_new_tmp_ledger, get_tmp_ledger_path, Blocktree};
|
||||||
|
@ -13,7 +8,6 @@ use solana_core::gossip_service::discover_cluster;
|
||||||
use solana_core::replicator::Replicator;
|
use solana_core::replicator::Replicator;
|
||||||
use solana_core::storage_stage::SLOTS_PER_TURN_TEST;
|
use solana_core::storage_stage::SLOTS_PER_TURN_TEST;
|
||||||
use solana_core::validator::ValidatorConfig;
|
use solana_core::validator::ValidatorConfig;
|
||||||
use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
|
|
||||||
use solana_sdk::genesis_block::create_genesis_block;
|
use solana_sdk::genesis_block::create_genesis_block;
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use std::fs::remove_dir_all;
|
use std::fs::remove_dir_all;
|
|
@ -13,9 +13,9 @@ source ci/_
|
||||||
reportName="lcov-${CI_COMMIT:0:9}"
|
reportName="lcov-${CI_COMMIT:0:9}"
|
||||||
|
|
||||||
if [[ -n $1 ]]; then
|
if [[ -n $1 ]]; then
|
||||||
crate=--manifest-path=$1/Cargo.toml
|
crate="--manifest-path=$1/Cargo.toml"
|
||||||
else
|
else
|
||||||
crate=--all
|
crate="--all --exclude solana-local-cluster"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
coverageFlags=(-Zprofile) # Enable coverage
|
coverageFlags=(-Zprofile) # Enable coverage
|
||||||
|
@ -36,8 +36,10 @@ fi
|
||||||
rm -rf target/cov/$reportName
|
rm -rf target/cov/$reportName
|
||||||
|
|
||||||
source ci/rust-version.sh nightly
|
source ci/rust-version.sh nightly
|
||||||
_ cargo +$rust_nightly build --target-dir target/cov "$crate"
|
# shellcheck disable=SC2086 #
|
||||||
_ cargo +$rust_nightly test --target-dir target/cov --lib "$crate"
|
_ cargo +$rust_nightly build --target-dir target/cov $crate
|
||||||
|
# shellcheck disable=SC2086 #
|
||||||
|
_ cargo +$rust_nightly test --target-dir target/cov --lib $crate
|
||||||
|
|
||||||
echo "--- grcov"
|
echo "--- grcov"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue