committed by
GitHub
parent
1da1667920
commit
58ef02f02b
@ -209,7 +209,7 @@ mod tests {
|
||||
trusted_validators.insert(validator1.pubkey());
|
||||
assert!(AccountsHashVerifier::should_halt(
|
||||
&cluster_info,
|
||||
&Some(trusted_validators.clone()),
|
||||
&Some(trusted_validators),
|
||||
&mut slot_to_hash,
|
||||
));
|
||||
}
|
||||
|
@ -1504,7 +1504,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
BankingStage::filter_transaction_indexes(
|
||||
transactions.clone(),
|
||||
&vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
||||
&[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
||||
),
|
||||
(filtered_transactions.clone(), vec![1, 2, 3, 6, 8, 10])
|
||||
);
|
||||
@ -1512,7 +1512,7 @@ mod tests {
|
||||
assert_eq!(
|
||||
BankingStage::filter_transaction_indexes(
|
||||
transactions,
|
||||
&vec![1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15],
|
||||
&[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15],
|
||||
),
|
||||
(filtered_transactions, vec![2, 4, 5, 9, 11, 13])
|
||||
);
|
||||
@ -1537,7 +1537,7 @@ mod tests {
|
||||
];
|
||||
|
||||
assert_eq!(
|
||||
BankingStage::prepare_filter_for_pending_transactions(&transactions, &vec![2, 4, 5],),
|
||||
BankingStage::prepare_filter_for_pending_transactions(&transactions, &[2, 4, 5],),
|
||||
vec![
|
||||
Err(TransactionError::BlockhashNotFound),
|
||||
Err(TransactionError::BlockhashNotFound),
|
||||
@ -1549,7 +1549,7 @@ mod tests {
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
BankingStage::prepare_filter_for_pending_transactions(&transactions, &vec![0, 2, 3],),
|
||||
BankingStage::prepare_filter_for_pending_transactions(&transactions, &[0, 2, 3],),
|
||||
vec![
|
||||
Ok(()),
|
||||
Err(TransactionError::BlockhashNotFound),
|
||||
@ -1565,7 +1565,7 @@ mod tests {
|
||||
fn test_bank_filter_valid_transaction_indexes() {
|
||||
assert_eq!(
|
||||
BankingStage::filter_valid_transaction_indexes(
|
||||
&vec![
|
||||
&[
|
||||
(Err(TransactionError::BlockhashNotFound), None),
|
||||
(Err(TransactionError::BlockhashNotFound), None),
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
@ -1573,14 +1573,14 @@ mod tests {
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
],
|
||||
&vec![2, 4, 5, 9, 11, 13]
|
||||
&[2, 4, 5, 9, 11, 13]
|
||||
),
|
||||
vec![5, 11, 13]
|
||||
[5, 11, 13]
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
BankingStage::filter_valid_transaction_indexes(
|
||||
&vec![
|
||||
&[
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
(Err(TransactionError::BlockhashNotFound), None),
|
||||
(Err(TransactionError::BlockhashNotFound), None),
|
||||
@ -1588,9 +1588,9 @@ mod tests {
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
(Ok(()), Some(HashAgeKind::Extant)),
|
||||
],
|
||||
&vec![1, 6, 7, 9, 31, 43]
|
||||
&[1, 6, 7, 9, 31, 43]
|
||||
),
|
||||
vec![1, 9, 31, 43]
|
||||
[1, 9, 31, 43]
|
||||
);
|
||||
}
|
||||
|
||||
@ -1613,48 +1613,23 @@ mod tests {
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
BankingStage::consume_or_forward_packets(
|
||||
&my_pubkey,
|
||||
Some(my_pubkey1.clone()),
|
||||
false,
|
||||
false,
|
||||
),
|
||||
BankingStage::consume_or_forward_packets(&my_pubkey, Some(my_pubkey1), false, false,),
|
||||
BufferedPacketsDecision::Forward
|
||||
);
|
||||
assert_eq!(
|
||||
BankingStage::consume_or_forward_packets(
|
||||
&my_pubkey,
|
||||
Some(my_pubkey1.clone()),
|
||||
false,
|
||||
true,
|
||||
),
|
||||
BankingStage::consume_or_forward_packets(&my_pubkey, Some(my_pubkey1), false, true,),
|
||||
BufferedPacketsDecision::Hold
|
||||
);
|
||||
assert_eq!(
|
||||
BankingStage::consume_or_forward_packets(
|
||||
&my_pubkey,
|
||||
Some(my_pubkey1.clone()),
|
||||
true,
|
||||
false,
|
||||
),
|
||||
BankingStage::consume_or_forward_packets(&my_pubkey, Some(my_pubkey1), true, false,),
|
||||
BufferedPacketsDecision::Consume
|
||||
);
|
||||
assert_eq!(
|
||||
BankingStage::consume_or_forward_packets(
|
||||
&my_pubkey1,
|
||||
Some(my_pubkey1.clone()),
|
||||
false,
|
||||
false,
|
||||
),
|
||||
BankingStage::consume_or_forward_packets(&my_pubkey1, Some(my_pubkey1), false, false,),
|
||||
BufferedPacketsDecision::Hold
|
||||
);
|
||||
assert_eq!(
|
||||
BankingStage::consume_or_forward_packets(
|
||||
&my_pubkey1,
|
||||
Some(my_pubkey1.clone()),
|
||||
true,
|
||||
false,
|
||||
),
|
||||
BankingStage::consume_or_forward_packets(&my_pubkey1, Some(my_pubkey1), true, false,),
|
||||
BufferedPacketsDecision::Consume
|
||||
);
|
||||
}
|
||||
@ -1950,7 +1925,7 @@ mod tests {
|
||||
|
||||
poh_recorder.lock().unwrap().set_working_bank(working_bank);
|
||||
|
||||
let shreds = entries_to_test_shreds(entries.clone(), bank.slot(), 0, true, 0);
|
||||
let shreds = entries_to_test_shreds(entries, bank.slot(), 0, true, 0);
|
||||
blockstore.insert_shreds(shreds, None, false).unwrap();
|
||||
blockstore.set_roots(&[bank.slot()]).unwrap();
|
||||
|
||||
|
@ -453,6 +453,7 @@ pub mod test {
|
||||
path::Path, sync::atomic::AtomicBool, sync::mpsc::channel, sync::Arc, thread::sleep,
|
||||
};
|
||||
|
||||
#[allow(clippy::implicit_hasher)]
|
||||
pub fn make_transmit_shreds(
|
||||
slot: Slot,
|
||||
num: u64,
|
||||
@ -553,7 +554,7 @@ pub mod test {
|
||||
.send(vec![(updated_slot, bank0.clone())].into_iter().collect())
|
||||
.unwrap();
|
||||
retransmit_slots_sender
|
||||
.send(vec![(updated_slot, bank0.clone())].into_iter().collect())
|
||||
.send(vec![(updated_slot, bank0)].into_iter().collect())
|
||||
.unwrap();
|
||||
BroadcastStage::check_retransmit_signals(
|
||||
&blockstore,
|
||||
|
@ -189,7 +189,7 @@ mod test {
|
||||
&Some(BroadcastShredBatchInfo {
|
||||
slot: 0,
|
||||
num_expected_batches: Some(2),
|
||||
slot_start_ts: start.clone(),
|
||||
slot_start_ts: start,
|
||||
}),
|
||||
);
|
||||
|
||||
@ -233,7 +233,7 @@ mod test {
|
||||
&Some(BroadcastShredBatchInfo {
|
||||
slot: 0,
|
||||
num_expected_batches: None,
|
||||
slot_start_ts: start.clone(),
|
||||
slot_start_ts: start,
|
||||
}),
|
||||
);
|
||||
|
||||
@ -249,7 +249,6 @@ mod test {
|
||||
let slot = 0;
|
||||
let (sender, receiver) = channel();
|
||||
let thread_handles: Vec<_> = (0..num_threads)
|
||||
.into_iter()
|
||||
.map(|i| {
|
||||
let slot_broadcast_stats = slot_broadcast_stats.clone();
|
||||
let sender = Some(sender.clone());
|
||||
@ -257,7 +256,7 @@ mod test {
|
||||
let mut broadcast_batch_info = BroadcastShredBatchInfo {
|
||||
slot,
|
||||
num_expected_batches: None,
|
||||
slot_start_ts: start.clone(),
|
||||
slot_start_ts: start,
|
||||
};
|
||||
if i == round % num_threads {
|
||||
broadcast_batch_info.num_expected_batches = Some(num_threads);
|
||||
|
@ -425,9 +425,7 @@ mod test {
|
||||
let leader_keypair = Arc::new(Keypair::new());
|
||||
let leader_pubkey = leader_keypair.pubkey();
|
||||
let leader_info = Node::new_localhost_with_pubkey(&leader_pubkey);
|
||||
let cluster_info = Arc::new(ClusterInfo::new_with_invalid_keypair(
|
||||
leader_info.info.clone(),
|
||||
));
|
||||
let cluster_info = Arc::new(ClusterInfo::new_with_invalid_keypair(leader_info.info));
|
||||
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
||||
let mut genesis_config = create_genesis_config(10_000).genesis_config;
|
||||
genesis_config.ticks_per_slot = max_ticks_per_n_shreds(num_shreds_per_slot) + 1;
|
||||
@ -543,7 +541,7 @@ mod test {
|
||||
let receive_results = ReceiveResults {
|
||||
entries: ticks1.clone(),
|
||||
time_elapsed: Duration::new(2, 0),
|
||||
bank: bank2.clone(),
|
||||
bank: bank2,
|
||||
last_tick_height: (ticks1.len() - 1) as u64,
|
||||
};
|
||||
standard_broadcast_run
|
||||
@ -597,7 +595,7 @@ mod test {
|
||||
let receive_results = ReceiveResults {
|
||||
entries: ticks.clone(),
|
||||
time_elapsed: Duration::new(3, 0),
|
||||
bank: bank0.clone(),
|
||||
bank: bank0,
|
||||
last_tick_height: ticks.len() as u64,
|
||||
};
|
||||
|
||||
|
@ -2117,7 +2117,7 @@ mod tests {
|
||||
#[should_panic]
|
||||
fn test_update_contact_info() {
|
||||
let d = ContactInfo::new_localhost(&Pubkey::new_rand(), timestamp());
|
||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(d.clone());
|
||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(d);
|
||||
let entry_label = CrdsValueLabel::ContactInfo(cluster_info.id());
|
||||
assert!(cluster_info
|
||||
.gossip
|
||||
@ -2153,7 +2153,7 @@ mod tests {
|
||||
assert!(x < range.1);
|
||||
}
|
||||
|
||||
fn check_sockets(sockets: &Vec<UdpSocket>, ip: IpAddr, range: (u16, u16)) {
|
||||
fn check_sockets(sockets: &[UdpSocket], ip: IpAddr, range: (u16, u16)) {
|
||||
assert!(sockets.len() > 1);
|
||||
let port = sockets[0].local_addr().unwrap().port();
|
||||
for socket in sockets.iter() {
|
||||
@ -2214,8 +2214,8 @@ mod tests {
|
||||
let peer_keypair = Keypair::new();
|
||||
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
||||
let peer = ContactInfo::new_localhost(&peer_keypair.pubkey(), 0);
|
||||
let cluster_info = ClusterInfo::new(contact_info.clone(), Arc::new(keypair));
|
||||
cluster_info.insert_info(peer.clone());
|
||||
let cluster_info = ClusterInfo::new(contact_info, Arc::new(keypair));
|
||||
cluster_info.insert_info(peer);
|
||||
cluster_info
|
||||
.gossip
|
||||
.write()
|
||||
@ -2228,7 +2228,7 @@ mod tests {
|
||||
.unwrap()
|
||||
.new_push_messages(timestamp());
|
||||
// there should be some pushes ready
|
||||
assert_eq!(push_messages.len() > 0, true);
|
||||
assert_eq!(push_messages.is_empty(), false);
|
||||
push_messages
|
||||
.values()
|
||||
.for_each(|v| v.par_iter().for_each(|v| assert!(v.verify())));
|
||||
@ -2525,7 +2525,7 @@ mod tests {
|
||||
});
|
||||
i += 1;
|
||||
}
|
||||
let split = ClusterInfo::split_gossip_messages(vec![value.clone()]);
|
||||
let split = ClusterInfo::split_gossip_messages(vec![value]);
|
||||
assert_eq!(split.len(), 0);
|
||||
}
|
||||
|
||||
@ -2547,13 +2547,13 @@ mod tests {
|
||||
//sanity test to ensure filter size never exceeds MTU size
|
||||
check_pull_request_size(CrdsFilter::new_rand(1000, 10));
|
||||
check_pull_request_size(CrdsFilter::new_rand(1000, 1000));
|
||||
check_pull_request_size(CrdsFilter::new_rand(100000, 1000));
|
||||
check_pull_request_size(CrdsFilter::new_rand(100000, MAX_BLOOM_SIZE));
|
||||
check_pull_request_size(CrdsFilter::new_rand(100_000, 1000));
|
||||
check_pull_request_size(CrdsFilter::new_rand(100_000, MAX_BLOOM_SIZE));
|
||||
}
|
||||
|
||||
fn check_pull_request_size(filter: CrdsFilter) {
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::default()));
|
||||
let protocol = Protocol::PullRequest(filter, value.clone());
|
||||
let protocol = Protocol::PullRequest(filter, value);
|
||||
assert!(serialized_size(&protocol).unwrap() <= PACKET_DATA_SIZE as u64);
|
||||
}
|
||||
|
||||
@ -2590,7 +2590,7 @@ mod tests {
|
||||
let mut contact_info = ContactInfo::new_localhost(&id4, timestamp());
|
||||
contact_info.shred_version = 1;
|
||||
assert_ne!(contact_info.shred_version, d.shred_version);
|
||||
cluster_info.insert_info(contact_info.clone());
|
||||
cluster_info.insert_info(contact_info);
|
||||
stakes.insert(id4, 10);
|
||||
|
||||
let stakes = Arc::new(stakes);
|
||||
@ -2659,11 +2659,8 @@ mod tests {
|
||||
node_keypair,
|
||||
);
|
||||
for i in 0..10 {
|
||||
let mut peer_lowest = 0;
|
||||
if i >= 5 {
|
||||
// make these invalid for the upcoming repair request
|
||||
peer_lowest = 10;
|
||||
}
|
||||
// make these invalid for the upcoming repair request
|
||||
let peer_lowest = if i >= 5 { 10 } else { 0 };
|
||||
let other_node_pubkey = Pubkey::new_rand();
|
||||
let other_node = ContactInfo::new_localhost(&other_node_pubkey, timestamp());
|
||||
cluster_info.insert_info(other_node.clone());
|
||||
|
@ -534,7 +534,7 @@ mod tests {
|
||||
solana_logger::setup();
|
||||
let node_keypair = Keypair::new();
|
||||
let vote_keypair = Keypair::new();
|
||||
let slots: Vec<_> = (0..31).into_iter().collect();
|
||||
let slots: Vec<_> = (0..31).collect();
|
||||
|
||||
let vote_tx = vote_transaction::new_vote_transaction(
|
||||
slots,
|
||||
@ -746,15 +746,14 @@ mod tests {
|
||||
.map(|keypairs| {
|
||||
let node_keypair = &keypairs.node_keypair;
|
||||
let vote_keypair = &keypairs.vote_keypair;
|
||||
let vote_tx = vote_transaction::new_vote_transaction(
|
||||
vote_transaction::new_vote_transaction(
|
||||
vec![i as u64 + 1],
|
||||
Hash::default(),
|
||||
Hash::default(),
|
||||
node_keypair,
|
||||
vote_keypair,
|
||||
vote_keypair,
|
||||
);
|
||||
vote_tx
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
votes_sender.send(validator_votes).unwrap();
|
||||
@ -983,7 +982,7 @@ mod tests {
|
||||
assert!(packets.is_empty());
|
||||
}
|
||||
|
||||
fn verify_packets_len(packets: &Vec<(CrdsValueLabel, Packets)>, ref_value: usize) {
|
||||
fn verify_packets_len(packets: &[(CrdsValueLabel, Packets)], ref_value: usize) {
|
||||
let num_packets: usize = packets.iter().map(|p| p.1.packets.len()).sum();
|
||||
assert_eq!(num_packets, ref_value);
|
||||
}
|
||||
@ -992,22 +991,20 @@ mod tests {
|
||||
let node_keypair = Keypair::new();
|
||||
let vote_keypair = Keypair::new();
|
||||
let auth_voter_keypair = Keypair::new();
|
||||
let vote_tx = vote_transaction::new_vote_transaction(
|
||||
vote_transaction::new_vote_transaction(
|
||||
vec![0],
|
||||
Hash::default(),
|
||||
Hash::default(),
|
||||
&node_keypair,
|
||||
&vote_keypair,
|
||||
&auth_voter_keypair,
|
||||
);
|
||||
|
||||
vote_tx
|
||||
)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_verify_votes_1_pass() {
|
||||
let vote_tx = test_vote_tx();
|
||||
let votes = vec![vote_tx.clone()];
|
||||
let votes = vec![vote_tx];
|
||||
let labels = vec![CrdsValueLabel::Vote(0, Pubkey::new_rand())];
|
||||
let (vote_txs, packets) = ClusterInfoVoteListener::verify_votes(votes, labels);
|
||||
assert_eq!(vote_txs.len(), 1);
|
||||
@ -1021,10 +1018,7 @@ mod tests {
|
||||
bad_vote.signatures[0] = Signature::default();
|
||||
let votes = vec![vote_tx.clone(), bad_vote, vote_tx];
|
||||
let label = CrdsValueLabel::Vote(0, Pubkey::new_rand());
|
||||
let labels: Vec<_> = (0..votes.len())
|
||||
.into_iter()
|
||||
.map(|_| label.clone())
|
||||
.collect();
|
||||
let labels: Vec<_> = (0..votes.len()).map(|_| label.clone()).collect();
|
||||
let (vote_txs, packets) = ClusterInfoVoteListener::verify_votes(votes, labels);
|
||||
assert_eq!(vote_txs.len(), 2);
|
||||
verify_packets_len(&packets, 2);
|
||||
|
@ -248,8 +248,8 @@ mod tests {
|
||||
let mut map = HashMap::new();
|
||||
let k1 = Pubkey::new_rand();
|
||||
let k2 = Pubkey::new_rand();
|
||||
map.insert(Arc::new(k1.clone()), std::u64::MAX / 2);
|
||||
map.insert(Arc::new(k2.clone()), 0);
|
||||
map.insert(Arc::new(k1), std::u64::MAX / 2);
|
||||
map.insert(Arc::new(k2), 0);
|
||||
cs.cluster_slots
|
||||
.write()
|
||||
.unwrap()
|
||||
@ -270,14 +270,14 @@ mod tests {
|
||||
let mut map = HashMap::new();
|
||||
let k1 = Pubkey::new_rand();
|
||||
let k2 = Pubkey::new_rand();
|
||||
map.insert(Arc::new(k2.clone()), 0);
|
||||
map.insert(Arc::new(k2), 0);
|
||||
cs.cluster_slots
|
||||
.write()
|
||||
.unwrap()
|
||||
.insert(0, Arc::new(RwLock::new(map)));
|
||||
//make sure default weights are used as well
|
||||
let validator_stakes: HashMap<_, _> = vec![(
|
||||
*Arc::new(k1.clone()),
|
||||
*Arc::new(k1),
|
||||
NodeVoteAccounts {
|
||||
total_stake: std::u64::MAX / 2,
|
||||
vote_accounts: vec![Pubkey::default()],
|
||||
|
@ -415,9 +415,9 @@ mod tests {
|
||||
cache2.increase_confirmation_stake(2, 5);
|
||||
|
||||
let mut block_commitment = HashMap::new();
|
||||
block_commitment.entry(0).or_insert(cache0.clone());
|
||||
block_commitment.entry(1).or_insert(cache1.clone());
|
||||
block_commitment.entry(2).or_insert(cache2.clone());
|
||||
block_commitment.entry(0).or_insert(cache0);
|
||||
block_commitment.entry(1).or_insert(cache1);
|
||||
block_commitment.entry(2).or_insert(cache2);
|
||||
let block_commitment_cache =
|
||||
BlockCommitmentCache::new(block_commitment, 0, 50, bank, blockstore, 0);
|
||||
|
||||
@ -442,9 +442,9 @@ mod tests {
|
||||
cache2.increase_rooted_stake(20);
|
||||
|
||||
let mut block_commitment = HashMap::new();
|
||||
block_commitment.entry(1).or_insert(cache0.clone());
|
||||
block_commitment.entry(2).or_insert(cache1.clone());
|
||||
block_commitment.entry(3).or_insert(cache2.clone());
|
||||
block_commitment.entry(1).or_insert(cache0);
|
||||
block_commitment.entry(2).or_insert(cache1);
|
||||
block_commitment.entry(3).or_insert(cache2);
|
||||
let largest_confirmed_root = 1;
|
||||
let block_commitment_cache = BlockCommitmentCache::new(
|
||||
block_commitment,
|
||||
@ -484,7 +484,7 @@ mod tests {
|
||||
let lamports = 5;
|
||||
let mut vote_state = VoteState::default();
|
||||
|
||||
let root = ancestors.last().unwrap().clone();
|
||||
let root = *ancestors.last().unwrap();
|
||||
vote_state.root_slot = Some(root);
|
||||
AggregateCommitmentService::aggregate_commitment_for_vote_account(
|
||||
&mut commitment,
|
||||
|
@ -639,42 +639,39 @@ pub mod test {
|
||||
assert!(self.bank_forks.read().unwrap().get(root).is_some());
|
||||
|
||||
let mut walk = TreeWalk::from(forks);
|
||||
loop {
|
||||
if let Some(visit) = walk.get() {
|
||||
let slot = visit.node().data;
|
||||
self.progress
|
||||
.entry(slot)
|
||||
.or_insert_with(|| ForkProgress::new(Hash::default(), None, None, 0, 0));
|
||||
if self.bank_forks.read().unwrap().get(slot).is_some() {
|
||||
walk.forward();
|
||||
continue;
|
||||
}
|
||||
let parent = walk.get_parent().unwrap().data;
|
||||
let parent_bank = self.bank_forks.read().unwrap().get(parent).unwrap().clone();
|
||||
let new_bank = Bank::new_from_parent(&parent_bank, &Pubkey::default(), slot);
|
||||
for (pubkey, vote) in cluster_votes.iter() {
|
||||
if vote.contains(&parent) {
|
||||
let keypairs = self.validator_keypairs.get(pubkey).unwrap();
|
||||
let last_blockhash = parent_bank.last_blockhash();
|
||||
let vote_tx = vote_transaction::new_vote_transaction(
|
||||
// Must vote > root to be processed
|
||||
vec![parent],
|
||||
parent_bank.hash(),
|
||||
last_blockhash,
|
||||
&keypairs.node_keypair,
|
||||
&keypairs.vote_keypair,
|
||||
&keypairs.vote_keypair,
|
||||
);
|
||||
info!("voting {} {}", parent_bank.slot(), parent_bank.hash());
|
||||
new_bank.process_transaction(&vote_tx).unwrap();
|
||||
}
|
||||
}
|
||||
new_bank.freeze();
|
||||
self.bank_forks.write().unwrap().insert(new_bank);
|
||||
|
||||
while let Some(visit) = walk.get() {
|
||||
let slot = visit.node().data;
|
||||
self.progress
|
||||
.entry(slot)
|
||||
.or_insert_with(|| ForkProgress::new(Hash::default(), None, None, 0, 0));
|
||||
if self.bank_forks.read().unwrap().get(slot).is_some() {
|
||||
walk.forward();
|
||||
} else {
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
let parent = walk.get_parent().unwrap().data;
|
||||
let parent_bank = self.bank_forks.read().unwrap().get(parent).unwrap().clone();
|
||||
let new_bank = Bank::new_from_parent(&parent_bank, &Pubkey::default(), slot);
|
||||
for (pubkey, vote) in cluster_votes.iter() {
|
||||
if vote.contains(&parent) {
|
||||
let keypairs = self.validator_keypairs.get(pubkey).unwrap();
|
||||
let last_blockhash = parent_bank.last_blockhash();
|
||||
let vote_tx = vote_transaction::new_vote_transaction(
|
||||
// Must vote > root to be processed
|
||||
vec![parent],
|
||||
parent_bank.hash(),
|
||||
last_blockhash,
|
||||
&keypairs.node_keypair,
|
||||
&keypairs.vote_keypair,
|
||||
&keypairs.vote_keypair,
|
||||
);
|
||||
info!("voting {} {}", parent_bank.slot(), parent_bank.hash());
|
||||
new_bank.process_transaction(&vote_tx).unwrap();
|
||||
}
|
||||
}
|
||||
new_bank.freeze();
|
||||
self.bank_forks.write().unwrap().insert(new_bank);
|
||||
walk.forward();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1092,7 +1089,7 @@ pub mod test {
|
||||
// will only both show up in slot 48, at which point
|
||||
// 2/5 > SWITCH_FORK_THRESHOLD of the stake has voted
|
||||
// on another fork, so switching should suceed
|
||||
let votes_to_simulate = (46..=48).into_iter().collect();
|
||||
let votes_to_simulate = (46..=48).collect();
|
||||
let results = vote_simulator.create_and_vote_new_branch(
|
||||
45,
|
||||
48,
|
||||
@ -1146,11 +1143,11 @@ pub mod test {
|
||||
let mut my_votes: Vec<Slot> = vec![];
|
||||
let next_unlocked_slot = 110;
|
||||
// Vote on the first minor fork
|
||||
my_votes.extend((0..=14).into_iter());
|
||||
my_votes.extend(0..=14);
|
||||
// Come back to the main fork
|
||||
my_votes.extend((43..=44).into_iter());
|
||||
my_votes.extend(43..=44);
|
||||
// Vote on the second minor fork
|
||||
my_votes.extend((45..=50).into_iter());
|
||||
my_votes.extend(45..=50);
|
||||
// Vote to come back to main fork
|
||||
my_votes.push(next_unlocked_slot);
|
||||
cluster_votes.insert(node_pubkey, my_votes.clone());
|
||||
@ -1219,14 +1216,14 @@ pub mod test {
|
||||
|
||||
#[test]
|
||||
fn test_collect_vote_lockouts_root() {
|
||||
let votes: Vec<u64> = (0..MAX_LOCKOUT_HISTORY as u64).into_iter().collect();
|
||||
let votes: Vec<u64> = (0..MAX_LOCKOUT_HISTORY as u64).collect();
|
||||
//two accounts voting for slots 0..MAX_LOCKOUT_HISTORY with 1 token staked
|
||||
let accounts = gen_stakes(&[(1, &votes), (1, &votes)]);
|
||||
let mut tower = Tower::new_for_tests(0, 0.67);
|
||||
let mut ancestors = HashMap::new();
|
||||
for i in 0..(MAX_LOCKOUT_HISTORY + 1) {
|
||||
tower.record_vote(i as u64, Hash::default());
|
||||
ancestors.insert(i as u64, (0..i as u64).into_iter().collect());
|
||||
ancestors.insert(i as u64, (0..i as u64).collect());
|
||||
}
|
||||
let root = Lockout {
|
||||
confirmation_count: MAX_LOCKOUT_HISTORY as u32,
|
||||
|
@ -228,7 +228,6 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_is_valid_address() {
|
||||
assert!(cfg!(test));
|
||||
let bad_address_port = socketaddr!("127.0.0.1:0");
|
||||
assert!(!ContactInfo::is_valid_address(&bad_address_port));
|
||||
let bad_address_unspecified = socketaddr!(0, 1234);
|
||||
|
@ -246,7 +246,7 @@ mod test {
|
||||
let mut ci = ContactInfo::default();
|
||||
ci.wallclock += 1;
|
||||
let val3 = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
assert_matches!(crds.insert(val3.clone(), 3), Ok(Some(_)));
|
||||
assert_matches!(crds.insert(val3, 3), Ok(Some(_)));
|
||||
assert_eq!(crds.table[&val2.label()].local_timestamp, 3);
|
||||
assert_eq!(crds.table[&val2.label()].insert_timestamp, 3);
|
||||
}
|
||||
@ -315,14 +315,18 @@ mod test {
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(clippy::neg_cmp_op_on_partial_ord)]
|
||||
fn test_equal() {
|
||||
let val = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::default()));
|
||||
let v1 = VersionedCrdsValue::new(1, val.clone());
|
||||
let v2 = VersionedCrdsValue::new(1, val);
|
||||
assert_eq!(v1, v2);
|
||||
assert!(!(v1 != v2));
|
||||
assert_eq!(v1.partial_cmp(&v2), Some(cmp::Ordering::Equal));
|
||||
assert_eq!(v2.partial_cmp(&v1), Some(cmp::Ordering::Equal));
|
||||
}
|
||||
#[test]
|
||||
#[allow(clippy::neg_cmp_op_on_partial_ord)]
|
||||
fn test_hash_order() {
|
||||
let v1 = VersionedCrdsValue::new(
|
||||
1,
|
||||
@ -345,14 +349,19 @@ mod test {
|
||||
if v1 > v2 {
|
||||
assert!(v1 > v2);
|
||||
assert!(v2 < v1);
|
||||
assert_eq!(v1.partial_cmp(&v2), Some(cmp::Ordering::Greater));
|
||||
assert_eq!(v2.partial_cmp(&v1), Some(cmp::Ordering::Less));
|
||||
} else if v2 > v1 {
|
||||
assert!(v1 < v2);
|
||||
assert!(v2 > v1);
|
||||
assert_eq!(v1.partial_cmp(&v2), Some(cmp::Ordering::Less));
|
||||
assert_eq!(v2.partial_cmp(&v1), Some(cmp::Ordering::Greater));
|
||||
} else {
|
||||
panic!("bad PartialOrd implementation?");
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
#[allow(clippy::neg_cmp_op_on_partial_ord)]
|
||||
fn test_wallclock_order() {
|
||||
let v1 = VersionedCrdsValue::new(
|
||||
1,
|
||||
@ -373,8 +382,11 @@ mod test {
|
||||
assert!(!(v1 < v2));
|
||||
assert!(v1 != v2);
|
||||
assert!(!(v1 == v2));
|
||||
assert_eq!(v1.partial_cmp(&v2), Some(cmp::Ordering::Greater));
|
||||
assert_eq!(v2.partial_cmp(&v1), Some(cmp::Ordering::Less));
|
||||
}
|
||||
#[test]
|
||||
#[allow(clippy::neg_cmp_op_on_partial_ord)]
|
||||
fn test_label_order() {
|
||||
let v1 = VersionedCrdsValue::new(
|
||||
1,
|
||||
@ -396,5 +408,7 @@ mod test {
|
||||
assert!(!(v1 > v2));
|
||||
assert!(!(v2 < v1));
|
||||
assert!(!(v2 > v1));
|
||||
assert_eq!(v1.partial_cmp(&v2), None);
|
||||
assert_eq!(v2.partial_cmp(&v1), None);
|
||||
}
|
||||
}
|
||||
|
@ -431,25 +431,25 @@ mod test {
|
||||
let me = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 123,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let spy = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 0,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let node_123 = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 123,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let node_456 = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 456,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
|
||||
@ -560,12 +560,12 @@ mod test {
|
||||
)));
|
||||
let node_pubkey = entry.label().pubkey();
|
||||
let node = CrdsGossipPull::default();
|
||||
node_crds.insert(entry.clone(), 0).unwrap();
|
||||
node_crds.insert(entry, 0).unwrap();
|
||||
let new = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::new_localhost(
|
||||
&Pubkey::new_rand(),
|
||||
0,
|
||||
)));
|
||||
node_crds.insert(new.clone(), 0).unwrap();
|
||||
node_crds.insert(new, 0).unwrap();
|
||||
let req = node.new_pull_request(
|
||||
&node_crds,
|
||||
&node_pubkey,
|
||||
@ -606,13 +606,13 @@ mod test {
|
||||
)));
|
||||
let node_pubkey = entry.label().pubkey();
|
||||
let mut node = CrdsGossipPull::default();
|
||||
node_crds.insert(entry.clone(), 0).unwrap();
|
||||
node_crds.insert(entry, 0).unwrap();
|
||||
|
||||
let new = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::new_localhost(
|
||||
&Pubkey::new_rand(),
|
||||
0,
|
||||
)));
|
||||
node_crds.insert(new.clone(), 0).unwrap();
|
||||
node_crds.insert(new, 0).unwrap();
|
||||
|
||||
let mut dest = CrdsGossipPull::default();
|
||||
let mut dest_crds = Crds::default();
|
||||
@ -698,7 +698,7 @@ mod test {
|
||||
let node_label = entry.label();
|
||||
let node_pubkey = node_label.pubkey();
|
||||
let mut node = CrdsGossipPull::default();
|
||||
node_crds.insert(entry.clone(), 0).unwrap();
|
||||
node_crds.insert(entry, 0).unwrap();
|
||||
let old = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::new_localhost(
|
||||
&Pubkey::new_rand(),
|
||||
0,
|
||||
@ -731,6 +731,7 @@ mod test {
|
||||
assert_eq!(node.purged_values.len(), 0);
|
||||
}
|
||||
#[test]
|
||||
#[allow(clippy::float_cmp)]
|
||||
fn test_crds_filter_mask() {
|
||||
let filter = CrdsFilter::new_rand(1, 128);
|
||||
assert_eq!(filter.mask, !0x0);
|
||||
@ -738,7 +739,7 @@ mod test {
|
||||
//1000/9 = 111, so 7 bits are needed to mask it
|
||||
assert_eq!(CrdsFilter::mask_bits(1000f64, 9f64), 7u32);
|
||||
let filter = CrdsFilter::new_rand(1000, 10);
|
||||
assert_eq!(filter.mask & 0x00ffffffff, 0x00ffffffff);
|
||||
assert_eq!(filter.mask & 0x00_ffff_ffff, 0x00_ffff_ffff);
|
||||
}
|
||||
#[test]
|
||||
fn test_crds_filter_add_no_mask() {
|
||||
@ -800,7 +801,6 @@ mod test {
|
||||
}
|
||||
fn run_test_mask(mask_bits: u32) {
|
||||
let masks: Vec<_> = (0..2u64.pow(mask_bits))
|
||||
.into_iter()
|
||||
.map(|seed| CrdsFilter::compute_mask(seed, mask_bits))
|
||||
.dedup()
|
||||
.collect();
|
||||
@ -854,7 +854,7 @@ mod test {
|
||||
&mut node_crds,
|
||||
&peer_pubkey,
|
||||
&timeouts,
|
||||
vec![peer_entry.clone()],
|
||||
vec![peer_entry],
|
||||
node.msg_timeout + 1,
|
||||
),
|
||||
0
|
||||
@ -883,7 +883,7 @@ mod test {
|
||||
&mut node_crds,
|
||||
&peer_pubkey,
|
||||
&timeouts,
|
||||
vec![peer_vote.clone()],
|
||||
vec![peer_vote],
|
||||
node.msg_timeout + 1,
|
||||
),
|
||||
1
|
||||
|
@ -393,7 +393,7 @@ mod test {
|
||||
let high_staked_peer = Pubkey::new_rand();
|
||||
let high_stake = CrdsGossipPush::prune_stake_threshold(100, 100) + 10;
|
||||
stakes.insert(high_staked_peer, high_stake);
|
||||
let _ = push.process_push_message(&mut crds, &high_staked_peer, value.clone(), 0);
|
||||
let _ = push.process_push_message(&mut crds, &high_staked_peer, value, 0);
|
||||
|
||||
let pruned = push.prune_received_cache(&self_id, &origin, hash, &stakes);
|
||||
assert!(
|
||||
@ -426,7 +426,7 @@ mod test {
|
||||
|
||||
// push it again
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value.clone(), 0),
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value, 0),
|
||||
Err(CrdsGossipError::PushMessageAlreadyReceived)
|
||||
);
|
||||
}
|
||||
@ -446,7 +446,7 @@ mod test {
|
||||
|
||||
// push an old version
|
||||
ci.wallclock = 0;
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci.clone()));
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value, 0),
|
||||
Err(CrdsGossipError::PushMessageOldVersion)
|
||||
@ -469,7 +469,7 @@ mod test {
|
||||
|
||||
// push a version to far in the past
|
||||
ci.wallclock = 0;
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci.clone()));
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value, timeout + 1),
|
||||
Err(CrdsGossipError::PushMessageTimeout)
|
||||
@ -491,7 +491,7 @@ mod test {
|
||||
|
||||
// push an old version
|
||||
ci.wallclock = 1;
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci.clone()));
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value, 0)
|
||||
.unwrap()
|
||||
@ -580,25 +580,25 @@ mod test {
|
||||
let me = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 123,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let spy = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 0,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let node_123 = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 123,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
let node_456 = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo {
|
||||
id: Pubkey::new_rand(),
|
||||
shred_version: 456,
|
||||
gossip: gossip.clone(),
|
||||
gossip,
|
||||
..ContactInfo::default()
|
||||
}));
|
||||
|
||||
@ -683,7 +683,7 @@ mod test {
|
||||
)));
|
||||
let mut expected = HashMap::new();
|
||||
expected.insert(peer_1.pubkey(), vec![new_msg.clone()]);
|
||||
expected.insert(peer_2.pubkey(), vec![new_msg.clone()]);
|
||||
expected.insert(peer_2.pubkey(), vec![new_msg]);
|
||||
assert_eq!(push.active_set.len(), 3);
|
||||
assert_eq!(push.new_push_messages(&crds, 0), expected);
|
||||
}
|
||||
@ -718,15 +718,15 @@ mod test {
|
||||
&Pubkey::new_rand(),
|
||||
0,
|
||||
)));
|
||||
assert_eq!(crds.insert(peer.clone(), 0), Ok(None));
|
||||
assert_eq!(crds.insert(peer, 0), Ok(None));
|
||||
push.refresh_push_active_set(&crds, &HashMap::new(), &Pubkey::default(), 0, 1, 1);
|
||||
|
||||
let mut ci = ContactInfo::new_localhost(&Pubkey::new_rand(), 0);
|
||||
ci.wallclock = 1;
|
||||
let new_msg = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci.clone()));
|
||||
let new_msg = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
let expected = HashMap::new();
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), new_msg.clone(), 1),
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), new_msg, 1),
|
||||
Ok(None)
|
||||
);
|
||||
push.purge_old_pending_push_messages(&crds, 0);
|
||||
@ -739,7 +739,7 @@ mod test {
|
||||
let mut push = CrdsGossipPush::default();
|
||||
let mut ci = ContactInfo::new_localhost(&Pubkey::new_rand(), 0);
|
||||
ci.wallclock = 0;
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci.clone()));
|
||||
let value = CrdsValue::new_unsigned(CrdsData::ContactInfo(ci));
|
||||
let label = value.label();
|
||||
// push a new message
|
||||
assert_eq!(
|
||||
@ -759,7 +759,7 @@ mod test {
|
||||
|
||||
// push it again
|
||||
assert_eq!(
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value.clone(), 0),
|
||||
push.process_push_message(&mut crds, &Pubkey::default(), value, 0),
|
||||
Err(CrdsGossipError::PushMessageOldVersion)
|
||||
);
|
||||
}
|
||||
|
@ -487,21 +487,21 @@ mod test {
|
||||
|
||||
let mut o = ls.clone();
|
||||
o.root = 1;
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o.clone()));
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o));
|
||||
assert_eq!(v.sanitize(), Err(SanitizeError::InvalidValue));
|
||||
|
||||
let o = ls.clone();
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(1, o.clone()));
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(1, o));
|
||||
assert_eq!(v.sanitize(), Err(SanitizeError::ValueOutOfBounds));
|
||||
|
||||
let mut o = ls.clone();
|
||||
o.slots.insert(1);
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o.clone()));
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o));
|
||||
assert_eq!(v.sanitize(), Err(SanitizeError::InvalidValue));
|
||||
|
||||
let mut o = ls.clone();
|
||||
let mut o = ls;
|
||||
o.stash.push(deprecated::EpochIncompleteSlots::default());
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o.clone()));
|
||||
let v = CrdsValue::new_unsigned(CrdsData::LowestSlot(0, o));
|
||||
assert_eq!(v.sanitize(), Err(SanitizeError::InvalidValue));
|
||||
}
|
||||
|
||||
|
@ -400,24 +400,24 @@ mod tests {
|
||||
o.first_slot = MAX_SLOT;
|
||||
assert_eq!(o.sanitize(), Err(SanitizeError::ValueOutOfBounds));
|
||||
|
||||
let mut o = compressed.clone();
|
||||
let mut o = compressed;
|
||||
o.num = MAX_SLOTS_PER_ENTRY;
|
||||
assert_eq!(o.sanitize(), Err(SanitizeError::ValueOutOfBounds));
|
||||
|
||||
let mut slots = EpochSlots::default();
|
||||
let range: Vec<Slot> = (0..5000).into_iter().collect();
|
||||
let range: Vec<Slot> = (0..5000).collect();
|
||||
assert_eq!(slots.fill(&range, 1), 5000);
|
||||
assert_eq!(slots.wallclock, 1);
|
||||
assert!(slots.sanitize().is_ok());
|
||||
|
||||
let mut o = slots.clone();
|
||||
let mut o = slots;
|
||||
o.wallclock = MAX_WALLCLOCK;
|
||||
assert_eq!(o.sanitize(), Err(SanitizeError::ValueOutOfBounds));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_epoch_slots_fill_range() {
|
||||
let range: Vec<Slot> = (0..5000).into_iter().collect();
|
||||
let range: Vec<Slot> = (0..5000).collect();
|
||||
let mut slots = EpochSlots::default();
|
||||
assert_eq!(slots.fill(&range, 1), 5000);
|
||||
assert_eq!(slots.wallclock, 1);
|
||||
@ -427,7 +427,7 @@ mod tests {
|
||||
}
|
||||
#[test]
|
||||
fn test_epoch_slots_fill_sparce_range() {
|
||||
let range: Vec<Slot> = (0..5000).into_iter().map(|x| x * 3).collect();
|
||||
let range: Vec<Slot> = (0..5000).map(|x| x * 3).collect();
|
||||
let mut slots = EpochSlots::default();
|
||||
assert_eq!(slots.fill(&range, 2), 5000);
|
||||
assert_eq!(slots.wallclock, 2);
|
||||
@ -444,7 +444,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_epoch_slots_fill_large_sparce_range() {
|
||||
let range: Vec<Slot> = (0..5000).into_iter().map(|x| x * 7).collect();
|
||||
let range: Vec<Slot> = (0..5000).map(|x| x * 7).collect();
|
||||
let mut slots = EpochSlots::default();
|
||||
assert_eq!(slots.fill(&range, 2), 5000);
|
||||
assert_eq!(slots.to_slots(0), range);
|
||||
|
@ -294,7 +294,7 @@ mod tests {
|
||||
let contact_info = ContactInfo::new_localhost(&keypair.pubkey(), 0);
|
||||
let peer0_info = ContactInfo::new_localhost(&peer0, 0);
|
||||
let peer1_info = ContactInfo::new_localhost(&peer1, 0);
|
||||
let cluster_info = ClusterInfo::new(contact_info.clone(), Arc::new(keypair));
|
||||
let cluster_info = ClusterInfo::new(contact_info, Arc::new(keypair));
|
||||
cluster_info.insert_info(peer0_info.clone());
|
||||
cluster_info.insert_info(peer1_info);
|
||||
|
||||
@ -343,7 +343,7 @@ mod tests {
|
||||
assert_eq!(met_criteria, true);
|
||||
|
||||
let (met_criteria, _, _, _) = spy(
|
||||
spy_ref.clone(),
|
||||
spy_ref,
|
||||
None,
|
||||
Some(0),
|
||||
None,
|
||||
|
@ -180,7 +180,7 @@ mod tests {
|
||||
bank = Arc::new(new_from_parent(&bank));
|
||||
}
|
||||
assert_eq!(bank.epoch(), 1);
|
||||
let non_circulating_supply = calculate_non_circulating_supply(bank.clone());
|
||||
let non_circulating_supply = calculate_non_circulating_supply(bank);
|
||||
assert_eq!(
|
||||
non_circulating_supply.lamports,
|
||||
num_non_circulating_accounts * new_balance
|
||||
|
@ -759,9 +759,7 @@ mod tests {
|
||||
poh_recorder.tick();
|
||||
let tx = test_tx();
|
||||
let h1 = hash(b"hello world!");
|
||||
assert!(poh_recorder
|
||||
.record(bank.slot(), h1, vec![tx.clone()])
|
||||
.is_err());
|
||||
assert!(poh_recorder.record(bank.slot(), h1, vec![tx]).is_err());
|
||||
assert!(entry_receiver.try_recv().is_err());
|
||||
}
|
||||
Blockstore::destroy(&ledger_path).unwrap();
|
||||
@ -800,7 +798,7 @@ mod tests {
|
||||
let tx = test_tx();
|
||||
let h1 = hash(b"hello world!");
|
||||
assert_matches!(
|
||||
poh_recorder.record(bank.slot() + 1, h1, vec![tx.clone()]),
|
||||
poh_recorder.record(bank.slot() + 1, h1, vec![tx]),
|
||||
Err(PohRecorderError::MaxHeightReached)
|
||||
);
|
||||
}
|
||||
@ -839,9 +837,7 @@ mod tests {
|
||||
assert_eq!(poh_recorder.tick_height, 1);
|
||||
let tx = test_tx();
|
||||
let h1 = hash(b"hello world!");
|
||||
assert!(poh_recorder
|
||||
.record(bank.slot(), h1, vec![tx.clone()])
|
||||
.is_ok());
|
||||
assert!(poh_recorder.record(bank.slot(), h1, vec![tx]).is_ok());
|
||||
assert_eq!(poh_recorder.tick_cache.len(), 0);
|
||||
|
||||
//tick in the cache + entry
|
||||
@ -885,9 +881,7 @@ mod tests {
|
||||
assert_eq!(poh_recorder.tick_height, 2);
|
||||
let tx = test_tx();
|
||||
let h1 = hash(b"hello world!");
|
||||
assert!(poh_recorder
|
||||
.record(bank.slot(), h1, vec![tx.clone()])
|
||||
.is_err());
|
||||
assert!(poh_recorder.record(bank.slot(), h1, vec![tx]).is_err());
|
||||
|
||||
let (_bank, (entry, _tick_height)) = entry_receiver.recv().unwrap();
|
||||
assert!(entry.is_tick());
|
||||
@ -1122,9 +1116,7 @@ mod tests {
|
||||
|
||||
let tx = test_tx();
|
||||
let h1 = hash(b"hello world!");
|
||||
assert!(poh_recorder
|
||||
.record(bank.slot(), h1, vec![tx.clone()])
|
||||
.is_err());
|
||||
assert!(poh_recorder.record(bank.slot(), h1, vec![tx]).is_err());
|
||||
assert!(poh_recorder.working_bank.is_none());
|
||||
// Make sure the starting slot is updated
|
||||
assert_eq!(poh_recorder.start_slot, end_slot);
|
||||
|
@ -225,8 +225,8 @@ mod tests {
|
||||
}
|
||||
}
|
||||
exit.store(true, Ordering::Relaxed);
|
||||
let _ = poh_service.join().unwrap();
|
||||
let _ = entry_producer.join().unwrap();
|
||||
poh_service.join().unwrap();
|
||||
entry_producer.join().unwrap();
|
||||
}
|
||||
Blockstore::destroy(&ledger_path).unwrap();
|
||||
}
|
||||
|
@ -424,7 +424,7 @@ mod test {
|
||||
fn test_add_node_pubkey_internal() {
|
||||
let num_vote_accounts = 10;
|
||||
let staked_vote_accounts = 5;
|
||||
let vote_account_pubkeys: Vec<_> = std::iter::repeat_with(|| Pubkey::new_rand())
|
||||
let vote_account_pubkeys: Vec<_> = std::iter::repeat_with(Pubkey::new_rand)
|
||||
.take(num_vote_accounts)
|
||||
.collect();
|
||||
let epoch_vote_accounts: HashMap<_, _> = vote_account_pubkeys
|
||||
@ -491,7 +491,7 @@ mod test {
|
||||
// Addding another pubkey with different vote accounts should succeed
|
||||
// and increase stake
|
||||
node_pubkey = Pubkey::new_rand();
|
||||
let vote_account_pubkeys: Vec<_> = std::iter::repeat_with(|| Pubkey::new_rand())
|
||||
let vote_account_pubkeys: Vec<_> = std::iter::repeat_with(Pubkey::new_rand)
|
||||
.take(num_vote_accounts)
|
||||
.collect();
|
||||
let epoch_vote_accounts: HashMap<_, _> = vote_account_pubkeys
|
||||
|
@ -828,7 +828,7 @@ mod test {
|
||||
#[test]
|
||||
pub fn test_update_lowest_slot() {
|
||||
let node_info = Node::new_localhost_with_pubkey(&Pubkey::default());
|
||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(node_info.info.clone());
|
||||
let cluster_info = ClusterInfo::new_with_invalid_keypair(node_info.info);
|
||||
RepairService::update_lowest_slot(&Pubkey::default(), 5, &cluster_info);
|
||||
let lowest = cluster_info
|
||||
.get_lowest_slot_for_node(&Pubkey::default(), None, |lowest_slot, _| {
|
||||
@ -889,7 +889,7 @@ mod test {
|
||||
.insert_shreds(shreds[..shreds.len() - 1].to_vec(), None, false)
|
||||
.unwrap();
|
||||
|
||||
duplicate_slot_repair_statuses.insert(dead_slot, duplicate_status.clone());
|
||||
duplicate_slot_repair_statuses.insert(dead_slot, duplicate_status);
|
||||
|
||||
// There is no repair_addr, so should not get filtered because the timeout
|
||||
// `std::u64::MAX` has not expired
|
||||
|
@ -1842,8 +1842,8 @@ pub(crate) mod tests {
|
||||
|
||||
fn simulate_fork_selection(
|
||||
neutral_fork: &ForkInfo,
|
||||
forks: &Vec<ForkInfo>,
|
||||
validators: &Vec<ValidatorInfo>,
|
||||
forks: &[ForkInfo],
|
||||
validators: &[ValidatorInfo],
|
||||
) -> Vec<Option<ForkSelectionResponse>> {
|
||||
fn vote(bank: &Arc<Bank>, pubkey: &Pubkey, slot: Slot) {
|
||||
let mut vote_account = bank.get_account(&pubkey).unwrap();
|
||||
@ -2031,19 +2031,18 @@ pub(crate) mod tests {
|
||||
let (heaviest_bank, _) = ReplayStage::select_forks(
|
||||
&frozen_banks,
|
||||
&towers[i],
|
||||
&mut fork_progresses[i],
|
||||
&fork_progresses[i],
|
||||
&bank_fork_ancestors,
|
||||
);
|
||||
|
||||
if heaviest_bank.is_none() {
|
||||
None
|
||||
} else {
|
||||
let bank = heaviest_bank.unwrap();
|
||||
if let Some(bank) = heaviest_bank {
|
||||
let stats = &fork_progresses[i].get_fork_stats(bank.slot()).unwrap();
|
||||
Some(ForkSelectionResponse {
|
||||
slot: bank.slot(),
|
||||
is_locked_out: stats.is_locked_out,
|
||||
})
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
@ -2388,7 +2387,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::InvalidEntryHash);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2413,7 +2412,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::InvalidTickHashCount);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2436,7 +2435,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::InvalidTickCount);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
|
||||
// Too few ticks per slot
|
||||
@ -2456,7 +2455,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::InvalidTickCount);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2478,7 +2477,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::InvalidLastTick);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2490,7 +2489,7 @@ pub(crate) mod tests {
|
||||
let slot = bank.slot();
|
||||
let hashes_per_tick = bank.hashes_per_tick().unwrap_or(0);
|
||||
let mut entries =
|
||||
entry::create_ticks(bank.ticks_per_slot(), hashes_per_tick, blockhash.clone());
|
||||
entry::create_ticks(bank.ticks_per_slot(), hashes_per_tick, blockhash);
|
||||
let last_entry_hash = entries.last().unwrap().hash;
|
||||
let tx =
|
||||
system_transaction::transfer(&genesis_keypair, &keypair.pubkey(), 2, blockhash);
|
||||
@ -2502,7 +2501,7 @@ pub(crate) mod tests {
|
||||
if let Err(BlockstoreProcessorError::InvalidBlock(block_error)) = res {
|
||||
assert_eq!(block_error, BlockError::TrailingEntry);
|
||||
} else {
|
||||
assert!(false);
|
||||
panic!();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2597,7 +2596,7 @@ pub(crate) mod tests {
|
||||
let ledger_path = get_tmp_ledger_path!();
|
||||
let blockstore = Arc::new(Blockstore::open(&ledger_path).unwrap());
|
||||
let block_commitment_cache = Arc::new(RwLock::new(
|
||||
BlockCommitmentCache::default_with_blockstore(blockstore.clone()),
|
||||
BlockCommitmentCache::default_with_blockstore(blockstore),
|
||||
));
|
||||
let (lockouts_sender, _) = AggregateCommitmentService::new(
|
||||
&Arc::new(AtomicBool::new(false)),
|
||||
@ -2659,12 +2658,7 @@ pub(crate) mod tests {
|
||||
bank_forks.write().unwrap().insert(bank2);
|
||||
let arc_bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
||||
leader_vote(&arc_bank2, &leader_voting_pubkey);
|
||||
ReplayStage::update_commitment_cache(
|
||||
arc_bank2.clone(),
|
||||
0,
|
||||
leader_lamports,
|
||||
&lockouts_sender,
|
||||
);
|
||||
ReplayStage::update_commitment_cache(arc_bank2, 0, leader_lamports, &lockouts_sender);
|
||||
thread::sleep(Duration::from_millis(200));
|
||||
|
||||
let mut expected0 = BlockCommitment::default();
|
||||
@ -2736,7 +2730,7 @@ pub(crate) mod tests {
|
||||
let (transaction_status_sender, transaction_status_receiver) = unbounded();
|
||||
let transaction_status_service = TransactionStatusService::new(
|
||||
transaction_status_receiver,
|
||||
blockstore.clone(),
|
||||
blockstore,
|
||||
&Arc::new(AtomicBool::new(false)),
|
||||
);
|
||||
|
||||
@ -3423,7 +3417,7 @@ pub(crate) mod tests {
|
||||
let vote_tracker = VoteTracker::new(&bank_forks.root_bank());
|
||||
for vote_pubkey in &vote_pubkeys {
|
||||
// Insert a vote for the last bank for each voter
|
||||
vote_tracker.insert_vote(10, Arc::new(vote_pubkey.clone()));
|
||||
vote_tracker.insert_vote(10, Arc::new(*vote_pubkey));
|
||||
}
|
||||
|
||||
// The last bank should reach propagation threshold, and propagate it all
|
||||
@ -3514,7 +3508,7 @@ pub(crate) mod tests {
|
||||
|
||||
let vote_tracker = VoteTracker::new(&bank_forks.root_bank());
|
||||
// Insert a new vote
|
||||
vote_tracker.insert_vote(10, Arc::new(vote_pubkeys[2].clone()));
|
||||
vote_tracker.insert_vote(10, Arc::new(vote_pubkeys[2]));
|
||||
|
||||
// The last bank should reach propagation threshold, and propagate it all
|
||||
// the way back through earlier leader banks
|
||||
|
@ -136,7 +136,6 @@ impl std::convert::From<snapshot_utils::SnapshotError> for Error {
|
||||
mod tests {
|
||||
use crate::result::Error;
|
||||
use crate::result::Result;
|
||||
use serde_json;
|
||||
use std::io;
|
||||
use std::io::Write;
|
||||
use std::net::SocketAddr;
|
||||
@ -147,18 +146,15 @@ mod tests {
|
||||
use std::thread;
|
||||
|
||||
fn addr_parse_error() -> Result<SocketAddr> {
|
||||
let r = "12fdfasfsafsadfs".parse()?;
|
||||
Ok(r)
|
||||
Ok("12fdfasfsafsadfs".parse()?)
|
||||
}
|
||||
|
||||
fn join_error() -> Result<()> {
|
||||
panic::set_hook(Box::new(|_info| {}));
|
||||
let r = thread::spawn(|| panic!("hi")).join()?;
|
||||
Ok(r)
|
||||
Ok(thread::spawn(|| panic!("hi")).join()?)
|
||||
}
|
||||
fn json_error() -> Result<()> {
|
||||
let r = serde_json::from_slice("=342{;;;;:}".as_bytes())?;
|
||||
Ok(r)
|
||||
Ok(serde_json::from_slice(b"=342{;;;;:}")?)
|
||||
}
|
||||
fn send_error() -> Result<()> {
|
||||
let (s, r) = channel();
|
||||
|
@ -1568,12 +1568,8 @@ pub mod tests {
|
||||
let mut commitment_slot1 = BlockCommitment::default();
|
||||
commitment_slot1.increase_confirmation_stake(1, 9);
|
||||
let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new();
|
||||
block_commitment
|
||||
.entry(0)
|
||||
.or_insert(commitment_slot0.clone());
|
||||
block_commitment
|
||||
.entry(1)
|
||||
.or_insert(commitment_slot1.clone());
|
||||
block_commitment.entry(0).or_insert(commitment_slot0);
|
||||
block_commitment.entry(1).or_insert(commitment_slot1);
|
||||
let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::new(
|
||||
block_commitment,
|
||||
0,
|
||||
@ -1609,7 +1605,7 @@ pub mod tests {
|
||||
blockstore.insert_shreds(shreds, None, false).unwrap();
|
||||
blockstore.set_roots(&[1]).unwrap();
|
||||
|
||||
let mut roots = blockstore_roots.clone();
|
||||
let mut roots = blockstore_roots;
|
||||
if !roots.is_empty() {
|
||||
roots.retain(|&x| x > 0);
|
||||
let mut parent_bank = bank;
|
||||
@ -1751,7 +1747,8 @@ pub mod tests {
|
||||
..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getClusterNodes"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getClusterNodes"}"#;
|
||||
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -1777,7 +1774,7 @@ pub mod tests {
|
||||
..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getSlotLeader"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getSlotLeader"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","result":"{}","id":1}}"#, leader_pubkey);
|
||||
let expected: Response =
|
||||
@ -1792,9 +1789,9 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getTransactionCount"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getTransactionCount"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","result":4,"id":1}}"#);
|
||||
let expected = r#"{"jsonrpc":"2.0","result":4,"id":1}"#;
|
||||
let expected: Response =
|
||||
serde_json::from_str(&expected).expect("expected response deserialization");
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
@ -1807,7 +1804,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"minimumLedgerSlot"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"minimumLedgerSlot"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = r#"{"jsonrpc":"2.0","result":0,"id":1}"#;
|
||||
let expected: Response =
|
||||
@ -1822,7 +1819,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getTotalSupply"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getTotalSupply"}"#;
|
||||
let rep = io.handle_request_sync(&req, meta);
|
||||
let res: Response = serde_json::from_str(&rep.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -1846,8 +1843,8 @@ pub mod tests {
|
||||
fn test_get_supply() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getSupply"}}"#);
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getSupply"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let json: Value = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
let supply: RpcSupply = serde_json::from_value(json["result"]["value"].clone())
|
||||
.expect("actual response deserialization");
|
||||
@ -1873,7 +1870,7 @@ pub mod tests {
|
||||
let RpcHandler {
|
||||
io, meta, alice, ..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts"}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let json: Value = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
let largest_accounts: Vec<RpcAccountBalance> =
|
||||
@ -1910,19 +1907,15 @@ pub mod tests {
|
||||
}));
|
||||
|
||||
// Test Circulating/NonCirculating Filter
|
||||
let req = format!(
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts","params":[{{"filter":"circulating"}}]}}"#
|
||||
);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts","params":[{"filter":"circulating"}]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let json: Value = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
let largest_accounts: Vec<RpcAccountBalance> =
|
||||
serde_json::from_value(json["result"]["value"].clone())
|
||||
.expect("actual response deserialization");
|
||||
assert_eq!(largest_accounts.len(), 18);
|
||||
let req = format!(
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts","params":[{{"filter":"nonCirculating"}}]}}"#
|
||||
);
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getLargestAccounts","params":[{"filter":"nonCirculating"}]}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let json: Value = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
let largest_accounts: Vec<RpcAccountBalance> =
|
||||
serde_json::from_value(json["result"]["value"].clone())
|
||||
@ -1967,7 +1960,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getInflation"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getInflation"}"#;
|
||||
let rep = io.handle_request_sync(&req, meta);
|
||||
let res: Response = serde_json::from_str(&rep.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -1988,7 +1981,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, bank, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getEpochSchedule"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getEpochSchedule"}"#;
|
||||
let rep = io.handle_request_sync(&req, meta);
|
||||
let res: Response = serde_json::from_str(&rep.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2284,7 +2277,7 @@ pub mod tests {
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["{}"]]}}"#,
|
||||
confirmed_block_signatures[1]
|
||||
);
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected_res: transaction::Result<()> = Err(TransactionError::InstructionError(
|
||||
0,
|
||||
InstructionError::Custom(1),
|
||||
@ -2306,7 +2299,7 @@ pub mod tests {
|
||||
..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getRecentBlockhash"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getRecentBlockhash"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = json!({
|
||||
"jsonrpc": "2.0",
|
||||
@ -2359,7 +2352,7 @@ pub mod tests {
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getFeeCalculatorForBlockhash","params":["{:?}"]}}"#,
|
||||
Hash::default()
|
||||
);
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = json!({
|
||||
"jsonrpc": "2.0",
|
||||
"result": {
|
||||
@ -2380,7 +2373,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getFeeRateGovernor"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getFeeRateGovernor"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = json!({
|
||||
"jsonrpc": "2.0",
|
||||
@ -2453,7 +2446,7 @@ pub mod tests {
|
||||
};
|
||||
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"sendTransaction","params":["37u9WtQpcm6ULa3Vmu7ySnANv"]}"#;
|
||||
let res = io.handle_request_sync(req, meta.clone());
|
||||
let res = io.handle_request_sync(req, meta);
|
||||
let expected =
|
||||
r#"{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request"},"id":1}"#;
|
||||
let expected: Response =
|
||||
@ -2573,7 +2566,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getIdentity"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getIdentity"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = json!({
|
||||
"jsonrpc": "2.0",
|
||||
@ -2594,7 +2587,7 @@ pub mod tests {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let RpcHandler { io, meta, .. } = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getVersion"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getVersion"}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = json!({
|
||||
"jsonrpc": "2.0",
|
||||
@ -2623,10 +2616,10 @@ pub mod tests {
|
||||
let mut block_commitment: HashMap<u64, BlockCommitment> = HashMap::new();
|
||||
block_commitment
|
||||
.entry(0)
|
||||
.or_insert(commitment_slot0.clone());
|
||||
.or_insert_with(|| commitment_slot0.clone());
|
||||
block_commitment
|
||||
.entry(1)
|
||||
.or_insert(commitment_slot1.clone());
|
||||
.or_insert_with(|| commitment_slot1.clone());
|
||||
let block_commitment_cache = Arc::new(RwLock::new(BlockCommitmentCache::new(
|
||||
block_commitment,
|
||||
0,
|
||||
@ -2678,8 +2671,7 @@ pub mod tests {
|
||||
..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getBlockCommitment","params":[0]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getBlockCommitment","params":[0]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2705,8 +2697,7 @@ pub mod tests {
|
||||
);
|
||||
assert_eq!(total_stake, 10);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getBlockCommitment","params":[2]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getBlockCommitment","params":[2]}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2735,8 +2726,7 @@ pub mod tests {
|
||||
..
|
||||
} = start_rpc_handler_with_tx(&bob_pubkey);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlock","params":[0]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlock","params":[0]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2776,9 +2766,7 @@ pub mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
let req = format!(
|
||||
r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlock","params":[0, "binary"]}}"#
|
||||
);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlock","params":[0,"binary"]}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2836,40 +2824,35 @@ pub mod tests {
|
||||
.unwrap()
|
||||
.set_get_largest_confirmed_root(8);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
let confirmed_blocks: Vec<Slot> = serde_json::from_value(result["result"].clone()).unwrap();
|
||||
assert_eq!(confirmed_blocks, roots[1..].to_vec());
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[2]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[2]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
let confirmed_blocks: Vec<Slot> = serde_json::from_value(result["result"].clone()).unwrap();
|
||||
assert_eq!(confirmed_blocks, vec![3, 4, 8]);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0, 4]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0,4]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
let confirmed_blocks: Vec<Slot> = serde_json::from_value(result["result"].clone()).unwrap();
|
||||
assert_eq!(confirmed_blocks, vec![1, 3, 4]);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0, 7]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[0,7]}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
let confirmed_blocks: Vec<Slot> = serde_json::from_value(result["result"].clone()).unwrap();
|
||||
assert_eq!(confirmed_blocks, vec![1, 3, 4]);
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[9, 11]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getConfirmedBlocks","params":[9,11]}"#;
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -2880,7 +2863,7 @@ pub mod tests {
|
||||
#[test]
|
||||
fn test_get_block_time() {
|
||||
let bob_pubkey = Pubkey::new_rand();
|
||||
let base_timestamp = 1576183541;
|
||||
let base_timestamp = 1_576_183_541;
|
||||
let RpcHandler {
|
||||
io,
|
||||
meta,
|
||||
@ -2934,7 +2917,7 @@ pub mod tests {
|
||||
slot
|
||||
);
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","result":null,"id":1}}"#);
|
||||
let expected = r#"{"jsonrpc":"2.0","result":null,"id":1}"#;
|
||||
let expected: Response =
|
||||
serde_json::from_str(&expected).expect("expected response deserialization");
|
||||
let result: Response = serde_json::from_str(&res.expect("actual response"))
|
||||
@ -2982,7 +2965,7 @@ pub mod tests {
|
||||
// Check getVoteAccounts: the bootstrap validator vote account will be delinquent as it has
|
||||
// stake but has never voted, and the vote account with no stake should not be present.
|
||||
{
|
||||
let req = format!(r#"{{"jsonrpc":"2.0","id":1,"method":"getVoteAccounts"}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"getVoteAccounts"}"#;
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
@ -3090,7 +3073,7 @@ pub mod tests {
|
||||
json!([CommitmentConfig::recent()])
|
||||
);
|
||||
|
||||
let res = io.handle_request_sync(&req, meta.clone());
|
||||
let res = io.handle_request_sync(&req, meta);
|
||||
let result: Value = serde_json::from_str(&res.expect("actual response"))
|
||||
.expect("actual response deserialization");
|
||||
|
||||
|
@ -447,23 +447,19 @@ mod tests {
|
||||
);
|
||||
let _res = io.handle_request_sync(&req, session.clone());
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"signatureUnsubscribe","params":[0]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"signatureUnsubscribe","params":[0]}"#;
|
||||
let res = io.handle_request_sync(&req, session.clone());
|
||||
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","result":true,"id":1}}"#);
|
||||
let expected = r#"{"jsonrpc":"2.0","result":true,"id":1}"#;
|
||||
let expected: Response = serde_json::from_str(&expected).unwrap();
|
||||
|
||||
let result: Response = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
assert_eq!(expected, result);
|
||||
|
||||
// Test bad parameter
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"signatureUnsubscribe","params":[1]}}"#);
|
||||
let res = io.handle_request_sync(&req, session.clone());
|
||||
let expected = format!(
|
||||
r#"{{"jsonrpc":"2.0","error":{{"code":-32602,"message":"Invalid Request: Subscription id does not exist"}},"id":1}}"#
|
||||
);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"signatureUnsubscribe","params":[1]}"#;
|
||||
let res = io.handle_request_sync(&req, session);
|
||||
let expected = r#"{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid Request: Subscription id does not exist"},"id":1}"#;
|
||||
let expected: Response = serde_json::from_str(&expected).unwrap();
|
||||
|
||||
let result: Response = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
@ -604,8 +600,7 @@ mod tests {
|
||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(0, Bank::new(&genesis_config))));
|
||||
|
||||
let mut io = PubSubHandler::default();
|
||||
let rpc =
|
||||
RpcSolPubSubImpl::default_with_blockstore_bank_forks(blockstore, bank_forks.clone());
|
||||
let rpc = RpcSolPubSubImpl::default_with_blockstore_bank_forks(blockstore, bank_forks);
|
||||
|
||||
io.extend_with(rpc.to_delegate());
|
||||
|
||||
@ -615,23 +610,19 @@ mod tests {
|
||||
);
|
||||
let _res = io.handle_request_sync(&req, session.clone());
|
||||
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"accountUnsubscribe","params":[0]}}"#);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"accountUnsubscribe","params":[0]}"#;
|
||||
let res = io.handle_request_sync(&req, session.clone());
|
||||
|
||||
let expected = format!(r#"{{"jsonrpc":"2.0","result":true,"id":1}}"#);
|
||||
let expected = r#"{"jsonrpc":"2.0","result":true,"id":1}"#;
|
||||
let expected: Response = serde_json::from_str(&expected).unwrap();
|
||||
|
||||
let result: Response = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
assert_eq!(expected, result);
|
||||
|
||||
// Test bad parameter
|
||||
let req =
|
||||
format!(r#"{{"jsonrpc":"2.0","id":1,"method":"accountUnsubscribe","params":[1]}}"#);
|
||||
let res = io.handle_request_sync(&req, session.clone());
|
||||
let expected = format!(
|
||||
r#"{{"jsonrpc":"2.0","error":{{"code":-32602,"message":"Invalid Request: Subscription id does not exist"}},"id":1}}"#
|
||||
);
|
||||
let req = r#"{"jsonrpc":"2.0","id":1,"method":"accountUnsubscribe","params":[1]}"#;
|
||||
let res = io.handle_request_sync(&req, session);
|
||||
let expected = r#"{"jsonrpc":"2.0","error":{"code":-32602,"message":"Invalid Request: Subscription id does not exist"},"id":1}"#;
|
||||
let expected: Response = serde_json::from_str(&expected).unwrap();
|
||||
|
||||
let result: Response = serde_json::from_str(&res.unwrap()).unwrap();
|
||||
@ -746,7 +737,7 @@ mod tests {
|
||||
let mut block_commitment: HashMap<Slot, BlockCommitment> = HashMap::new();
|
||||
block_commitment.insert(0, BlockCommitment::default());
|
||||
let mut new_block_commitment =
|
||||
BlockCommitmentCache::new(block_commitment, 1, 10, bank2, blockstore.clone(), 1);
|
||||
BlockCommitmentCache::new(block_commitment, 1, 10, bank2, blockstore, 1);
|
||||
let mut w_block_commitment_cache = block_commitment_cache.write().unwrap();
|
||||
std::mem::swap(&mut *w_block_commitment_cache, &mut new_block_commitment);
|
||||
drop(w_block_commitment_cache);
|
||||
|
@ -452,7 +452,7 @@ mod tests {
|
||||
fn test_health_check_with_no_trusted_validators() {
|
||||
let cluster_info = Arc::new(ClusterInfo::new_with_invalid_keypair(ContactInfo::default()));
|
||||
|
||||
let rm = RpcRequestMiddleware::new(PathBuf::from("/"), None, cluster_info.clone(), None);
|
||||
let rm = RpcRequestMiddleware::new(PathBuf::from("/"), None, cluster_info, None);
|
||||
assert_eq!(rm.health_check(), "ok");
|
||||
}
|
||||
|
||||
@ -483,7 +483,7 @@ mod tests {
|
||||
.crds
|
||||
.insert(
|
||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHash::new(
|
||||
trusted_validators[0].clone(),
|
||||
trusted_validators[0],
|
||||
vec![
|
||||
(1, Hash::default()),
|
||||
(1001, Hash::default()),
|
||||
@ -503,7 +503,7 @@ mod tests {
|
||||
.crds
|
||||
.insert(
|
||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHash::new(
|
||||
trusted_validators[1].clone(),
|
||||
trusted_validators[1],
|
||||
vec![(1000 + HEALTH_CHECK_SLOT_DISTANCE - 1, Hash::default())],
|
||||
))),
|
||||
1,
|
||||
@ -519,7 +519,7 @@ mod tests {
|
||||
.crds
|
||||
.insert(
|
||||
CrdsValue::new_unsigned(CrdsData::AccountsHashes(SnapshotHash::new(
|
||||
trusted_validators[2].clone(),
|
||||
trusted_validators[2],
|
||||
vec![(1000 + HEALTH_CHECK_SLOT_DISTANCE, Hash::default())],
|
||||
))),
|
||||
1,
|
||||
|
@ -665,7 +665,6 @@ pub(crate) mod tests {
|
||||
use jsonrpc_core::futures::{self, stream::Stream};
|
||||
use jsonrpc_pubsub::typed::Subscriber;
|
||||
use serial_test_derive::serial;
|
||||
use solana_budget_program;
|
||||
use solana_ledger::{
|
||||
blockstore::Blockstore,
|
||||
genesis_utils::{create_genesis_config, GenesisConfigInfo},
|
||||
@ -924,8 +923,8 @@ pub(crate) mod tests {
|
||||
let cache1 = BlockCommitment::default();
|
||||
|
||||
let mut block_commitment = HashMap::new();
|
||||
block_commitment.entry(0).or_insert(cache0.clone());
|
||||
block_commitment.entry(1).or_insert(cache1.clone());
|
||||
block_commitment.entry(0).or_insert(cache0);
|
||||
block_commitment.entry(1).or_insert(cache1);
|
||||
let block_commitment_cache =
|
||||
BlockCommitmentCache::new(block_commitment, 0, 10, bank1, blockstore, 0);
|
||||
|
||||
|
@ -768,7 +768,7 @@ mod tests {
|
||||
.expect("run_orphan packets")
|
||||
.packets
|
||||
.iter()
|
||||
.map(|b| b.clone())
|
||||
.cloned()
|
||||
.collect();
|
||||
let expected: Vec<_> = (1..=3)
|
||||
.rev()
|
||||
|
@ -82,7 +82,7 @@ pub mod tests {
|
||||
fn test_sigverify_shreds_read_slots() {
|
||||
solana_logger::setup();
|
||||
let mut shred = Shred::new_from_data(
|
||||
0xdeadc0de,
|
||||
0xdead_c0de,
|
||||
0xc0de,
|
||||
0xdead,
|
||||
Some(&[1, 2, 3, 4]),
|
||||
@ -101,7 +101,7 @@ pub mod tests {
|
||||
batch[0].packets[0].meta.size = shred.payload.len();
|
||||
|
||||
let mut shred = Shred::new_from_data(
|
||||
0xc0dedead,
|
||||
0xc0de_dead,
|
||||
0xc0de,
|
||||
0xdead,
|
||||
Some(&[1, 2, 3, 4]),
|
||||
@ -116,7 +116,7 @@ pub mod tests {
|
||||
batch[1].packets[0].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
batch[1].packets[0].meta.size = shred.payload.len();
|
||||
|
||||
let expected: HashSet<u64> = [0xc0dedead, 0xdeadc0de].iter().cloned().collect();
|
||||
let expected: HashSet<u64> = [0xc0de_dead, 0xdead_c0de].iter().cloned().collect();
|
||||
assert_eq!(ShredSigVerifier::read_slots(&batch), expected);
|
||||
}
|
||||
|
||||
|
@ -259,7 +259,7 @@ pub mod tests {
|
||||
|
||||
//start cluster_info1
|
||||
let cluster_info1 = ClusterInfo::new_with_invalid_keypair(target1.info.clone());
|
||||
cluster_info1.insert_info(leader.info.clone());
|
||||
cluster_info1.insert_info(leader.info);
|
||||
let cref1 = Arc::new(cluster_info1);
|
||||
|
||||
let (blockstore_path, _) = create_new_tmp_ledger!(&genesis_config);
|
||||
|
@ -94,7 +94,7 @@ mod tests {
|
||||
let (new_update_version, updates) = verified_vote_packets.get_latest_votes(1);
|
||||
assert_eq!(new_update_version, 2);
|
||||
assert_eq!(updates.len(), 1);
|
||||
assert!(updates[0].packets.len() > 0);
|
||||
assert_eq!(updates[0].packets.is_empty(), false);
|
||||
|
||||
// If the given timestamp is greater than all timestamps in any update,
|
||||
// returned timestamp should be the same as the given timestamp, and
|
||||
@ -123,8 +123,7 @@ mod tests {
|
||||
};
|
||||
|
||||
let later_packets = Packets::new(vec![data, Packet::default()]);
|
||||
s.send(vec![(label1.clone(), later_packets.clone())])
|
||||
.unwrap();
|
||||
s.send(vec![(label1.clone(), later_packets)]).unwrap();
|
||||
let mut verified_vote_packets = VerifiedVotePackets(HashMap::new());
|
||||
verified_vote_packets
|
||||
.get_and_process_vote_packets(&r, &mut update_version)
|
||||
|
@ -594,7 +594,7 @@ mod test {
|
||||
let shreds =
|
||||
local_entries_to_shred(&[Entry::default()], slot + 1, slot - 1, &leader_keypair);
|
||||
assert_eq!(
|
||||
should_retransmit_and_persist(&shreds[0], Some(bank.clone()), &cache, &me_id, slot, 0),
|
||||
should_retransmit_and_persist(&shreds[0], Some(bank), &cache, &me_id, slot, 0),
|
||||
false
|
||||
);
|
||||
|
||||
|
Reference in New Issue
Block a user