diff --git a/Cargo.lock b/Cargo.lock index fa87bec69f..70c1be67e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2264,6 +2264,7 @@ dependencies = [ "solana-logger 0.14.0", "solana-metrics 0.14.0", "solana-netutil 0.14.0", + "solana-runtime 0.14.0", "solana-sdk 0.14.0", "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "ws 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/bench-exchange/Cargo.toml b/bench-exchange/Cargo.toml index 9d9afc2c02..73b8372863 100644 --- a/bench-exchange/Cargo.toml +++ b/bench-exchange/Cargo.toml @@ -29,6 +29,7 @@ solana-exchange-program = { path = "../programs/exchange_program", version = "0. solana-logger = { path = "../logger", version = "0.14.0" } solana-metrics = { path = "../metrics", version = "0.14.0" } solana-netutil = { path = "../netutil", version = "0.14.0" } +solana-runtime = { path = "../runtime", version = "0.14.0" } solana-sdk = { path = "../sdk", version = "0.14.0" } ws = "0.8.0" untrusted = "0.6.2" diff --git a/bench-exchange/src/bench.rs b/bench-exchange/src/bench.rs index 5ca4f533a7..b5d2d0cab3 100644 --- a/bench-exchange/src/bench.rs +++ b/bench-exchange/src/bench.rs @@ -1017,6 +1017,10 @@ mod tests { use solana::local_cluster::{ClusterConfig, LocalCluster}; use solana_client::thin_client::create_client; use solana_drone::drone::run_local_drone; + use solana_exchange_api::exchange_processor::process_instruction; + use solana_runtime::bank::Bank; + use solana_runtime::bank_client::BankClient; + use solana_sdk::genesis_block::GenesisBlock; use std::sync::mpsc::channel; #[test] @@ -1046,11 +1050,7 @@ mod tests { node_stakes: vec![100_000; NUM_NODES], cluster_lamports: 100_000_000_000_000, fullnode_config, - native_instruction_processors: [( - "solana_exchange_program".to_string(), - solana_exchange_api::id(), - )] - .to_vec(), + native_instruction_processors: [("solana_exchange_program".to_string(), id())].to_vec(), ..ClusterConfig::default() }); @@ -1105,4 +1105,24 @@ mod tests { do_bench_exchange(clients, config); } + + #[test] + fn test_exchange_bank_client() { + solana_logger::setup(); + let (genesis_block, identity) = GenesisBlock::new(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.threads = 4; + config.duration = Duration::from_secs(5); + config.fund_amount = 100_000; + config.trade_delay = 1; + config.batch_size = 10; + config.account_groups = 100; + + do_bench_exchange(clients, config); + } } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 3fca1065e1..875dd58735 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -1013,7 +1013,7 @@ impl Bank { self.is_delta.load(Ordering::Relaxed) && self.tick_height() == max_tick_height } - /// Add an instruction processor to intercept intructions before the dynamic loader. + /// Add an instruction processor to intercept instructions before the dynamic loader. pub fn add_instruction_processor( &mut self, program_id: Pubkey, diff --git a/runtime/src/bank_client.rs b/runtime/src/bank_client.rs index 78f4a34bce..82aec90bd8 100644 --- a/runtime/src/bank_client.rs +++ b/runtime/src/bank_client.rs @@ -12,11 +12,12 @@ use solana_sdk::transport::Result; use std::io; use std::sync::mpsc::{channel, Receiver, Sender}; use std::sync::Arc; +use std::sync::Mutex; use std::thread::Builder; pub struct BankClient { bank: Arc, - transaction_sender: Sender, + transaction_sender: Mutex>, } impl Client for BankClient {} @@ -24,7 +25,8 @@ impl Client for BankClient {} impl AsyncClient for BankClient { fn async_send_transaction(&self, transaction: Transaction) -> io::Result { let signature = transaction.signatures.get(0).cloned().unwrap_or_default(); - self.transaction_sender.send(transaction).unwrap(); + let transaction_sender = self.transaction_sender.lock().unwrap(); + transaction_sender.send(transaction).unwrap(); Ok(signature) } @@ -122,6 +124,7 @@ impl BankClient { pub fn new(bank: Bank) -> Self { let bank = Arc::new(bank); let (transaction_sender, transaction_receiver) = channel(); + let transaction_sender = Mutex::new(transaction_sender); let thread_bank = bank.clone(); let bank = bank.clone(); Builder::new()