Don't use barrier transaction in testnet for perf testing (#3862)
This commit is contained in:
parent
aa21f5343a
commit
26a7eb6fa5
|
@ -11,8 +11,6 @@ use solana_client::thin_client::ThinClient;
|
||||||
use solana_drone::drone::request_airdrop_transaction;
|
use solana_drone::drone::request_airdrop_transaction;
|
||||||
use solana_metrics::influxdb;
|
use solana_metrics::influxdb;
|
||||||
use solana_sdk::client::{AsyncClient, SyncClient};
|
use solana_sdk::client::{AsyncClient, SyncClient};
|
||||||
use solana_sdk::hash::Hash;
|
|
||||||
use solana_sdk::pubkey::Pubkey;
|
|
||||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||||
use solana_sdk::system_instruction;
|
use solana_sdk::system_instruction;
|
||||||
use solana_sdk::system_transaction;
|
use solana_sdk::system_transaction;
|
||||||
|
@ -68,8 +66,6 @@ pub fn do_bench_tps(config: Config) {
|
||||||
let cluster_entrypoint = nodes[0].clone(); // Pick the first node, why not?
|
let cluster_entrypoint = nodes[0].clone(); // Pick the first node, why not?
|
||||||
|
|
||||||
let client = create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE);
|
let client = create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE);
|
||||||
let mut barrier_client =
|
|
||||||
create_client(cluster_entrypoint.client_facing_addr(), FULLNODE_PORT_RANGE);
|
|
||||||
|
|
||||||
let mut seed = [0u8; 32];
|
let mut seed = [0u8; 32];
|
||||||
seed.copy_from_slice(&id.public_key_bytes()[..32]);
|
seed.copy_from_slice(&id.public_key_bytes()[..32]);
|
||||||
|
@ -83,8 +79,6 @@ pub fn do_bench_tps(config: Config) {
|
||||||
target /= MAX_SPENDS_PER_TX;
|
target /= MAX_SPENDS_PER_TX;
|
||||||
}
|
}
|
||||||
let gen_keypairs = rnd.gen_n_keypairs(total_keys as u64);
|
let gen_keypairs = rnd.gen_n_keypairs(total_keys as u64);
|
||||||
let barrier_source_keypair = Keypair::new();
|
|
||||||
let barrier_dest_id = Pubkey::new_rand();
|
|
||||||
|
|
||||||
println!("Get lamports...");
|
println!("Get lamports...");
|
||||||
let num_lamports_per_account = 20;
|
let num_lamports_per_account = 20;
|
||||||
|
@ -104,11 +98,6 @@ pub fn do_bench_tps(config: Config) {
|
||||||
}
|
}
|
||||||
let start = gen_keypairs.len() - (tx_count * 2) as usize;
|
let start = gen_keypairs.len() - (tx_count * 2) as usize;
|
||||||
let keypairs = &gen_keypairs[start..];
|
let keypairs = &gen_keypairs[start..];
|
||||||
airdrop_lamports(&barrier_client, &drone_addr, &barrier_source_keypair, 1);
|
|
||||||
|
|
||||||
println!("Get last ID...");
|
|
||||||
let mut blockhash = client.get_recent_blockhash().unwrap();
|
|
||||||
println!("Got last ID {:?}", blockhash);
|
|
||||||
|
|
||||||
let first_tx_count = client.get_transaction_count().expect("transaction count");
|
let first_tx_count = client.get_transaction_count().expect("transaction count");
|
||||||
println!("Initial transaction count {}", first_tx_count);
|
println!("Initial transaction count {}", first_tx_count);
|
||||||
|
@ -190,15 +179,6 @@ pub fn do_bench_tps(config: Config) {
|
||||||
sleep(Duration::from_millis(100));
|
sleep(Duration::from_millis(100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// It's not feasible (would take too much time) to confirm each of the `tx_count / 2`
|
|
||||||
// transactions sent by `generate_txs()` so instead send and confirm a single transaction
|
|
||||||
// to validate the network is still functional.
|
|
||||||
send_barrier_transaction(
|
|
||||||
&mut barrier_client,
|
|
||||||
&mut blockhash,
|
|
||||||
&barrier_source_keypair,
|
|
||||||
&barrier_dest_id,
|
|
||||||
);
|
|
||||||
|
|
||||||
i += 1;
|
i += 1;
|
||||||
if should_switch_directions(num_lamports_per_account, i) {
|
if should_switch_directions(num_lamports_per_account, i) {
|
||||||
|
@ -301,82 +281,6 @@ fn sample_tx_count(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Send loopback payment of 0 lamports and confirm the network processed it
|
|
||||||
fn send_barrier_transaction(
|
|
||||||
barrier_client: &mut ThinClient,
|
|
||||||
blockhash: &mut Hash,
|
|
||||||
source_keypair: &Keypair,
|
|
||||||
dest_id: &Pubkey,
|
|
||||||
) {
|
|
||||||
let transfer_start = Instant::now();
|
|
||||||
|
|
||||||
let mut poll_count = 0;
|
|
||||||
loop {
|
|
||||||
if poll_count > 0 && poll_count % 8 == 0 {
|
|
||||||
println!(
|
|
||||||
"polling for barrier transaction confirmation, attempt {}",
|
|
||||||
poll_count
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
*blockhash = barrier_client.get_recent_blockhash().unwrap();
|
|
||||||
|
|
||||||
let transaction =
|
|
||||||
system_transaction::create_user_account(&source_keypair, dest_id, 0, *blockhash, 0);
|
|
||||||
let signature = barrier_client
|
|
||||||
.async_send_transaction(transaction)
|
|
||||||
.expect("Unable to send barrier transaction");
|
|
||||||
|
|
||||||
let confirmatiom = barrier_client.poll_for_signature(&signature);
|
|
||||||
let duration_ms = duration_as_ms(&transfer_start.elapsed());
|
|
||||||
if confirmatiom.is_ok() {
|
|
||||||
println!("barrier transaction confirmed in {} ms", duration_ms);
|
|
||||||
|
|
||||||
solana_metrics::submit(
|
|
||||||
influxdb::Point::new("bench-tps")
|
|
||||||
.add_tag(
|
|
||||||
"op",
|
|
||||||
influxdb::Value::String("send_barrier_transaction".to_string()),
|
|
||||||
)
|
|
||||||
.add_field("poll_count", influxdb::Value::Integer(poll_count))
|
|
||||||
.add_field("duration", influxdb::Value::Integer(duration_ms as i64))
|
|
||||||
.to_owned(),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Sanity check that the client balance is still 1
|
|
||||||
let balance = barrier_client
|
|
||||||
.poll_balance_with_timeout(
|
|
||||||
&source_keypair.pubkey(),
|
|
||||||
&Duration::from_millis(100),
|
|
||||||
&Duration::from_secs(10),
|
|
||||||
)
|
|
||||||
.expect("Failed to get balance");
|
|
||||||
if balance != 1 {
|
|
||||||
panic!("Expected an account balance of 1 (balance: {}", balance);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timeout after 3 minutes. When running a CPU-only leader+validator+drone+bench-tps on a dev
|
|
||||||
// machine, some batches of transactions can take upwards of 1 minute...
|
|
||||||
if duration_ms > 1000 * 60 * 3 {
|
|
||||||
println!("Error: Couldn't confirm barrier transaction!");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
let new_blockhash = barrier_client.get_recent_blockhash().unwrap();
|
|
||||||
if new_blockhash == *blockhash {
|
|
||||||
if poll_count > 0 && poll_count % 8 == 0 {
|
|
||||||
println!("blockhash is not advancing, still at {:?}", *blockhash);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
*blockhash = new_blockhash;
|
|
||||||
}
|
|
||||||
|
|
||||||
poll_count += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn generate_txs(
|
fn generate_txs(
|
||||||
shared_txs: &SharedTransactions,
|
shared_txs: &SharedTransactions,
|
||||||
source: &[Keypair],
|
source: &[Keypair],
|
||||||
|
|
Loading…
Reference in New Issue