Skip to content

Commit f759c95

Browse files
authored
Merge pull request #5380 from stacks-network/fix/miner-recovers-when-broadcast-block-delay-across-tenures-occurs
Fix miner_recovers_when_broadcast_block_delay_across_tenures_occurs: Do not expect an exact number of signatures
2 parents 12296c7 + 6fa2b6d commit f759c95

File tree

1 file changed

+63
-93
lines changed
  • testnet/stacks-node/src/tests/signer

1 file changed

+63
-93
lines changed

testnet/stacks-node/src/tests/signer/v0.rs

Lines changed: 63 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -4804,18 +4804,10 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
48044804
vec![(sender_addr.clone(), (send_amt + send_fee) * nmb_txs)],
48054805
);
48064806
let http_origin = format!("http://{}", &signer_test.running_nodes.conf.node.rpc_bind);
4807-
let short_timeout = Duration::from_secs(30);
48084807
signer_test.boot_to_epoch_3();
48094808

48104809
info!("------------------------- Starting Tenure A -------------------------");
48114810
info!("------------------------- Test Mine Nakamoto Block N -------------------------");
4812-
let mined_blocks = signer_test.running_nodes.nakamoto_blocks_mined.clone();
4813-
let blocks_before = mined_blocks.load(Ordering::SeqCst);
4814-
let info_before = signer_test
4815-
.stacks_client
4816-
.get_peer_info()
4817-
.expect("Failed to get peer info");
4818-
let start_time = Instant::now();
48194811

48204812
// wait until we get a sortition.
48214813
// we might miss a block-commit at the start of epoch 3
@@ -4828,6 +4820,12 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
48284820
})
48294821
.expect("Timed out waiting for sortition");
48304822

4823+
let mined_blocks = signer_test.running_nodes.nakamoto_blocks_mined.clone();
4824+
let blocks_before = mined_blocks.load(Ordering::SeqCst);
4825+
let info_before = signer_test
4826+
.stacks_client
4827+
.get_peer_info()
4828+
.expect("Failed to get peer info");
48314829
// submit a tx so that the miner will mine a stacks block
48324830
let mut sender_nonce = 0;
48334831
let transfer_tx = make_stacks_transfer(
@@ -4842,13 +4840,10 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
48424840
info!("Submitted tx {tx} in to mine block N");
48434841

48444842
// a tenure has begun, so wait until we mine a block
4845-
while mined_blocks.load(Ordering::SeqCst) <= blocks_before {
4846-
assert!(
4847-
start_time.elapsed() < short_timeout,
4848-
"FAIL: Test timed out while waiting for block production",
4849-
);
4850-
thread::sleep(Duration::from_secs(1));
4851-
}
4843+
wait_for(30, || {
4844+
Ok(mined_blocks.load(Ordering::SeqCst) > blocks_before)
4845+
})
4846+
.expect("Timed out waiting for block to be mined and processed");
48524847

48534848
sender_nonce += 1;
48544849
let info_after = signer_test
@@ -4892,61 +4887,51 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
48924887
let tx = submit_tx(&http_origin, &transfer_tx);
48934888

48944889
info!("Submitted tx {tx} in to attempt to mine block N+1");
4895-
let start_time = Instant::now();
48964890
let mut block = None;
4897-
loop {
4898-
if block.is_none() {
4899-
block = test_observer::get_stackerdb_chunks()
4900-
.into_iter()
4901-
.flat_map(|chunk| chunk.modified_slots)
4902-
.find_map(|chunk| {
4903-
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
4904-
.expect("Failed to deserialize SignerMessage");
4905-
match message {
4906-
SignerMessage::BlockProposal(proposal) => {
4907-
if proposal.block.header.consensus_hash
4908-
== info_before.stacks_tip_consensus_hash
4909-
{
4910-
Some(proposal.block)
4911-
} else {
4912-
None
4913-
}
4891+
wait_for(30, || {
4892+
block = test_observer::get_stackerdb_chunks()
4893+
.into_iter()
4894+
.flat_map(|chunk| chunk.modified_slots)
4895+
.find_map(|chunk| {
4896+
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
4897+
.expect("Failed to deserialize SignerMessage");
4898+
match message {
4899+
SignerMessage::BlockProposal(proposal) => {
4900+
if proposal.block.header.consensus_hash
4901+
== info_before.stacks_tip_consensus_hash
4902+
{
4903+
Some(proposal.block)
4904+
} else {
4905+
None
49144906
}
4915-
_ => None,
49164907
}
4917-
});
4918-
}
4919-
if let Some(block) = &block {
4920-
let signatures = test_observer::get_stackerdb_chunks()
4921-
.into_iter()
4922-
.flat_map(|chunk| chunk.modified_slots)
4923-
.filter_map(|chunk| {
4924-
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
4925-
.expect("Failed to deserialize SignerMessage");
4926-
match message {
4927-
SignerMessage::BlockResponse(BlockResponse::Accepted(accepted)) => {
4928-
if block.header.signer_signature_hash()
4929-
== accepted.signer_signature_hash
4930-
{
4931-
Some(accepted.signature)
4932-
} else {
4933-
None
4934-
}
4908+
_ => None,
4909+
}
4910+
});
4911+
let Some(block) = &block else {
4912+
return Ok(false);
4913+
};
4914+
let signatures = test_observer::get_stackerdb_chunks()
4915+
.into_iter()
4916+
.flat_map(|chunk| chunk.modified_slots)
4917+
.filter_map(|chunk| {
4918+
let message = SignerMessage::consensus_deserialize(&mut chunk.data.as_slice())
4919+
.expect("Failed to deserialize SignerMessage");
4920+
match message {
4921+
SignerMessage::BlockResponse(BlockResponse::Accepted(accepted)) => {
4922+
if block.header.signer_signature_hash() == accepted.signer_signature_hash {
4923+
Some(accepted.signature)
4924+
} else {
4925+
None
49354926
}
4936-
_ => None,
49374927
}
4938-
})
4939-
.collect::<Vec<_>>();
4940-
if signatures.len() == num_signers {
4941-
break;
4942-
}
4943-
}
4944-
assert!(
4945-
start_time.elapsed() < short_timeout,
4946-
"FAIL: Test timed out while waiting for signers signatures for first block proposal",
4947-
);
4948-
sleep_ms(1000);
4949-
}
4928+
_ => None,
4929+
}
4930+
})
4931+
.collect::<Vec<_>>();
4932+
Ok(signatures.len() == num_signers)
4933+
})
4934+
.expect("Test timed out while waiting for signers signatures for first block proposal");
49504935
let block = block.unwrap();
49514936

49524937
let blocks_after = mined_blocks.load(Ordering::SeqCst);
@@ -4979,9 +4964,8 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
49794964
"------------------------- Attempt to Mine Nakamoto Block N+1' -------------------------"
49804965
);
49814966
// Wait for the miner to propose a new invalid block N+1'
4982-
let start_time = Instant::now();
49834967
let mut rejected_block = None;
4984-
while rejected_block.is_none() {
4968+
wait_for(30, || {
49854969
rejected_block = test_observer::get_stackerdb_chunks()
49864970
.into_iter()
49874971
.flat_map(|chunk| chunk.modified_slots)
@@ -5002,11 +4986,9 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
50024986
_ => None,
50034987
}
50044988
});
5005-
assert!(
5006-
start_time.elapsed() < short_timeout,
5007-
"FAIL: Test timed out while waiting for N+1' block proposal",
5008-
);
5009-
}
4989+
Ok(rejected_block.is_some())
4990+
})
4991+
.expect("Timed out waiting for block proposal of N+1' block proposal");
50104992

50114993
info!("Allowing miner to accept block responses again. ");
50124994
TEST_IGNORE_SIGNERS.lock().unwrap().replace(false);
@@ -5015,7 +4997,7 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
50154997

50164998
// Assert the N+1' block was rejected
50174999
let rejected_block = rejected_block.unwrap();
5018-
loop {
5000+
wait_for(30, || {
50195001
let stackerdb_events = test_observer::get_stackerdb_chunks();
50205002
let block_rejections = stackerdb_events
50215003
.into_iter()
@@ -5037,14 +5019,9 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
50375019
}
50385020
})
50395021
.collect::<Vec<_>>();
5040-
if block_rejections.len() == num_signers {
5041-
break;
5042-
}
5043-
assert!(
5044-
start_time.elapsed() < short_timeout,
5045-
"FAIL: Test timed out while waiting for block proposal rejections",
5046-
);
5047-
}
5022+
Ok(block_rejections.len() == num_signers)
5023+
})
5024+
.expect("FAIL: Timed out waiting for block proposal rejections");
50485025

