Unverified Commit 35501275 authored by asynchronous rob's avatar asynchronous rob Committed by GitHub
Browse files

Improve approval tracing (#2697)

* improve tracing for approval voting

* assignment criteria tracing

* new syntax
parent 7012cdbb
Pipeline #130371 failed with stages
in 21 minutes and 49 seconds
...@@ -20,7 +20,7 @@ use polkadot_node_primitives::approval::{ ...@@ -20,7 +20,7 @@ use polkadot_node_primitives::approval::{
self as approval_types, AssignmentCert, AssignmentCertKind, DelayTranche, RelayVRFStory, self as approval_types, AssignmentCert, AssignmentCertKind, DelayTranche, RelayVRFStory,
}; };
use polkadot_primitives::v1::{ use polkadot_primitives::v1::{
CoreIndex, ValidatorIndex, SessionInfo, AssignmentPair, AssignmentId, GroupIndex, CoreIndex, ValidatorIndex, SessionInfo, AssignmentPair, AssignmentId, GroupIndex, CandidateHash,
}; };
use sc_keystore::LocalKeystore; use sc_keystore::LocalKeystore;
use parity_scale_codec::{Encode, Decode}; use parity_scale_codec::{Encode, Decode};
...@@ -178,7 +178,7 @@ pub(crate) trait AssignmentCriteria { ...@@ -178,7 +178,7 @@ pub(crate) trait AssignmentCriteria {
keystore: &LocalKeystore, keystore: &LocalKeystore,
relay_vrf_story: RelayVRFStory, relay_vrf_story: RelayVRFStory,
config: &Config, config: &Config,
leaving_cores: Vec<(CoreIndex, GroupIndex)>, leaving_cores: Vec<(CandidateHash, CoreIndex, GroupIndex)>,
) -> HashMap<CoreIndex, OurAssignment>; ) -> HashMap<CoreIndex, OurAssignment>;
fn check_assignment_cert( fn check_assignment_cert(
...@@ -200,7 +200,7 @@ impl AssignmentCriteria for RealAssignmentCriteria { ...@@ -200,7 +200,7 @@ impl AssignmentCriteria for RealAssignmentCriteria {
keystore: &LocalKeystore, keystore: &LocalKeystore,
relay_vrf_story: RelayVRFStory, relay_vrf_story: RelayVRFStory,
config: &Config, config: &Config,
leaving_cores: Vec<(CoreIndex, GroupIndex)>, leaving_cores: Vec<(CandidateHash, CoreIndex, GroupIndex)>,
) -> HashMap<CoreIndex, OurAssignment> { ) -> HashMap<CoreIndex, OurAssignment> {
compute_assignments( compute_assignments(
keystore, keystore,
...@@ -244,7 +244,7 @@ pub(crate) fn compute_assignments( ...@@ -244,7 +244,7 @@ pub(crate) fn compute_assignments(
keystore: &LocalKeystore, keystore: &LocalKeystore,
relay_vrf_story: RelayVRFStory, relay_vrf_story: RelayVRFStory,
config: &Config, config: &Config,
leaving_cores: impl IntoIterator<Item = (CoreIndex, GroupIndex)> + Clone, leaving_cores: impl IntoIterator<Item = (CandidateHash, CoreIndex, GroupIndex)> + Clone,
) -> HashMap<CoreIndex, OurAssignment> { ) -> HashMap<CoreIndex, OurAssignment> {
if config.n_cores == 0 || config.assignment_keys.is_empty() || config.validator_groups.is_empty() { if config.n_cores == 0 || config.assignment_keys.is_empty() || config.validator_groups.is_empty() {
return HashMap::new() return HashMap::new()
...@@ -271,8 +271,8 @@ pub(crate) fn compute_assignments( ...@@ -271,8 +271,8 @@ pub(crate) fn compute_assignments(
// Ignore any cores where the assigned group is our own. // Ignore any cores where the assigned group is our own.
let leaving_cores = leaving_cores.into_iter() let leaving_cores = leaving_cores.into_iter()
.filter(|&(_, ref g)| !is_in_backing_group(&config.validator_groups, index, *g)) .filter(|&(_, _, ref g)| !is_in_backing_group(&config.validator_groups, index, *g))
.map(|(c, _)| c) .map(|(c_hash, core, _)| (c_hash, core))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let assignments_key: &sp_application_crypto::sr25519::Pair = assignments_key.as_ref(); let assignments_key: &sp_application_crypto::sr25519::Pair = assignments_key.as_ref();
...@@ -308,7 +308,7 @@ fn compute_relay_vrf_modulo_assignments( ...@@ -308,7 +308,7 @@ fn compute_relay_vrf_modulo_assignments(
validator_index: ValidatorIndex, validator_index: ValidatorIndex,
config: &Config, config: &Config,
relay_vrf_story: RelayVRFStory, relay_vrf_story: RelayVRFStory,
leaving_cores: impl IntoIterator<Item = CoreIndex> + Clone, leaving_cores: impl IntoIterator<Item = (CandidateHash, CoreIndex)> + Clone,
assignments: &mut HashMap<CoreIndex, OurAssignment>, assignments: &mut HashMap<CoreIndex, OurAssignment>,
) { ) {
for rvm_sample in 0..config.relay_vrf_modulo_samples { for rvm_sample in 0..config.relay_vrf_modulo_samples {
...@@ -322,7 +322,18 @@ fn compute_relay_vrf_modulo_assignments( ...@@ -322,7 +322,18 @@ fn compute_relay_vrf_modulo_assignments(
relay_vrf_modulo_transcript(relay_vrf_story.clone(), rvm_sample), relay_vrf_modulo_transcript(relay_vrf_story.clone(), rvm_sample),
|vrf_in_out| { |vrf_in_out| {
*core = relay_vrf_modulo_core(&vrf_in_out, config.n_cores); *core = relay_vrf_modulo_core(&vrf_in_out, config.n_cores);
if leaving_cores.clone().into_iter().any(|c| c == *core) { if let Some((candidate_hash, _))
= leaving_cores.clone().into_iter().find(|(_, c)| c == core)
{
tracing::trace!(
target: LOG_TARGET,
?candidate_hash,
?core,
?validator_index,
tranche = 0,
"RelayVRFModulo Assignment."
);
Some(assigned_core_transcript(*core)) Some(assigned_core_transcript(*core))
} else { } else {
None None
...@@ -355,10 +366,10 @@ fn compute_relay_vrf_delay_assignments( ...@@ -355,10 +366,10 @@ fn compute_relay_vrf_delay_assignments(
validator_index: ValidatorIndex, validator_index: ValidatorIndex,
config: &Config, config: &Config,
relay_vrf_story: RelayVRFStory, relay_vrf_story: RelayVRFStory,
leaving_cores: impl IntoIterator<Item = CoreIndex>, leaving_cores: impl IntoIterator<Item = (CandidateHash, CoreIndex)>,
assignments: &mut HashMap<CoreIndex, OurAssignment>, assignments: &mut HashMap<CoreIndex, OurAssignment>,
) { ) {
for core in leaving_cores { for (candidate_hash, core) in leaving_cores {
let (vrf_in_out, vrf_proof, _) = assignments_key.vrf_sign( let (vrf_in_out, vrf_proof, _) = assignments_key.vrf_sign(
relay_vrf_delay_transcript(relay_vrf_story.clone(), core), relay_vrf_delay_transcript(relay_vrf_story.clone(), core),
); );
...@@ -381,11 +392,25 @@ fn compute_relay_vrf_delay_assignments( ...@@ -381,11 +392,25 @@ fn compute_relay_vrf_delay_assignments(
triggered: false, triggered: false,
}; };
match assignments.entry(core) { let used = match assignments.entry(core) {
Entry::Vacant(e) => { let _ = e.insert(our_assignment); } Entry::Vacant(e) => { let _ = e.insert(our_assignment); true }
Entry::Occupied(mut e) => if e.get().tranche > our_assignment.tranche { Entry::Occupied(mut e) => if e.get().tranche > our_assignment.tranche {
e.insert(our_assignment); e.insert(our_assignment);
true
} else {
false
}, },
};
if used {
tracing::trace!(
target: LOG_TARGET,
?candidate_hash,
?core,
?validator_index,
tranche,
"RelayVRFDelay Assignment",
);
} }
} }
} }
...@@ -500,7 +525,7 @@ mod tests { ...@@ -500,7 +525,7 @@ mod tests {
use sp_keyring::sr25519::Keyring as Sr25519Keyring; use sp_keyring::sr25519::Keyring as Sr25519Keyring;
use sp_application_crypto::sr25519; use sp_application_crypto::sr25519;
use sp_core::crypto::Pair as PairT; use sp_core::crypto::Pair as PairT;
use polkadot_primitives::v1::ASSIGNMENT_KEY_TYPE_ID; use polkadot_primitives::v1::{ASSIGNMENT_KEY_TYPE_ID, Hash};
use polkadot_node_primitives::approval::{VRFOutput, VRFProof}; use polkadot_node_primitives::approval::{VRFOutput, VRFProof};
// sets up a keystore with the given keyring accounts. // sets up a keystore with the given keyring accounts.
...@@ -560,6 +585,9 @@ mod tests { ...@@ -560,6 +585,9 @@ mod tests {
make_keystore(&[Sr25519Keyring::Alice]) make_keystore(&[Sr25519Keyring::Alice])
); );
let c_a = CandidateHash(Hash::repeat_byte(0));
let c_b = CandidateHash(Hash::repeat_byte(1));
let relay_vrf_story = RelayVRFStory([42u8; 32]); let relay_vrf_story = RelayVRFStory([42u8; 32]);
let assignments = compute_assignments( let assignments = compute_assignments(
&keystore, &keystore,
...@@ -576,7 +604,7 @@ mod tests { ...@@ -576,7 +604,7 @@ mod tests {
relay_vrf_modulo_samples: 3, relay_vrf_modulo_samples: 3,
n_delay_tranches: 40, n_delay_tranches: 40,
}, },
vec![(CoreIndex(0), GroupIndex(1)), (CoreIndex(1), GroupIndex(0))], vec![(c_a, CoreIndex(0), GroupIndex(1)), (c_b, CoreIndex(1), GroupIndex(0))],
); );
// Note that alice is in group 0, which was the backing group for core 1. // Note that alice is in group 0, which was the backing group for core 1.
...@@ -591,6 +619,9 @@ mod tests { ...@@ -591,6 +619,9 @@ mod tests {
make_keystore(&[Sr25519Keyring::Alice]) make_keystore(&[Sr25519Keyring::Alice])
); );
let c_a = CandidateHash(Hash::repeat_byte(0));
let c_b = CandidateHash(Hash::repeat_byte(1));
let relay_vrf_story = RelayVRFStory([42u8; 32]); let relay_vrf_story = RelayVRFStory([42u8; 32]);
let assignments = compute_assignments( let assignments = compute_assignments(
&keystore, &keystore,
...@@ -607,7 +638,7 @@ mod tests { ...@@ -607,7 +638,7 @@ mod tests {
relay_vrf_modulo_samples: 3, relay_vrf_modulo_samples: 3,
n_delay_tranches: 40, n_delay_tranches: 40,
}, },
vec![(CoreIndex(0), GroupIndex(0)), (CoreIndex(1), GroupIndex(1))], vec![(c_a, CoreIndex(0), GroupIndex(0)), (c_b, CoreIndex(1), GroupIndex(1))],
); );
assert_eq!(assignments.len(), 1); assert_eq!(assignments.len(), 1);
...@@ -680,6 +711,7 @@ mod tests { ...@@ -680,6 +711,7 @@ mod tests {
&config, &config,
(0..n_cores) (0..n_cores)
.map(|i| ( .map(|i| (
CandidateHash(Hash::repeat_byte(i as u8)),
CoreIndex(i as u32), CoreIndex(i as u32),
group_for_core(i), group_for_core(i),
)) ))
......
...@@ -473,7 +473,7 @@ async fn imported_block_info( ...@@ -473,7 +473,7 @@ async fn imported_block_info(
relay_vrf.clone(), relay_vrf.clone(),
&crate::criteria::Config::from(session_info), &crate::criteria::Config::from(session_info),
included_candidates.iter() included_candidates.iter()
.map(|(_, _, core, group)| (*core, *group)) .map(|(c_hash, _, core, group)| (*c_hash, *core, *group))
.collect(), .collect(),
); );
...@@ -895,7 +895,7 @@ mod tests { ...@@ -895,7 +895,7 @@ mod tests {
_keystore: &LocalKeystore, _keystore: &LocalKeystore,
_relay_vrf_story: polkadot_node_primitives::approval::RelayVRFStory, _relay_vrf_story: polkadot_node_primitives::approval::RelayVRFStory,
_config: &criteria::Config, _config: &criteria::Config,
_leaving_cores: Vec<(polkadot_primitives::v1::CoreIndex, polkadot_primitives::v1::GroupIndex)>, _leaving_cores: Vec<(CandidateHash, polkadot_primitives::v1::CoreIndex, polkadot_primitives::v1::GroupIndex)>,
) -> HashMap<polkadot_primitives::v1::CoreIndex, criteria::OurAssignment> { ) -> HashMap<polkadot_primitives::v1::CoreIndex, criteria::OurAssignment> {
HashMap::new() HashMap::new()
} }
......
...@@ -605,9 +605,9 @@ async fn handle_from_overseer( ...@@ -605,9 +605,9 @@ async fn handle_from_overseer(
for block_batch in block_imported_candidates { for block_batch in block_imported_candidates {
tracing::debug!( tracing::debug!(
target: LOG_TARGET, target: LOG_TARGET,
"Imported new block {} with {} included candidates", block_hash = ?block_batch.block_hash,
block_batch.block_hash, num_candidates = block_batch.imported_candidates.len(),
block_batch.imported_candidates.len(), "Imported new block.",
); );
for (c_hash, c_entry) in block_batch.imported_candidates { for (c_hash, c_entry) in block_batch.imported_candidates {
...@@ -621,11 +621,11 @@ async fn handle_from_overseer( ...@@ -621,11 +621,11 @@ async fn handle_from_overseer(
let tick = our_tranche as Tick + block_batch.block_tick; let tick = our_tranche as Tick + block_batch.block_tick;
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Scheduling first wakeup at tranche {} for candidate {} in block ({}, tick={})", tranche = our_tranche,
our_tranche, candidate_hash = ?c_hash,
c_hash, block_hash = ?block_batch.block_hash,
block_batch.block_hash, block_tick = block_batch.block_tick,
block_batch.block_tick, "Scheduling first wakeup.",
); );
// Our first wakeup will just be the tranche of our assignment, // Our first wakeup will just be the tranche of our assignment,
...@@ -987,18 +987,18 @@ fn schedule_wakeup_action( ...@@ -987,18 +987,18 @@ fn schedule_wakeup_action(
match maybe_action { match maybe_action {
Some(Action::ScheduleWakeup { ref tick, .. }) => tracing::trace!( Some(Action::ScheduleWakeup { ref tick, .. }) => tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Scheduling next wakeup at {} for candidate {} under block ({}, tick={})",
tick, tick,
candidate_hash, ?candidate_hash,
block_hash, ?block_hash,
block_tick, block_tick,
"Scheduling next wakeup.",
), ),
None => tracing::trace!( None => tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"No wakeup needed for candidate {} under block ({}, tick={})", ?candidate_hash,
candidate_hash, ?block_hash,
block_hash,
block_tick, block_tick,
"No wakeup needed.",
), ),
Some(_) => {} // unreachable Some(_) => {} // unreachable
} }
...@@ -1093,9 +1093,10 @@ fn check_and_import_assignment( ...@@ -1093,9 +1093,10 @@ fn check_and_import_assignment(
} else { } else {
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Imported assignment from validator {} on candidate {:?}", validator = assignment.validator.0,
assignment.validator.0, candidate_hash = ?assigned_candidate_hash,
(assigned_candidate_hash, candidate_entry.candidate_receipt().descriptor.para_id), para_id = ?candidate_entry.candidate_receipt().descriptor.para_id,
"Imported assignment.",
); );
AssignmentCheckResult::Accepted AssignmentCheckResult::Accepted
...@@ -1196,9 +1197,11 @@ fn check_and_import_approval<T>( ...@@ -1196,9 +1197,11 @@ fn check_and_import_approval<T>(
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Importing approval vote from validator {:?} on candidate {:?}", validator_index = approval.validator.0,
(approval.validator, &pubkey), validator = ?pubkey,
(approved_candidate_hash, candidate_entry.candidate_receipt().descriptor.para_id), candidate_hash = ?approved_candidate_hash,
para_id = ?candidate_entry.candidate_receipt().descriptor.para_id,
"Importing approval vote",
); );
let actions = import_checked_approval( let actions = import_checked_approval(
...@@ -1316,9 +1319,9 @@ fn check_and_apply_full_approval( ...@@ -1316,9 +1319,9 @@ fn check_and_apply_full_approval(
if let approval_checking::Check::Approved(no_shows) = check { if let approval_checking::Check::Approved(no_shows) = check {
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Candidate approved {} under block {}", ?candidate_hash,
candidate_hash, ?block_hash,
block_hash, "Candidate approved under block.",
); );
let was_approved = block_entry.is_fully_approved(); let was_approved = block_entry.is_fully_approved();
...@@ -1441,10 +1444,10 @@ fn process_wakeup( ...@@ -1441,10 +1444,10 @@ fn process_wakeup(
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Processing wakeup at tranche {} for candidate {} under block {}", tranche = tranche_now,
tranche_now, ?candidate_hash,
candidate_hash, block_hash = ?relay_block,
relay_block, "Processing wakeup",
); );
let (should_trigger, backing_group) = { let (should_trigger, backing_group) = {
...@@ -1500,9 +1503,10 @@ fn process_wakeup( ...@@ -1500,9 +1503,10 @@ fn process_wakeup(
if let Some(i) = index_in_candidate { if let Some(i) = index_in_candidate {
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Launching approval work for candidate {:?} in block {}", ?candidate_hash,
(&candidate_hash, candidate_entry.candidate_receipt().descriptor.para_id), para_id = ?candidate_entry.candidate_receipt().descriptor.para_id,
relay_block, block_hash = ?relay_block,
"Launching approval work.",
); );
// sanity: should always be present. // sanity: should always be present.
...@@ -1559,8 +1563,9 @@ async fn launch_approval( ...@@ -1559,8 +1563,9 @@ async fn launch_approval(
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Recovering data for candidate {:?}", ?candidate_hash,
(candidate_hash, candidate.descriptor.para_id), para_id = ?candidate.descriptor.para_id,
"Recovering data.",
); );
ctx.send_message(AvailabilityRecoveryMessage::RecoverAvailableData( ctx.send_message(AvailabilityRecoveryMessage::RecoverAvailableData(
...@@ -1663,8 +1668,9 @@ async fn launch_approval( ...@@ -1663,8 +1668,9 @@ async fn launch_approval(
tracing::trace!( tracing::trace!(
target: LOG_TARGET, target: LOG_TARGET,
"Candidate Valid {:?}", ?candidate_hash,
(candidate_hash, para_id), ?para_id,
"Candidate Valid",
); );
let _ = background_tx.send(BackgroundRequest::ApprovalVote(ApprovalVoteRequest { let _ = background_tx.send(BackgroundRequest::ApprovalVote(ApprovalVoteRequest {
...@@ -1782,8 +1788,8 @@ async fn issue_approval( ...@@ -1782,8 +1788,8 @@ async fn issue_approval(
tracing::debug!( tracing::debug!(
target: LOG_TARGET, target: LOG_TARGET,
"Issuing approval vote for candidate {:?}", ?candidate_hash,
candidate_hash, "Issuing approval vote",
); );
let actions = import_checked_approval( let actions = import_checked_approval(
......
...@@ -132,7 +132,7 @@ where ...@@ -132,7 +132,7 @@ where
_keystore: &LocalKeystore, _keystore: &LocalKeystore,
_relay_vrf_story: polkadot_node_primitives::approval::RelayVRFStory, _relay_vrf_story: polkadot_node_primitives::approval::RelayVRFStory,
_config: &criteria::Config, _config: &criteria::Config,
_leaving_cores: Vec<(polkadot_primitives::v1::CoreIndex, polkadot_primitives::v1::GroupIndex)>, _leaving_cores: Vec<(CandidateHash, polkadot_primitives::v1::CoreIndex, polkadot_primitives::v1::GroupIndex)>,
) -> HashMap<polkadot_primitives::v1::CoreIndex, criteria::OurAssignment> { ) -> HashMap<polkadot_primitives::v1::CoreIndex, criteria::OurAssignment> {
self.0() self.0()
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment