From bc43088bd989a697680ecc847f1a0c7f177af74f Mon Sep 17 00:00:00 2001 From: Hank Stoever Date: Thu, 16 Jan 2025 14:47:12 -0800 Subject: [PATCH] fix: prevent flaky check for responses by only checking threshold --- testnet/stacks-node/src/tests/signer/mod.rs | 29 ++++++++++++++++++++- testnet/stacks-node/src/tests/signer/v0.rs | 17 +++++------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/testnet/stacks-node/src/tests/signer/mod.rs b/testnet/stacks-node/src/tests/signer/mod.rs index ed4560c70a..ba95ca800b 100644 --- a/testnet/stacks-node/src/tests/signer/mod.rs +++ b/testnet/stacks-node/src/tests/signer/mod.rs @@ -37,7 +37,7 @@ use std::time::{Duration, Instant}; use clarity::boot_util::boot_code_id; use clarity::vm::types::PrincipalData; use libsigner::v0::messages::{ - BlockAccepted, BlockResponse, MessageSlotID, PeerInfo, SignerMessage, + BlockAccepted, BlockRejection, BlockResponse, MessageSlotID, PeerInfo, SignerMessage, }; use libsigner::{BlockProposal, SignerEntries, SignerEventTrait}; use stacks::chainstate::coordinator::comm::CoordinatorChannels; @@ -694,6 +694,33 @@ impl + Send + 'static, T: SignerEventTrait + 'static> SignerTest Vec { + let stackerdb_events = test_observer::get_stackerdb_chunks(); + let block_rejections = stackerdb_events + .into_iter() + .flat_map(|chunk| chunk.modified_slots) + .filter_map(|chunk| { + let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice()) + .expect("Failed to deserialize SignerMessage"); + match message { + SignerMessage::BlockResponse(BlockResponse::Rejected(rejection)) => { + if rejection.signer_signature_hash == *signer_signature_hash { + Some(rejection) + } else { + None + } + } + _ => None, + } + }) + .collect::>(); + block_rejections + } + /// Get the latest block response from the given slot pub fn get_latest_block_response(&self, slot_id: u32) -> BlockResponse { let mut stackerdb = StackerDB::new( diff --git a/testnet/stacks-node/src/tests/signer/v0.rs b/testnet/stacks-node/src/tests/signer/v0.rs index 190145279f..e32e3e9e3e 100644 --- a/testnet/stacks-node/src/tests/signer/v0.rs +++ b/testnet/stacks-node/src/tests/signer/v0.rs @@ -10708,16 +10708,8 @@ fn outgoing_signers_ignore_block_proposals() { txs: vec![], }; block.header.timestamp = get_epoch_time_secs(); - let signer_signature_hash_1 = block.header.signer_signature_hash(); - - info!("------------------------- Test Attempt to Mine Invalid Block {signer_signature_hash_1} -------------------------"); let short_timeout = Duration::from_secs(30); - let all_signers: Vec<_> = signer_test - .signer_stacks_private_keys - .iter() - .map(StacksPublicKey::from_private) - .collect(); test_observer::clear(); // Propose a block to the signers that passes initial checks but will be rejected by the stacks node @@ -10733,9 +10725,12 @@ fn outgoing_signers_ignore_block_proposals() { signer_test.propose_block(block, short_timeout); // Verify the signers rejected the second block via the endpoint signer_test.wait_for_validate_reject_response(short_timeout, signer_signature_hash); - signer_test - .wait_for_block_rejections(30, &all_signers) - .expect("Timed out waiting for block rejections"); + wait_for(30, || { + let min_rejects = num_signers * 3 / 10; + let block_rejections = signer_test.get_block_rejections(&signer_signature_hash); + Ok(block_rejections.len() >= min_rejects) + }) + .expect("Timed out waiting for block rejections"); old_signers_ignore_block_proposals(signer_signature_hash); assert_eq!(blocks_before, mined_blocks.load(Ordering::SeqCst));