50495026
// Induce block N+2 to get mined
50505027
let transfer_tx = make_stacks_transfer(
@@ -5060,24 +5037,17 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
50605037
info!("Submitted tx {tx} in to attempt to mine block N+2");
50615038

50625039
info!("------------------------- Asserting a both N+1 and N+2 are accepted -------------------------");
5063-
loop {
5040+
wait_for(30, || {
50645041
// N.B. have to use /v2/info because mined_blocks only increments if the miner's signing
50655042
// coordinator returns successfully (meaning, mined_blocks won't increment for block N+1)
50665043
let info = signer_test
50675044
.stacks_client
50685045
.get_peer_info()
50695046
.expect("Failed to get peer info");
50705047

5071-
if info_before.stacks_tip_height + 2 <= info.stacks_tip_height {
5072-
break;
5073-
}
5074-
5075-
assert!(
5076-
start_time.elapsed() < short_timeout,
5077-
"FAIL: Test timed out while waiting for block production",
5078-
);
5079-
thread::sleep(Duration::from_secs(1));
5080-
}
5048+
Ok(info_before.stacks_tip_height + 2 <= info.stacks_tip_height)
5049+
})
5050+
.expect("Timed out waiting for blocks to be mined");
50815051

50825052
let info_after = signer_test
50835053
.stacks_client
@@ -5096,7 +5066,7 @@ fn miner_recovers_when_broadcast_block_delay_across_tenures_occurs() {
50965066
.expect("Not a Nakamoto block")
50975067
.signer_signature
50985068
.len();
5099-
assert_eq!(nmb_signatures, num_signers);
5069+
assert!(nmb_signatures >= num_signers * 7 / 10);
51005070

51015071
// Ensure that the block was accepted globally so the stacks tip has advanced to N+2
51025072
let nakamoto_blocks = test_observer::get_mined_nakamoto_blocks();

0 commit comments

Comments
 (0)