Add num_lamports_per_account as a configurable argument (#5869)
This commit is contained in:
		@@ -1,5 +1,6 @@
 | 
			
		||||
use solana_metrics;
 | 
			
		||||
 | 
			
		||||
use crate::cli::Config;
 | 
			
		||||
use bincode;
 | 
			
		||||
use log::*;
 | 
			
		||||
use rayon::prelude::*;
 | 
			
		||||
@@ -32,7 +33,6 @@ use std::time::Instant;
 | 
			
		||||
use solana_librapay_api::librapay_transaction;
 | 
			
		||||
 | 
			
		||||
pub const MAX_SPENDS_PER_TX: u64 = 4;
 | 
			
		||||
pub const NUM_LAMPORTS_PER_ACCOUNT: u64 = 128;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub enum BenchTpsError {
 | 
			
		||||
@@ -43,30 +43,6 @@ pub type Result<T> = std::result::Result<T, BenchTpsError>;
 | 
			
		||||
 | 
			
		||||
pub type SharedTransactions = Arc<RwLock<VecDeque<Vec<(Transaction, u64)>>>>;
 | 
			
		||||
 | 
			
		||||
pub struct Config {
 | 
			
		||||
    pub id: Keypair,
 | 
			
		||||
    pub threads: usize,
 | 
			
		||||
    pub thread_batch_sleep_ms: usize,
 | 
			
		||||
    pub duration: Duration,
 | 
			
		||||
    pub tx_count: usize,
 | 
			
		||||
    pub sustained: bool,
 | 
			
		||||
    pub use_move: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Config {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            id: Keypair::new(),
 | 
			
		||||
            threads: 4,
 | 
			
		||||
            thread_batch_sleep_ms: 0,
 | 
			
		||||
            duration: Duration::new(std::u64::MAX, 0),
 | 
			
		||||
            tx_count: 500_000,
 | 
			
		||||
            sustained: false,
 | 
			
		||||
            use_move: false,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type LibraKeys = (Keypair, Pubkey, Pubkey, Vec<Keypair>);
 | 
			
		||||
 | 
			
		||||
fn get_recent_blockhash<T: Client>(client: &T) -> (Hash, FeeCalculator) {
 | 
			
		||||
@@ -98,6 +74,7 @@ where
 | 
			
		||||
        duration,
 | 
			
		||||
        tx_count,
 | 
			
		||||
        sustained,
 | 
			
		||||
        num_lamports_per_account,
 | 
			
		||||
        ..
 | 
			
		||||
    } = config;
 | 
			
		||||
 | 
			
		||||
@@ -210,7 +187,7 @@ where
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        i += 1;
 | 
			
		||||
        if should_switch_directions(NUM_LAMPORTS_PER_ACCOUNT, i) {
 | 
			
		||||
        if should_switch_directions(num_lamports_per_account, i) {
 | 
			
		||||
            reclaim_lamports_back_to_source_account = !reclaim_lamports_back_to_source_account;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,8 @@ use solana_drone::drone::DRONE_PORT;
 | 
			
		||||
use solana_sdk::fee_calculator::FeeCalculator;
 | 
			
		||||
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
 | 
			
		||||
 | 
			
		||||
const NUM_LAMPORTS_PER_ACCOUNT_DEFAULT: u64 = 64 * 1024;
 | 
			
		||||
 | 
			
		||||
/// Holds the configuration for a single run of the benchmark
 | 
			
		||||
pub struct Config {
 | 
			
		||||
    pub entrypoint_addr: SocketAddr,
 | 
			
		||||
@@ -23,6 +25,7 @@ pub struct Config {
 | 
			
		||||
    pub read_from_client_file: bool,
 | 
			
		||||
    pub target_lamports_per_signature: u64,
 | 
			
		||||
    pub use_move: bool,
 | 
			
		||||
    pub num_lamports_per_account: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Config {
 | 
			
		||||
@@ -42,6 +45,7 @@ impl Default for Config {
 | 
			
		||||
            read_from_client_file: false,
 | 
			
		||||
            target_lamports_per_signature: FeeCalculator::default().target_lamports_per_signature,
 | 
			
		||||
            use_move: false,
 | 
			
		||||
            num_lamports_per_account: NUM_LAMPORTS_PER_ACCOUNT_DEFAULT,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -146,6 +150,15 @@ pub fn build_args<'a, 'b>() -> App<'a, 'b> {
 | 
			
		||||
                     verification when the cluster is operating at target-signatures-per-slot",
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
        .arg(
 | 
			
		||||
            Arg::with_name("num_lamports_per_account")
 | 
			
		||||
                .long("num-lamports-per-account")
 | 
			
		||||
                .value_name("LAMPORTS")
 | 
			
		||||
                .takes_value(true)
 | 
			
		||||
                .help(
 | 
			
		||||
                    "Number of lamports per account.",
 | 
			
		||||
                ),
 | 
			
		||||
        )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Parses a clap `ArgMatches` structure into a `Config`
 | 
			
		||||
@@ -220,5 +233,9 @@ pub fn extract_args<'a>(matches: &ArgMatches<'a>) -> Config {
 | 
			
		||||
 | 
			
		||||
    args.use_move = matches.is_present("use-move");
 | 
			
		||||
 | 
			
		||||
    if let Some(v) = matches.value_of("num_lamports_per_account") {
 | 
			
		||||
        args.num_lamports_per_account = v.to_string().parse().expect("can't parse lamports");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    args
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,7 @@ extern crate solana_move_loader_program;
 | 
			
		||||
mod bench;
 | 
			
		||||
mod cli;
 | 
			
		||||
 | 
			
		||||
use crate::bench::{
 | 
			
		||||
    do_bench_tps, generate_and_fund_keypairs, generate_keypairs, Config, NUM_LAMPORTS_PER_ACCOUNT,
 | 
			
		||||
};
 | 
			
		||||
use crate::bench::{do_bench_tps, generate_and_fund_keypairs, generate_keypairs};
 | 
			
		||||
use solana_core::gossip_service::{discover_cluster, get_multi_client};
 | 
			
		||||
use solana_genesis::PrimordialAccountDetails;
 | 
			
		||||
use solana_sdk::fee_calculator::FeeCalculator;
 | 
			
		||||
@@ -33,26 +31,24 @@ fn main() {
 | 
			
		||||
        entrypoint_addr,
 | 
			
		||||
        drone_addr,
 | 
			
		||||
        id,
 | 
			
		||||
        threads,
 | 
			
		||||
        num_nodes,
 | 
			
		||||
        duration,
 | 
			
		||||
        tx_count,
 | 
			
		||||
        thread_batch_sleep_ms,
 | 
			
		||||
        sustained,
 | 
			
		||||
        client_ids_and_stake_file,
 | 
			
		||||
        write_to_client_file,
 | 
			
		||||
        read_from_client_file,
 | 
			
		||||
        target_lamports_per_signature,
 | 
			
		||||
        use_move,
 | 
			
		||||
    } = cli_config;
 | 
			
		||||
        num_lamports_per_account,
 | 
			
		||||
        ..
 | 
			
		||||
    } = &cli_config;
 | 
			
		||||
 | 
			
		||||
    if write_to_client_file {
 | 
			
		||||
        let (keypairs, _) = generate_keypairs(&id, tx_count as u64 * 2);
 | 
			
		||||
    if *write_to_client_file {
 | 
			
		||||
        let (keypairs, _) = generate_keypairs(&id, *tx_count as u64 * 2);
 | 
			
		||||
        let num_accounts = keypairs.len() as u64;
 | 
			
		||||
        let max_fee = FeeCalculator::new(target_lamports_per_signature).max_lamports_per_signature;
 | 
			
		||||
        let max_fee = FeeCalculator::new(*target_lamports_per_signature).max_lamports_per_signature;
 | 
			
		||||
        let num_lamports_per_account = (num_accounts - 1 + NUM_SIGNATURES_FOR_TXS * max_fee)
 | 
			
		||||
            / num_accounts
 | 
			
		||||
            + NUM_LAMPORTS_PER_ACCOUNT;
 | 
			
		||||
            + num_lamports_per_account;
 | 
			
		||||
        let mut accounts = HashMap::new();
 | 
			
		||||
        keypairs.iter().for_each(|keypair| {
 | 
			
		||||
            accounts.insert(
 | 
			
		||||
@@ -75,7 +71,7 @@ fn main() {
 | 
			
		||||
 | 
			
		||||
    println!("Connecting to the cluster");
 | 
			
		||||
    let (nodes, _replicators) =
 | 
			
		||||
        discover_cluster(&entrypoint_addr, num_nodes).unwrap_or_else(|err| {
 | 
			
		||||
        discover_cluster(&entrypoint_addr, *num_nodes).unwrap_or_else(|err| {
 | 
			
		||||
            eprintln!("Failed to discover {} nodes: {:?}", num_nodes, err);
 | 
			
		||||
            exit(1);
 | 
			
		||||
        });
 | 
			
		||||
@@ -90,7 +86,7 @@ fn main() {
 | 
			
		||||
        exit(1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let (keypairs, move_keypairs, keypair_balance) = if read_from_client_file && !use_move {
 | 
			
		||||
    let (keypairs, move_keypairs, keypair_balance) = if *read_from_client_file && !use_move {
 | 
			
		||||
        let path = Path::new(&client_ids_and_stake_file);
 | 
			
		||||
        let file = File::open(path).unwrap();
 | 
			
		||||
 | 
			
		||||
@@ -114,11 +110,11 @@ fn main() {
 | 
			
		||||
    } else {
 | 
			
		||||
        generate_and_fund_keypairs(
 | 
			
		||||
            &client,
 | 
			
		||||
            Some(drone_addr),
 | 
			
		||||
            Some(*drone_addr),
 | 
			
		||||
            &id,
 | 
			
		||||
            tx_count,
 | 
			
		||||
            NUM_LAMPORTS_PER_ACCOUNT,
 | 
			
		||||
            use_move,
 | 
			
		||||
            *tx_count,
 | 
			
		||||
            *num_lamports_per_account,
 | 
			
		||||
            *use_move,
 | 
			
		||||
        )
 | 
			
		||||
        .unwrap_or_else(|e| {
 | 
			
		||||
            eprintln!("Error could not fund keys: {:?}", e);
 | 
			
		||||
@@ -126,19 +122,9 @@ fn main() {
 | 
			
		||||
        })
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let config = Config {
 | 
			
		||||
        id,
 | 
			
		||||
        threads,
 | 
			
		||||
        thread_batch_sleep_ms,
 | 
			
		||||
        duration,
 | 
			
		||||
        tx_count,
 | 
			
		||||
        sustained,
 | 
			
		||||
        use_move,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    do_bench_tps(
 | 
			
		||||
        vec![client],
 | 
			
		||||
        config,
 | 
			
		||||
        cli_config,
 | 
			
		||||
        keypairs,
 | 
			
		||||
        keypair_balance,
 | 
			
		||||
        move_keypairs,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user