| 
									
										
										
										
											2019-11-12 20:30:35 -07:00
										 |  |  | use log::*;
 | 
					
						
							| 
									
										
										
										
											2019-07-02 17:35:03 -07:00
										 |  |  | use serial_test_derive::serial;
 | 
					
						
							| 
									
										
										
										
											2020-01-16 08:29:36 -08:00
										 |  |  | use solana_archiver_lib::archiver::Archiver;
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  | use solana_client::thin_client::create_client;
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  | use solana_core::{
 | 
					
						
							|  |  |  |     cluster_info::{ClusterInfo, Node, VALIDATOR_PORT_RANGE},
 | 
					
						
							|  |  |  |     contact_info::ContactInfo,
 | 
					
						
							|  |  |  |     gossip_service::discover_cluster,
 | 
					
						
							| 
									
										
										
										
											2020-01-31 14:23:51 -08:00
										 |  |  |     serve_repair::ServeRepair,
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  |     storage_stage::SLOTS_PER_TURN_TEST,
 | 
					
						
							|  |  |  |     validator::ValidatorConfig,
 | 
					
						
							|  |  |  | };
 | 
					
						
							| 
									
										
										
										
											2020-01-13 14:13:52 -07:00
										 |  |  | use solana_ledger::{blockstore::Blockstore, create_new_tmp_ledger, get_tmp_ledger_path};
 | 
					
						
							| 
									
										
										
										
											2019-11-12 20:30:35 -07:00
										 |  |  | use solana_local_cluster::local_cluster::{ClusterConfig, LocalCluster};
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  | use solana_sdk::{
 | 
					
						
							|  |  |  |     commitment_config::CommitmentConfig,
 | 
					
						
							| 
									
										
										
										
											2019-11-08 23:56:57 -05:00
										 |  |  |     genesis_config::create_genesis_config,
 | 
					
						
							| 
									
										
										
										
											2020-02-20 14:28:55 -07:00
										 |  |  |     signature::{Keypair, Signer},
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  | };
 | 
					
						
							| 
									
										
										
										
											2020-04-21 12:54:45 -07:00
										 |  |  | use std::{fs::remove_dir_all, sync::Arc};
 | 
					
						
							| 
									
										
										
										
											2019-03-14 12:57:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | /// Start the cluster with the given configuration and wait till the archivers are discovered
 | 
					
						
							| 
									
										
										
										
											2019-11-14 11:49:31 -08:00
										 |  |  | /// Then download shreds from one of them.
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | fn run_archiver_startup_basic(num_nodes: usize, num_archivers: usize) {
 | 
					
						
							| 
									
										
										
										
											2019-01-09 11:19:04 -08:00
										 |  |  |     solana_logger::setup();
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     info!("starting archiver test");
 | 
					
						
							| 
									
										
										
										
											2018-11-29 09:29:17 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-23 22:05:16 -07:00
										 |  |  |     let mut validator_config = ValidatorConfig::default();
 | 
					
						
							| 
									
										
										
										
											2019-07-10 13:33:29 -07:00
										 |  |  |     let slots_per_segment = 8;
 | 
					
						
							|  |  |  |     validator_config.storage_slots_per_turn = SLOTS_PER_TURN_TEST;
 | 
					
						
							| 
									
										
										
										
											2019-04-15 15:27:45 -07:00
										 |  |  |     let config = ClusterConfig {
 | 
					
						
							| 
									
										
										
										
											2019-07-09 16:48:40 -07:00
										 |  |  |         validator_configs: vec![validator_config; num_nodes],
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         num_archivers,
 | 
					
						
							| 
									
										
										
										
											2019-04-15 15:27:45 -07:00
										 |  |  |         node_stakes: vec![100; num_nodes],
 | 
					
						
							|  |  |  |         cluster_lamports: 10_000,
 | 
					
						
							| 
									
										
										
										
											2019-07-10 13:33:29 -07:00
										 |  |  |         // keep a low slot/segment count to speed up the test
 | 
					
						
							|  |  |  |         slots_per_segment,
 | 
					
						
							| 
									
										
										
										
											2019-04-15 15:27:45 -07:00
										 |  |  |         ..ClusterConfig::default()
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     let cluster = LocalCluster::new(&config);
 | 
					
						
							| 
									
										
										
										
											2019-03-18 11:02:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let (cluster_nodes, cluster_archivers) =
 | 
					
						
							|  |  |  |         discover_cluster(&cluster.entry_point_info.gossip, num_nodes + num_archivers).unwrap();
 | 
					
						
							| 
									
										
										
										
											2019-05-16 07:14:58 -07:00
										 |  |  |     assert_eq!(
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         cluster_nodes.len() + cluster_archivers.len(),
 | 
					
						
							|  |  |  |         num_nodes + num_archivers
 | 
					
						
							| 
									
										
										
										
											2019-05-16 07:14:58 -07:00
										 |  |  |     );
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let mut archiver_count = 0;
 | 
					
						
							|  |  |  |     let mut archiver_info = ContactInfo::default();
 | 
					
						
							|  |  |  |     for node in &cluster_archivers {
 | 
					
						
							| 
									
										
										
										
											2019-03-18 11:02:32 -07:00
										 |  |  |         info!("storage: {:?} rpc: {:?}", node.storage_addr, node.rpc);
 | 
					
						
							|  |  |  |         if ContactInfo::is_valid_address(&node.storage_addr) {
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |             archiver_count += 1;
 | 
					
						
							|  |  |  |             archiver_info = node.clone();
 | 
					
						
							| 
									
										
										
										
											2019-03-18 11:02:32 -07:00
										 |  |  |         }
 | 
					
						
							|  |  |  |     }
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     assert_eq!(archiver_count, num_archivers);
 | 
					
						
							| 
									
										
										
										
											2019-03-14 12:57:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-21 12:54:45 -07:00
										 |  |  |     let cluster_info = Arc::new(ClusterInfo::new_with_invalid_keypair(
 | 
					
						
							| 
									
										
										
										
											2019-06-17 18:12:13 -07:00
										 |  |  |         cluster_nodes[0].clone(),
 | 
					
						
							| 
									
										
										
										
											2020-04-21 12:54:45 -07:00
										 |  |  |     ));
 | 
					
						
							| 
									
										
										
										
											2020-01-31 14:23:51 -08:00
										 |  |  |     let serve_repair = ServeRepair::new(cluster_info);
 | 
					
						
							| 
									
										
										
										
											2019-11-13 08:14:09 -07:00
										 |  |  |     let path = get_tmp_ledger_path!();
 | 
					
						
							| 
									
										
										
										
											2020-01-13 14:13:52 -07:00
										 |  |  |     let blockstore = Arc::new(Blockstore::open(&path).unwrap());
 | 
					
						
							|  |  |  |     Archiver::download_from_archiver(
 | 
					
						
							| 
									
										
										
										
											2020-01-31 14:23:51 -08:00
										 |  |  |         &serve_repair,
 | 
					
						
							| 
									
										
										
										
											2020-01-13 14:13:52 -07:00
										 |  |  |         &archiver_info,
 | 
					
						
							|  |  |  |         &blockstore,
 | 
					
						
							|  |  |  |         slots_per_segment,
 | 
					
						
							|  |  |  |     )
 | 
					
						
							|  |  |  |     .unwrap();
 | 
					
						
							| 
									
										
										
										
											2018-11-29 09:29:17 -08:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-27 13:10:33 -07:00
										 |  |  | #[test]
 | 
					
						
							| 
									
										
										
										
											2020-01-31 00:17:36 +08:00
										 |  |  | #[ignore]
 | 
					
						
							| 
									
										
										
										
											2019-08-28 22:34:47 -07:00
										 |  |  | #[serial]
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | fn test_archiver_startup_1_node() {
 | 
					
						
							|  |  |  |     run_archiver_startup_basic(1, 1);
 | 
					
						
							| 
									
										
										
										
											2019-03-27 13:10:33 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[test]
 | 
					
						
							| 
									
										
										
										
											2020-01-31 00:17:36 +08:00
										 |  |  | #[ignore]
 | 
					
						
							| 
									
										
										
										
											2019-09-19 17:16:22 -07:00
										 |  |  | #[serial]
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | fn test_archiver_startup_2_nodes() {
 | 
					
						
							|  |  |  |     run_archiver_startup_basic(2, 1);
 | 
					
						
							| 
									
										
										
										
											2019-03-27 13:10:33 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | #[test]
 | 
					
						
							| 
									
										
										
										
											2019-07-02 17:35:03 -07:00
										 |  |  | #[serial]
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | fn test_archiver_startup_leader_hang() {
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  |     use std::net::{IpAddr, Ipv4Addr, SocketAddr};
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     solana_logger::setup();
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     info!("starting archiver test");
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let leader_ledger_path = std::path::PathBuf::from("archiver_test_leader_ledger");
 | 
					
						
							| 
									
										
										
										
											2019-11-08 23:56:57 -05:00
										 |  |  |     let (genesis_config, _mint_keypair) = create_genesis_config(10_000);
 | 
					
						
							|  |  |  |     let (archiver_ledger_path, _blockhash) = create_new_tmp_ledger!(&genesis_config);
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     {
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         let archiver_keypair = Arc::new(Keypair::new());
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |         let storage_keypair = Arc::new(Keypair::new());
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         info!("starting archiver node");
 | 
					
						
							|  |  |  |         let archiver_node = Node::new_localhost_with_pubkey(&archiver_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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         let archiver_res = Archiver::new(
 | 
					
						
							|  |  |  |             &archiver_ledger_path,
 | 
					
						
							|  |  |  |             archiver_node,
 | 
					
						
							| 
									
										
										
										
											2019-03-12 11:37:48 -07:00
										 |  |  |             leader_info,
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |             archiver_keypair,
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |             storage_keypair,
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  |             CommitmentConfig::recent(),
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  |         );
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         assert!(archiver_res.is_err());
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-13 14:13:52 -07:00
										 |  |  |     let _ignored = Blockstore::destroy(&leader_ledger_path);
 | 
					
						
							|  |  |  |     let _ignored = Blockstore::destroy(&archiver_ledger_path);
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  |     let _ignored = remove_dir_all(&leader_ledger_path);
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let _ignored = remove_dir_all(&archiver_ledger_path);
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #[test]
 | 
					
						
							| 
									
										
										
										
											2019-09-19 17:16:22 -07:00
										 |  |  | #[serial]
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  | fn test_archiver_startup_ledger_hang() {
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  |     solana_logger::setup();
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     info!("starting archiver test");
 | 
					
						
							| 
									
										
										
										
											2019-05-23 22:05:16 -07:00
										 |  |  |     let mut validator_config = ValidatorConfig::default();
 | 
					
						
							| 
									
										
										
										
											2019-07-10 13:33:29 -07:00
										 |  |  |     validator_config.storage_slots_per_turn = SLOTS_PER_TURN_TEST;
 | 
					
						
							| 
									
										
										
										
											2019-08-23 22:47:54 -07:00
										 |  |  |     let cluster = LocalCluster::new_with_equal_stakes(2, 10_000, 100);
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     info!("starting archiver node");
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  |     let bad_keys = Arc::new(Keypair::new());
 | 
					
						
							|  |  |  |     let storage_keypair = Arc::new(Keypair::new());
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let mut archiver_node = Node::new_localhost_with_pubkey(&bad_keys.pubkey());
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Pass bad TVU sockets to prevent successful ledger download
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     archiver_node.sockets.tvu = vec![std::net::UdpSocket::bind("0.0.0.0:0").unwrap()];
 | 
					
						
							| 
									
										
										
										
											2019-11-08 23:56:57 -05:00
										 |  |  |     let (archiver_ledger_path, _blockhash) = create_new_tmp_ledger!(&cluster.genesis_config);
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let archiver_res = Archiver::new(
 | 
					
						
							|  |  |  |         &archiver_ledger_path,
 | 
					
						
							|  |  |  |         archiver_node,
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  |         cluster.entry_point_info.clone(),
 | 
					
						
							|  |  |  |         bad_keys,
 | 
					
						
							|  |  |  |         storage_keypair,
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  |         CommitmentConfig::recent(),
 | 
					
						
							| 
									
										
										
										
											2019-03-27 17:21:49 -07:00
										 |  |  |     );
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     assert!(archiver_res.is_err());
 | 
					
						
							| 
									
										
										
										
											2019-01-21 15:37:41 -06:00
										 |  |  | }
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #[test]
 | 
					
						
							| 
									
										
										
										
											2019-07-02 17:35:03 -07:00
										 |  |  | #[serial]
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  | fn test_account_setup() {
 | 
					
						
							|  |  |  |     let num_nodes = 1;
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     let num_archivers = 1;
 | 
					
						
							| 
									
										
										
										
											2019-05-23 22:05:16 -07:00
										 |  |  |     let mut validator_config = ValidatorConfig::default();
 | 
					
						
							| 
									
										
										
										
											2019-07-10 13:33:29 -07:00
										 |  |  |     validator_config.storage_slots_per_turn = SLOTS_PER_TURN_TEST;
 | 
					
						
							| 
									
										
										
										
											2019-04-15 15:27:45 -07:00
										 |  |  |     let config = ClusterConfig {
 | 
					
						
							| 
									
										
										
										
											2019-06-19 00:13:19 -07:00
										 |  |  |         validator_configs: vec![ValidatorConfig::default(); num_nodes],
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         num_archivers,
 | 
					
						
							| 
									
										
										
										
											2019-04-15 15:27:45 -07:00
										 |  |  |         node_stakes: vec![100; num_nodes],
 | 
					
						
							|  |  |  |         cluster_lamports: 10_000,
 | 
					
						
							|  |  |  |         ..ClusterConfig::default()
 | 
					
						
							|  |  |  |     };
 | 
					
						
							|  |  |  |     let cluster = LocalCluster::new(&config);
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-16 07:14:58 -07:00
										 |  |  |     let _ = discover_cluster(
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |         &cluster.entry_point_info.gossip,
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |         num_nodes + num_archivers as usize,
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |     )
 | 
					
						
							|  |  |  |     .unwrap();
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     // now check that the cluster actually has accounts for the archiver.
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |     let client = create_client(
 | 
					
						
							|  |  |  |         cluster.entry_point_info.client_facing_addr(),
 | 
					
						
							| 
									
										
										
										
											2019-10-10 17:33:00 -06:00
										 |  |  |         VALIDATOR_PORT_RANGE,
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |     );
 | 
					
						
							| 
									
										
										
										
											2019-10-21 11:29:37 -06:00
										 |  |  |     cluster.archiver_infos.iter().for_each(|(_, value)| {
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |         assert_eq!(
 | 
					
						
							|  |  |  |             client
 | 
					
						
							| 
									
										
										
										
											2019-11-06 14:15:00 -07:00
										 |  |  |                 .poll_get_balance_with_commitment(
 | 
					
						
							|  |  |  |                     &value.archiver_storage_pubkey,
 | 
					
						
							|  |  |  |                     CommitmentConfig::recent()
 | 
					
						
							|  |  |  |                 )
 | 
					
						
							| 
									
										
										
										
											2019-03-27 15:54:09 -07:00
										 |  |  |                 .unwrap(),
 | 
					
						
							|  |  |  |             1
 | 
					
						
							|  |  |  |         );
 | 
					
						
							|  |  |  |     });
 | 
					
						
							|  |  |  | }
 |