Skip to content

Commit 12765de

Browse files
committed
attempt to fix test flake by reverting the reorder of the signer status check response
1 parent 4dc33a7 commit 12765de

File tree

2 files changed

+72
-64
lines changed

2 files changed

+72
-64
lines changed

stacks-signer/src/runloop.rs

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,38 @@ impl<Signer: SignerTrait<T>, T: StacksMessageCodec + Clone + Send + Debug>
500500
"Running one pass for the signer. state={:?}, event={event:?}",
501501
self.state
502502
);
503+
504+
// This is the only event that we respond to from the outer signer runloop
505+
if let Some(SignerEvent::StatusCheck) = event {
506+
let state_info = StateInfo {
507+
runloop_state: self.state,
508+
reward_cycle_info: self.current_reward_cycle_info,
509+
running_signers: self
510+
.stacks_signers
511+
.values()
512+
.map(|s| s.reward_cycle())
513+
.collect(),
514+
signer_state_machines: self
515+
.stacks_signers
516+
.iter()
517+
.map(|(reward_cycle, signer)| {
518+
let ConfiguredSigner::RegisteredSigner(ref signer) = signer else {
519+
return (*reward_cycle, None);
520+
};
521+
(
522+
*reward_cycle,
523+
Some(signer.get_local_state_machine().clone()),
524+
)
525+
})
526+
.collect(),
527+
};
528+
info!("Signer status check requested: {state_info:?}");
529+
530+
if let Err(e) = res.send(state_info.into()) {
531+
error!("Failed to send status check result: {e}.");
532+
}
533+
}
534+
503535
if self.state == State::Uninitialized {
504536
if let Err(e) = self.initialize_runloop() {
505537
error!("Failed to initialize signer runloop: {e}.");
@@ -514,6 +546,7 @@ impl<Signer: SignerTrait<T>, T: StacksMessageCodec + Clone + Send + Debug>
514546
warn!("Signer may have an outdated view of the network.");
515547
}
516548
}
549+
517550
let current_reward_cycle = self
518551
.current_reward_cycle_info
519552
.as_ref()
@@ -534,37 +567,6 @@ impl<Signer: SignerTrait<T>, T: StacksMessageCodec + Clone + Send + Debug>
534567
);
535568
}
536569

537-
// This is the only event that we respond to from the outer signer runloop
538-
if let Some(SignerEvent::StatusCheck) = event {
539-
let state_info = StateInfo {
540-
runloop_state: self.state,
541-
reward_cycle_info: self.current_reward_cycle_info,
542-
running_signers: self
543-
.stacks_signers
544-
.values()
545-
.map(|s| s.reward_cycle())
546-
.collect(),
547-
signer_state_machines: self
548-
.stacks_signers
549-
.iter()
550-
.map(|(reward_cycle, signer)| {
551-
let ConfiguredSigner::RegisteredSigner(ref signer) = signer else {
552-
return (*reward_cycle, None);
553-
};
554-
(
555-
*reward_cycle,
556-
Some(signer.get_local_state_machine().clone()),
557-
)
558-
})
559-
.collect(),
560-
};
561-
info!("Signer status check requested: {state_info:?}");
562-
563-
if let Err(e) = res.send(state_info.into()) {
564-
error!("Failed to send status check result: {e}.");
565-
}
566-
}
567-
568570
if self.state == State::NoRegisteredSigners && event.is_some() {
569571
let next_reward_cycle = current_reward_cycle.saturating_add(1);
570572
info!("Signer is not registered for the current reward cycle ({current_reward_cycle}). Reward set is not yet determined or signer is not registered for the upcoming reward cycle ({next_reward_cycle}).");

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

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -455,40 +455,46 @@ impl<S: Signer<T> + Send + 'static, T: SignerEventTrait + 'static> SignerTest<Sp
455455
let info_cur = self.get_peer_info();
456456
let current_rc = self.get_current_reward_cycle();
457457
let mut states = Vec::with_capacity(0);
458-
wait_for(120, || {
459-
states = self.get_all_states();
460-
Ok(states.iter().enumerate().all(|(ix, signer_state)| {
461-
let Some(Some(state_machine)) = signer_state
462-
.signer_state_machines
463-
.iter()
464-
.find_map(|(rc, state)| {
465-
if current_rc % 2 == *rc {
466-
Some(state.as_ref())
467-
} else {
468-
None
469-
}
470-
})
471-
else {
472-
let rcs_set: Vec<_> = signer_state.signer_state_machines.iter().map(|(rc, state)| {
473-
(rc, state.is_some())
458+
// fetch all the state machines *twice*
459+
// we do this because the state machines return before the signer runloop
460+
// invokes run_one_pass(), which is necessary to handle any pending updates to
461+
// the state machine.
462+
// we get around this by just doing this twice
463+
for _i in 0..2 {
464+
wait_for(120, || {
465+
states = self.get_all_states();
466+
Ok(states.iter().enumerate().all(|(ix, signer_state)| {
467+
let Some(Some(state_machine)) = signer_state
468+
.signer_state_machines
469+
.iter()
470+
.find_map(|(rc, state)| {
471+
if current_rc % 2 == *rc {
472+
Some(state.as_ref())
473+
} else {
474+
None
475+
}
476+
})
477+
else {
478+
let rcs_set: Vec<_> = signer_state.signer_state_machines.iter().map(|(rc, state)| {
479+
(rc, state.is_some())
474480
}).collect();
475-
warn!(
476-
"Local state machine for signer #{ix} not set for reward cycle #{current_rc} yet";
477-
"burn_block_height" => info_cur.burn_block_height,
478-
"rcs_set" => ?rcs_set
479-
);
480-
return false;
481-
};
482-
483-
let LocalStateMachine::Initialized(state_machine) = state_machine else {
484-
warn!("Local state machine for signer #{ix} not initialized");
485-
return false;
486-
};
487-
state_machine.burn_block_height >= info_cur.burn_block_height
488-
}))
489-
490-
})
491-
.expect("Timed out while waiting to fetch local state machines from the signer set");
481+
warn!(
482+
"Local state machine for signer #{ix} not set for reward cycle #{current_rc} yet";
483+
"burn_block_height" => info_cur.burn_block_height,
484+
"rcs_set" => ?rcs_set
485+
);
486+
return false;
487+
};
488+
489+
let LocalStateMachine::Initialized(state_machine) = state_machine else {
490+
warn!("Local state machine for signer #{ix} not initialized");
491+
return false;
492+
};
493+
state_machine.burn_block_height >= info_cur.burn_block_height
494+
}))
495+
})
496+
.expect("Timed out while waiting to fetch local state machines from the signer set");
497+
}
492498

493499
let state_machines = states
494500
.into_iter()

0 commit comments

Comments
 (0)