From c934a30f66ac0b3d0c485bfbec1a818e60403884 Mon Sep 17 00:00:00 2001 From: Anatoly Yakovenko Date: Mon, 9 Apr 2018 11:28:54 -0700 Subject: [PATCH] commandline options for client and testnode --- Cargo.toml | 2 ++ src/bin/client-demo.rs | 60 +++++++++++++++++++++++++++++++++--------- src/bin/testnode.rs | 18 +++++++++++-- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b73553896..65fd08cf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,3 +59,5 @@ env_logger = "^0.4.1" matches = "^0.1.6" byteorder = "^1.2.1" libc = "^0.2.1" +getopts = "^0.2" + diff --git a/src/bin/client-demo.rs b/src/bin/client-demo.rs index a91b4c2cd..e42bfe36e 100644 --- a/src/bin/client-demo.rs +++ b/src/bin/client-demo.rs @@ -1,3 +1,4 @@ +extern crate getopts; extern crate rayon; extern crate serde_json; extern crate solana; @@ -11,24 +12,49 @@ use std::io::stdin; use std::net::UdpSocket; use std::thread::sleep; use std::time::{Duration, Instant}; +use std::env; +use getopts::Options; fn main() { - let addr = "127.0.0.1:8000"; - let send_addr = "127.0.0.1:8001"; + let mut threads = 4usize; + let mut addr: String = "127.0.0.1:8000".to_string(); + let mut send_addr: String = "127.0.0.1:8001".to_string(); + let mut opts = Options::new(); + opts.optopt("s", "", "server address", "host:port"); + opts.optopt("c", "", "client address", "host:port"); + opts.optopt("t", "", "number of threads", "4"); + let args: Vec = env::args().collect(); + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(f) => panic!(f.to_string()), + }; + + if matches.opt_present("s") { + addr = matches.opt_str("s").unwrap(); + } + if matches.opt_present("c") { + send_addr = matches.opt_str("c").unwrap(); + } + if matches.opt_present("t") { + threads = matches.opt_str("t").unwrap().parse().expect("integer"); + } let mint: Mint = serde_json::from_reader(stdin()).unwrap(); let mint_keypair = mint.keypair(); let mint_pubkey = mint.pubkey(); - let socket = UdpSocket::bind(send_addr).unwrap(); - let acc = AccountantStub::new(addr, socket); + let socket = UdpSocket::bind(&send_addr).unwrap(); + println!("Stub new"); + let acc = AccountantStub::new(&addr, socket); + println!("Get last id"); let last_id = acc.get_last_id().unwrap(); + println!("Get Balance"); let mint_balance = acc.get_balance(&mint_pubkey).unwrap().unwrap(); println!("Mint's Initial Balance {}", mint_balance); println!("Signing transactions..."); - let txs = 100_000; + let txs = 1_000_000; let now = Instant::now(); let transactions: Vec<_> = (0..txs) .into_par_iter() @@ -38,7 +64,7 @@ fn main() { }) .collect(); let duration = now.elapsed(); - let ns = duration.as_secs() * 1_000_000_000 + u64::from(duration.subsec_nanos()); + let ns = duration.as_secs() * 2_000_000_000 + u64::from(duration.subsec_nanos()); let bsps = f64::from(txs) / ns as f64; let nsps = ns as f64 / f64::from(txs); println!( @@ -47,13 +73,23 @@ fn main() { nsps / 1_000_f64 ); - println!("Transferring 1 unit {} times...", txs); + println!("Transfering {} transactions in {} batches", txs, threads); let now = Instant::now(); - let mut _sig = Default::default(); - for tr in transactions { - _sig = tr.sig; - acc.transfer_signed(tr).unwrap(); - } + let sz = transactions.len() / threads; + let chunks: Vec<_> = transactions.chunks(sz).collect(); + let _: Vec<_> = chunks + .into_par_iter() + .map(|trs| { + println!("Transferring 1 unit {} times...", trs.len()); + let send_addr = "0.0.0.0:0"; + let socket = UdpSocket::bind(send_addr).unwrap(); + let acc = AccountantStub::new(&addr, socket); + for tr in trs { + acc.transfer_signed(tr.clone()).unwrap(); + } + () + }) + .collect(); println!("Waiting for last transaction to be confirmed...",); let mut val = mint_balance; let mut prev = 0; diff --git a/src/bin/testnode.rs b/src/bin/testnode.rs index 37410d3d8..557daedef 100644 --- a/src/bin/testnode.rs +++ b/src/bin/testnode.rs @@ -1,4 +1,5 @@ extern crate env_logger; +extern crate getopts; extern crate serde_json; extern crate solana; @@ -10,10 +11,23 @@ use solana::historian::Historian; use std::io::{self, stdout, BufRead}; use std::sync::atomic::AtomicBool; use std::sync::{Arc, Mutex}; +use std::env; +use getopts::Options; fn main() { env_logger::init().unwrap(); - let addr = "127.0.0.1:8000"; + let mut port = 8000u16; + let mut opts = Options::new(); + opts.optopt("p", "", "port", "port"); + let args: Vec = env::args().collect(); + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(f) => panic!(f.to_string()), + }; + if matches.opt_present("p") { + port = matches.opt_str("p").unwrap().parse().expect("port"); + } + let addr = format!("0.0.0.0:{}", port); let stdin = io::stdin(); let mut entries = stdin .lock() @@ -53,7 +67,7 @@ fn main() { historian, ))); eprintln!("Listening on {}", addr); - let threads = AccountantSkel::serve(&skel, addr, exit.clone()).unwrap(); + let threads = AccountantSkel::serve(&skel, &addr, exit.clone()).unwrap(); for t in threads { t.join().expect("join"); }