2018-11-29 09:29:17 -08:00
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
2018-12-08 22:44:20 -07:00
|
|
|
|
2019-02-26 17:11:26 -08:00
|
|
|
#[macro_use]
|
|
|
|
extern crate solana;
|
|
|
|
|
2019-02-07 20:52:39 -08:00
|
|
|
use solana::blocktree::{
|
2019-02-26 16:35:00 -08:00
|
|
|
create_new_tmp_ledger, get_tmp_ledger_path, tmp_copy_blocktree, Blocktree,
|
2019-02-07 15:10:54 -08:00
|
|
|
};
|
2019-03-12 11:37:48 -07:00
|
|
|
use solana::cluster_info::{Node, FULLNODE_PORT_RANGE};
|
2019-03-08 17:23:07 -08:00
|
|
|
use solana::contact_info::ContactInfo;
|
2019-01-29 08:51:01 -08:00
|
|
|
use solana::fullnode::{Fullnode, FullnodeConfig};
|
2018-11-29 09:29:17 -08:00
|
|
|
use solana::replicator::Replicator;
|
2019-01-02 11:02:15 -08:00
|
|
|
use solana::storage_stage::STORAGE_ROTATE_TEST_COUNT;
|
2019-03-12 20:25:52 -06:00
|
|
|
use solana_client::client::create_client;
|
2019-02-22 22:55:46 -07:00
|
|
|
use solana_sdk::genesis_block::GenesisBlock;
|
2019-01-10 09:21:38 -08:00
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
2018-12-10 11:21:28 -08:00
|
|
|
use solana_sdk::system_transaction::SystemTransaction;
|
2018-11-29 09:29:17 -08:00
|
|
|
use std::fs::remove_dir_all;
|
2019-02-05 08:03:52 -08:00
|
|
|
use std::sync::Arc;
|
2018-11-29 09:29:17 -08:00
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
#[test]
|
2019-02-05 08:03:52 -08:00
|
|
|
fn test_replicator_startup_basic() {
|
2019-01-09 11:19:04 -08:00
|
|
|
solana_logger::setup();
|
2018-11-29 09:29:17 -08:00
|
|
|
info!("starting replicator test");
|
2019-02-26 17:11:26 -08:00
|
|
|
let replicator_ledger_path = &get_tmp_ledger_path!();
|
2018-11-29 09:29:17 -08:00
|
|
|
|
|
|
|
info!("starting leader node");
|
|
|
|
let leader_keypair = Arc::new(Keypair::new());
|
2019-03-09 19:28:43 -08:00
|
|
|
let leader_node = Node::new_localhost_with_pubkey(&leader_keypair.pubkey());
|
2018-11-29 09:29:17 -08:00
|
|
|
let leader_info = leader_node.info.clone();
|
|
|
|
|
2019-02-22 22:55:46 -07:00
|
|
|
let (genesis_block, mint_keypair) =
|
2019-03-09 19:28:43 -08:00
|
|
|
GenesisBlock::new_with_leader(1_000_000_000, &leader_info.id, 42);
|
2019-03-02 10:25:16 -08:00
|
|
|
let (leader_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_block);
|
2018-11-29 09:29:17 -08:00
|
|
|
|
2019-02-26 17:11:26 -08:00
|
|
|
let validator_ledger_path = tmp_copy_blocktree!(&leader_ledger_path);
|
2018-12-10 11:38:29 -08:00
|
|
|
|
2018-11-29 09:29:17 -08:00
|
|
|
{
|
2019-03-05 08:52:53 -07:00
|
|
|
let voting_keypair = Keypair::new();
|
2019-01-05 12:57:52 -08:00
|
|
|
|
2019-02-22 22:55:46 -07:00
|
|
|
let mut fullnode_config = FullnodeConfig::default();
|
2019-01-29 08:51:01 -08:00
|
|
|
fullnode_config.storage_rotate_count = STORAGE_ROTATE_TEST_COUNT;
|
|
|
|
let leader = Fullnode::new(
|
2018-11-29 09:29:17 -08:00
|
|
|
leader_node,
|
2019-01-30 20:51:50 -07:00
|
|
|
&leader_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
&leader_ledger_path,
|
2019-03-09 19:28:43 -08:00
|
|
|
&voting_keypair.pubkey(),
|
2019-01-31 21:12:51 -07:00
|
|
|
voting_keypair,
|
2018-12-10 11:38:29 -08:00
|
|
|
None,
|
2019-01-31 20:41:03 -08:00
|
|
|
&fullnode_config,
|
2018-12-10 11:38:29 -08:00
|
|
|
);
|
2019-02-05 08:03:52 -08:00
|
|
|
|
2019-03-08 10:20:37 -08:00
|
|
|
debug!("Looking for leader on gossip...");
|
2019-03-08 17:14:06 -08:00
|
|
|
solana::gossip_service::discover(&leader_info.gossip, 1).unwrap();
|
2018-12-10 11:38:29 -08:00
|
|
|
|
|
|
|
let validator_keypair = Arc::new(Keypair::new());
|
2019-03-05 08:52:53 -07:00
|
|
|
let voting_keypair = Keypair::new();
|
2019-01-02 11:02:15 -08:00
|
|
|
|
2019-03-12 20:25:52 -06:00
|
|
|
let mut leader_client =
|
|
|
|
create_client(leader_info.client_facing_addr(), FULLNODE_PORT_RANGE);
|
2019-03-02 10:25:16 -08:00
|
|
|
let blockhash = leader_client.get_recent_blockhash();
|
|
|
|
debug!("blockhash: {:?}", blockhash);
|
2019-01-02 11:02:15 -08:00
|
|
|
|
|
|
|
leader_client
|
2019-03-09 19:28:43 -08:00
|
|
|
.transfer(10, &mint_keypair, &validator_keypair.pubkey(), &blockhash)
|
2019-01-02 11:02:15 -08:00
|
|
|
.unwrap();
|
|
|
|
|
2019-03-09 19:28:43 -08:00
|
|
|
let validator_node = Node::new_localhost_with_pubkey(&validator_keypair.pubkey());
|
2018-12-10 11:38:29 -08:00
|
|
|
|
2019-01-29 08:51:01 -08:00
|
|
|
let validator = Fullnode::new(
|
2018-12-10 11:38:29 -08:00
|
|
|
validator_node,
|
2019-01-30 20:51:50 -07:00
|
|
|
&validator_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
&validator_ledger_path,
|
2019-03-09 19:28:43 -08:00
|
|
|
&voting_keypair.pubkey(),
|
2019-01-31 21:12:51 -07:00
|
|
|
voting_keypair,
|
2019-01-29 08:51:01 -08:00
|
|
|
Some(&leader_info),
|
2019-01-31 20:41:03 -08:00
|
|
|
&fullnode_config,
|
2018-11-29 09:29:17 -08:00
|
|
|
);
|
|
|
|
|
|
|
|
let bob = Keypair::new();
|
|
|
|
|
2019-01-02 11:02:15 -08:00
|
|
|
info!("starting transfers..");
|
2019-02-05 08:03:52 -08:00
|
|
|
for i in 0..64 {
|
|
|
|
debug!("transfer {}", i);
|
2019-03-02 10:25:16 -08:00
|
|
|
let blockhash = leader_client.get_recent_blockhash();
|
2019-02-05 08:03:52 -08:00
|
|
|
let mut transaction =
|
2019-03-09 19:28:43 -08:00
|
|
|
SystemTransaction::new_account(&mint_keypair, &bob.pubkey(), 1, blockhash, 0);
|
2019-01-02 11:02:15 -08:00
|
|
|
leader_client
|
2019-02-05 08:03:52 -08:00
|
|
|
.retry_transfer(&mint_keypair, &mut transaction, 5)
|
2019-01-02 11:02:15 -08:00
|
|
|
.unwrap();
|
2019-02-05 08:03:52 -08:00
|
|
|
debug!(
|
|
|
|
"transfer {}: mint balance={:?}, bob balance={:?}",
|
|
|
|
i,
|
|
|
|
leader_client.get_balance(&mint_keypair.pubkey()),
|
|
|
|
leader_client.get_balance(&bob.pubkey()),
|
|
|
|
);
|
2019-01-02 11:02:15 -08:00
|
|
|
}
|
2018-11-29 09:29:17 -08:00
|
|
|
|
2019-03-06 19:09:37 -08:00
|
|
|
let replicator_keypair = Arc::new(Keypair::new());
|
2018-11-29 09:29:17 -08:00
|
|
|
|
2019-03-05 17:18:25 -08:00
|
|
|
info!("giving replicator lamports..");
|
2019-01-02 11:02:15 -08:00
|
|
|
|
2019-03-02 10:25:16 -08:00
|
|
|
let blockhash = leader_client.get_recent_blockhash();
|
2019-03-05 17:18:25 -08:00
|
|
|
// Give the replicator some lamports
|
2019-02-01 08:36:35 -07:00
|
|
|
let mut tx = SystemTransaction::new_account(
|
|
|
|
&mint_keypair,
|
2019-03-09 19:28:43 -08:00
|
|
|
&replicator_keypair.pubkey(),
|
2019-02-05 08:03:52 -08:00
|
|
|
1,
|
2019-03-02 10:25:16 -08:00
|
|
|
blockhash,
|
2019-02-01 08:36:35 -07:00
|
|
|
0,
|
|
|
|
);
|
2018-11-02 08:40:29 -07:00
|
|
|
leader_client
|
2019-01-24 12:04:04 -08:00
|
|
|
.retry_transfer(&mint_keypair, &mut tx, 5)
|
2018-11-02 08:40:29 -07:00
|
|
|
.unwrap();
|
|
|
|
|
2018-11-29 09:29:17 -08:00
|
|
|
info!("starting replicator node");
|
2019-03-09 19:28:43 -08:00
|
|
|
let replicator_node = Node::new_localhost_with_pubkey(&replicator_keypair.pubkey());
|
2019-03-12 11:37:48 -07:00
|
|
|
let _replicator_info = replicator_node.info.clone();
|
2018-11-02 08:40:29 -07:00
|
|
|
|
2019-03-08 17:23:07 -08:00
|
|
|
let leader_info = ContactInfo::new_gossip_entry_point(&leader_info.gossip);
|
2018-11-02 08:40:29 -07:00
|
|
|
|
|
|
|
let replicator = Replicator::new(
|
2019-01-31 12:44:09 -08:00
|
|
|
replicator_ledger_path,
|
2018-11-29 09:29:17 -08:00
|
|
|
replicator_node,
|
2019-03-12 11:37:48 -07:00
|
|
|
leader_info,
|
|
|
|
replicator_keypair,
|
2019-01-21 15:37:41 -06:00
|
|
|
None,
|
2018-12-07 20:01:28 -07:00
|
|
|
)
|
|
|
|
.unwrap();
|
2018-11-29 09:29:17 -08:00
|
|
|
|
2019-01-02 11:02:15 -08:00
|
|
|
info!("started replicator..");
|
|
|
|
|
2018-11-02 08:40:29 -07:00
|
|
|
replicator.close();
|
2019-03-03 16:44:06 -08:00
|
|
|
validator.close().unwrap();
|
|
|
|
leader.close().unwrap();
|
2018-11-29 09:29:17 -08:00
|
|
|
}
|
|
|
|
|
2019-02-05 08:03:52 -08:00
|
|
|
info!("cleanup");
|
2019-02-07 20:52:39 -08:00
|
|
|
Blocktree::destroy(&leader_ledger_path).expect("Expected successful database destruction");
|
|
|
|
Blocktree::destroy(&replicator_ledger_path).expect("Expected successful database destruction");
|
2018-11-29 09:29:17 -08:00
|
|
|
let _ignored = remove_dir_all(&leader_ledger_path);
|
|
|
|
let _ignored = remove_dir_all(&replicator_ledger_path);
|
|
|
|
}
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_replicator_startup_leader_hang() {
|
|
|
|
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
|
|
|
|
use std::time::Duration;
|
|
|
|
|
|
|
|
solana_logger::setup();
|
|
|
|
info!("starting replicator test");
|
|
|
|
|
|
|
|
let leader_ledger_path = "replicator_test_leader_ledger";
|
2019-02-26 21:16:18 -08:00
|
|
|
let (genesis_block, _mint_keypair) = GenesisBlock::new(10_000);
|
2019-03-02 10:25:16 -08:00
|
|
|
let (replicator_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_block);
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
{
|
2019-03-06 19:09:37 -08:00
|
|
|
let replicator_keypair = Arc::new(Keypair::new());
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
info!("starting replicator node");
|
2019-03-09 19:28:43 -08:00
|
|
|
let replicator_node = Node::new_localhost_with_pubkey(&replicator_keypair.pubkey());
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
let fake_gossip = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);
|
2019-03-08 17:23:07 -08:00
|
|
|
let leader_info = ContactInfo::new_gossip_entry_point(&fake_gossip);
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
let replicator_res = Replicator::new(
|
2019-02-26 21:16:18 -08:00
|
|
|
&replicator_ledger_path,
|
2019-01-21 15:37:41 -06:00
|
|
|
replicator_node,
|
2019-03-12 11:37:48 -07:00
|
|
|
leader_info,
|
|
|
|
replicator_keypair,
|
2019-01-21 15:37:41 -06:00
|
|
|
Some(Duration::from_secs(3)),
|
|
|
|
);
|
|
|
|
|
|
|
|
assert!(replicator_res.is_err());
|
|
|
|
}
|
|
|
|
|
2019-02-07 20:52:39 -08:00
|
|
|
let _ignored = Blocktree::destroy(&leader_ledger_path);
|
|
|
|
let _ignored = Blocktree::destroy(&replicator_ledger_path);
|
2019-01-21 15:37:41 -06:00
|
|
|
let _ignored = remove_dir_all(&leader_ledger_path);
|
|
|
|
let _ignored = remove_dir_all(&replicator_ledger_path);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-02-26 21:57:45 -08:00
|
|
|
#[ignore] //TODO: hangs, was passing because of bug in network code
|
2019-01-21 15:37:41 -06:00
|
|
|
fn test_replicator_startup_ledger_hang() {
|
|
|
|
solana_logger::setup();
|
|
|
|
info!("starting replicator test");
|
2019-02-26 21:16:18 -08:00
|
|
|
let leader_keypair = Arc::new(Keypair::new());
|
|
|
|
|
|
|
|
let (genesis_block, _mint_keypair) =
|
2019-03-09 19:28:43 -08:00
|
|
|
GenesisBlock::new_with_leader(100, &leader_keypair.pubkey(), 42);
|
2019-03-02 10:25:16 -08:00
|
|
|
let (replicator_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_block);
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
info!("starting leader node");
|
2019-03-09 19:28:43 -08:00
|
|
|
let leader_node = Node::new_localhost_with_pubkey(&leader_keypair.pubkey());
|
2019-01-21 15:37:41 -06:00
|
|
|
let leader_info = leader_node.info.clone();
|
|
|
|
|
2019-03-02 10:25:16 -08:00
|
|
|
let (leader_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_block);
|
2019-02-26 17:11:26 -08:00
|
|
|
let validator_ledger_path = tmp_copy_blocktree!(&leader_ledger_path);
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
{
|
2019-03-05 08:52:53 -07:00
|
|
|
let voting_keypair = Keypair::new();
|
2019-01-21 15:37:41 -06:00
|
|
|
|
2019-02-22 22:55:46 -07:00
|
|
|
let fullnode_config = FullnodeConfig::default();
|
2019-01-21 15:37:41 -06:00
|
|
|
let _ = Fullnode::new(
|
|
|
|
leader_node,
|
2019-01-30 20:51:50 -07:00
|
|
|
&leader_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
&leader_ledger_path,
|
2019-03-09 19:28:43 -08:00
|
|
|
&voting_keypair.pubkey(),
|
2019-01-31 21:12:51 -07:00
|
|
|
voting_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
None,
|
2019-02-12 13:14:33 -08:00
|
|
|
&fullnode_config,
|
2019-01-21 15:37:41 -06:00
|
|
|
);
|
|
|
|
|
|
|
|
let validator_keypair = Arc::new(Keypair::new());
|
2019-03-05 08:52:53 -07:00
|
|
|
let voting_keypair = Keypair::new();
|
2019-03-09 19:28:43 -08:00
|
|
|
let validator_node = Node::new_localhost_with_pubkey(&validator_keypair.pubkey());
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
let _ = Fullnode::new(
|
|
|
|
validator_node,
|
2019-01-30 20:51:50 -07:00
|
|
|
&validator_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
&validator_ledger_path,
|
2019-03-09 19:28:43 -08:00
|
|
|
&voting_keypair.pubkey(),
|
2019-01-31 21:12:51 -07:00
|
|
|
voting_keypair,
|
2019-01-28 20:10:38 -08:00
|
|
|
Some(&leader_info),
|
2019-01-31 20:41:03 -08:00
|
|
|
&FullnodeConfig::default(),
|
2019-01-21 15:37:41 -06:00
|
|
|
);
|
|
|
|
|
|
|
|
info!("starting replicator node");
|
2019-03-06 19:09:37 -08:00
|
|
|
let bad_keys = Arc::new(Keypair::new());
|
2019-03-09 19:28:43 -08:00
|
|
|
let mut replicator_node = Node::new_localhost_with_pubkey(&bad_keys.pubkey());
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
// Pass bad TVU sockets to prevent successful ledger download
|
2019-02-26 16:35:00 -08:00
|
|
|
replicator_node.sockets.tvu = vec![std::net::UdpSocket::bind("0.0.0.0:0").unwrap()];
|
2019-01-21 15:37:41 -06:00
|
|
|
|
2019-03-08 17:23:07 -08:00
|
|
|
let leader_info = ContactInfo::new_gossip_entry_point(&leader_info.gossip);
|
2019-01-21 15:37:41 -06:00
|
|
|
|
|
|
|
let replicator_res = Replicator::new(
|
2019-02-26 21:16:18 -08:00
|
|
|
&replicator_ledger_path,
|
2019-01-21 15:37:41 -06:00
|
|
|
replicator_node,
|
2019-03-12 11:37:48 -07:00
|
|
|
leader_info,
|
|
|
|
bad_keys,
|
2019-01-21 15:37:41 -06:00
|
|
|
Some(Duration::from_secs(3)),
|
|
|
|
);
|
|
|
|
|
|
|
|
assert!(replicator_res.is_err());
|
|
|
|
}
|
|
|
|
|
2019-02-07 20:52:39 -08:00
|
|
|
let _ignored = Blocktree::destroy(&leader_ledger_path);
|
|
|
|
let _ignored = Blocktree::destroy(&replicator_ledger_path);
|
2019-01-21 15:37:41 -06:00
|
|
|
let _ignored = remove_dir_all(&leader_ledger_path);
|
|
|
|
let _ignored = remove_dir_all(&replicator_ledger_path);
|
|
|
|
}
|