From 521695269116458f691742f020431a678b5479d7 Mon Sep 17 00:00:00 2001 From: Stephen Akridge Date: Sat, 23 Feb 2019 14:23:55 -0800 Subject: [PATCH] Change benchmark path to target/ or OUT_DIR Also reduce some code duplication with cleanup_dirs fn. --- Cargo.lock | 11 +++++++ benches/appendvec.rs | 44 ++++++++++++++++----------- multinode-demo/bootstrap-leader.sh | 1 + multinode-demo/fullnode.sh | 3 ++ runtime/src/accounts.rs | 48 ++++++++++++++++-------------- src/fullnode.rs | 2 +- 6 files changed, 68 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4511d7ab4..86fc2fb24c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1089,6 +1089,15 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "memmap" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.49 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "memoffset" version = "0.2.1" @@ -2259,6 +2268,7 @@ dependencies = [ "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.88 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3003,6 +3013,7 @@ dependencies = [ "checksum make-cmd 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8ca8afbe8af1785e09636acb5a41e08a765f5f0340568716c18a8700ba3c0d3" "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" +"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mime 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "3e27ca21f40a310bd06d9031785f4801710d566c184a6e15bad4f1d9b65f9425" diff --git a/benches/appendvec.rs b/benches/appendvec.rs index cdfa31780a..23361fa5ac 100644 --- a/benches/appendvec.rs +++ b/benches/appendvec.rs @@ -4,7 +4,8 @@ extern crate test; use rand::{thread_rng, Rng}; use solana_runtime::appendvec::AppendVec; -use std::path::Path; +use std::env; +use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, RwLock}; use std::thread::spawn; @@ -13,10 +14,17 @@ use test::Bencher; const START_SIZE: u64 = 4 * 1024 * 1024; const INC_SIZE: u64 = 1 * 1024 * 1024; +fn get_appendvec_bench_path(path: &str) -> PathBuf { + let out_dir = env::var("OUT_DIR").unwrap_or_else(|_| "target".to_string()); + let mut buf = PathBuf::new(); + buf.push(&format!("{}/{}", out_dir, path)); + buf +} + #[bench] fn appendvec_atomic_append(bencher: &mut Bencher) { - let path = Path::new("/media/nvme0/bench/bench_append"); - let mut vec = AppendVec::::new(path, true, START_SIZE, INC_SIZE); + let path = get_appendvec_bench_path("bench_append"); + let mut vec = AppendVec::::new(&path, true, START_SIZE, INC_SIZE); bencher.iter(|| { if vec.append(AtomicUsize::new(0)).is_none() { assert!(vec.grow_file().is_ok()); @@ -28,9 +36,9 @@ fn appendvec_atomic_append(bencher: &mut Bencher) { #[bench] fn appendvec_atomic_random_access(bencher: &mut Bencher) { - let path = Path::new("/media/nvme0/bench/bench_ra"); - let mut vec = AppendVec::::new(path, true, START_SIZE, INC_SIZE); - let size = 10_000_000; + let path = get_appendvec_bench_path("bench_ra"); + let mut vec = AppendVec::::new(&path, true, START_SIZE, INC_SIZE); + let size = 1_000_000; for _ in 0..size { if vec.append(AtomicUsize::new(0)).is_none() { assert!(vec.grow_file().is_ok()); @@ -46,9 +54,9 @@ fn appendvec_atomic_random_access(bencher: &mut Bencher) { #[bench] fn appendvec_atomic_random_change(bencher: &mut Bencher) { - let path = Path::new("/media/nvme0/bench/bench_rax"); - let mut vec = AppendVec::::new(path, true, START_SIZE, INC_SIZE); - let size = 10_000_000; + let path = get_appendvec_bench_path("bench_rax"); + let mut vec = AppendVec::::new(&path, true, START_SIZE, INC_SIZE); + let size = 1_000_000; for _ in 0..size { if vec.append(AtomicUsize::new(0)).is_none() { assert!(vec.grow_file().is_ok()); @@ -70,9 +78,9 @@ fn appendvec_atomic_random_change(bencher: &mut Bencher) { #[bench] fn appendvec_atomic_random_read(bencher: &mut Bencher) { - let path = Path::new("/media/nvme0/bench/bench_read"); - let mut vec = AppendVec::::new(path, true, START_SIZE, INC_SIZE); - let size = 100_000_000; + let path = get_appendvec_bench_path("bench_read"); + let mut vec = AppendVec::::new(&path, true, START_SIZE, INC_SIZE); + let size = 1_000_000; for _ in 0..size { if vec.append(AtomicUsize::new(0)).is_none() { assert!(vec.grow_file().is_ok()); @@ -90,12 +98,12 @@ fn appendvec_atomic_random_read(bencher: &mut Bencher) { #[bench] fn appendvec_concurrent_lock_append(bencher: &mut Bencher) { - let path = Path::new("bench_lock_append"); + let path = get_appendvec_bench_path("bench_lock_append"); let vec = Arc::new(RwLock::new(AppendVec::::new( - path, true, START_SIZE, INC_SIZE, + &path, true, START_SIZE, INC_SIZE, ))); let vec1 = vec.clone(); - let size = 100_000_000; + let size = 1_000_000; let count = Arc::new(AtomicUsize::new(0)); let count1 = count.clone(); spawn(move || loop { @@ -130,12 +138,12 @@ fn appendvec_concurrent_lock_append(bencher: &mut Bencher) { #[bench] fn appendvec_concurrent_get_append(bencher: &mut Bencher) { - let path = Path::new("bench_get_append"); + let path = get_appendvec_bench_path("bench_get_append"); let vec = Arc::new(RwLock::new(AppendVec::::new( - path, true, START_SIZE, INC_SIZE, + &path, true, START_SIZE, INC_SIZE, ))); let vec1 = vec.clone(); - let size = 100_000_000; + let size = 1_000_000; let count = Arc::new(AtomicUsize::new(0)); let count1 = count.clone(); spawn(move || loop { diff --git a/multinode-demo/bootstrap-leader.sh b/multinode-demo/bootstrap-leader.sh index 4b1be20b45..71b26f819d 100755 --- a/multinode-demo/bootstrap-leader.sh +++ b/multinode-demo/bootstrap-leader.sh @@ -68,6 +68,7 @@ $program \ $maybe_no_leader_rotation \ --identity "$SOLANA_CONFIG_DIR"/bootstrap-leader.json \ --ledger "$SOLANA_CONFIG_DIR"/bootstrap-leader-ledger \ + --accounts "$SOLANA_CONFIG_DIR"/bootstrap-leader-accounts \ --rpc-port 8899 \ > >($bootstrap_leader_logger) 2>&1 & pid=$! diff --git a/multinode-demo/fullnode.sh b/multinode-demo/fullnode.sh index d41b4b5721..cd645cb904 100755 --- a/multinode-demo/fullnode.sh +++ b/multinode-demo/fullnode.sh @@ -157,6 +157,7 @@ if ((!self_setup)); then fullnode_id_path=$SOLANA_CONFIG_DIR/fullnode-id.json fullnode_json_path=$SOLANA_CONFIG_DIR/fullnode.json ledger_config_dir=$SOLANA_CONFIG_DIR/fullnode-ledger + accounts_config_dir=$SOLANA_CONFIG_DIR/fullnode-accounts else mkdir -p "$SOLANA_CONFIG_DIR" fullnode_id_path=$SOLANA_CONFIG_DIR/fullnode-id-x$self_setup_label.json @@ -181,6 +182,7 @@ else } ledger_config_dir=$SOLANA_CONFIG_DIR/fullnode-ledger-x$self_setup_label + accounts_config_dir=$SOLANA_CONFIG_DIR/fullnode-accounts-x$self_setup_label fi [[ -r $fullnode_id_path ]] || { @@ -256,6 +258,7 @@ $program \ --identity "$fullnode_json_path" \ --network "$leader_address" \ --ledger "$ledger_config_dir" \ + --accounts "$accounts_config_dir" \ > >($fullnode_logger) 2>&1 & pid=$! oom_score_adj "$pid" 1000 diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index 7f7a813515..863570ceff 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -13,7 +13,8 @@ use solana_sdk::signature::{Keypair, KeypairUtil}; use solana_sdk::transaction::Transaction; use solana_sdk::vote_program; use std::collections::BTreeMap; -use std::fs::{create_dir_all, read_dir, remove_dir_all}; +use std::env; +use std::fs::{create_dir_all, remove_dir_all}; use std::path::Path; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex, RwLock}; @@ -167,16 +168,20 @@ pub struct Accounts { paths: String, } +fn get_paths_vec(paths: &str) -> Vec { + paths.split(',').map(|s| s.to_string()).collect() +} + +fn cleanup_dirs(paths: &str) { + let paths = get_paths_vec(&paths); + paths.iter().for_each(|p| { + let _ignored = remove_dir_all(p); + }) +} + impl Drop for Accounts { fn drop(&mut self) { - let paths: Vec = self.paths.split(',').map(|s| s.to_string()).collect(); - paths.iter().for_each(|p| { - let _ignored = remove_dir_all(p); - }); - let entry = read_dir(ACCOUNTSDB_DIR); - if entry.is_ok() && entry.unwrap().count() == 0 { - let _ignored = remove_dir_all(ACCOUNTSDB_DIR); - } + cleanup_dirs(&self.paths); } } @@ -210,16 +215,14 @@ impl AccountsDB { } fn add_storage(&self, paths: &str) { - let paths: Vec = paths.split(',').map(|s| s.to_string()).collect(); + let paths = get_paths_vec(&paths); let mut stores: Vec = vec![]; paths.iter().for_each(|p| { - let keypair = Keypair::new(); - let path = format!("{}/{}", p, keypair.pubkey()); let storage = AccountStorage { - appendvec: self.new_account_storage(&path), + appendvec: self.new_account_storage(&p), status: AtomicUsize::new(AccountStorageStatus::StorageAvailable as usize), count: AtomicUsize::new(0), - path: path.to_string(), + path: p.to_string(), }; stores.push(storage); }); @@ -652,7 +655,15 @@ impl Accounts { fn make_new_dir() -> String { static ACCOUNT_DIR: AtomicUsize = AtomicUsize::new(0); let dir = ACCOUNT_DIR.fetch_add(1, Ordering::Relaxed); - format!("{}/{}", ACCOUNTSDB_DIR, dir.to_string()) + let out_dir = env::var("OUT_DIR").unwrap_or_else(|_| "target".to_string()); + let keypair = Keypair::new(); + format!( + "{}/{}/{}/{}", + out_dir, + ACCOUNTSDB_DIR, + keypair.pubkey(), + dir.to_string() + ) } fn make_default_paths() -> String { @@ -1341,13 +1352,6 @@ mod tests { true } - fn cleanup_dirs(paths: &str) { - let paths: Vec = paths.split(',').map(|s| s.to_string()).collect(); - paths.iter().for_each(|p| { - let _ignored = remove_dir_all(p); - }) - } - #[test] fn test_account_one() { let paths = "one".to_string(); diff --git a/src/fullnode.rs b/src/fullnode.rs index f967d16495..dc90c5ca13 100644 --- a/src/fullnode.rs +++ b/src/fullnode.rs @@ -746,7 +746,7 @@ mod tests { // Close the validator so that rocksdb has locks available validator_exit(); - let (bank_forks, bank_forks_info, _, _) = new_banks_from_blocktree(&validator_ledger_path, "accounts"); + let (bank_forks, bank_forks_info, _, _) = new_banks_from_blocktree(&validator_ledger_path, ""); let bank = bank_forks.working_bank(); let entry_height = bank_forks_info[0].entry_height;