From d444c0565e854d25022bb28c2522e0598922bacc Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:17:07 +0100 Subject: [PATCH 1/9] impl prefered items Closes #4330 --- runtime/parachains/src/paras_inherent.rs | 43 +++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index db0ed5ec9043..74141e725606 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -682,16 +682,39 @@ where fn random_sel Weight>( rng: &mut rand_chacha::ChaChaRng, selectables: Vec, + mut prefered_indices: Vec, weight_fn: F, weight_limit: Weight, ) -> (Weight, Vec) { if selectables.is_empty() { return (0 as Weight, Vec::new()) } - let mut indices = (0..selectables.len()).into_iter().collect::>(); + // all indices that are not part of the prefered set + let mut indices = (0..selectables.len()) + .into_iter() + .filter(|idx| !prefered_indices.contains(idx)) + .collect::>(); let mut picked_indices = Vec::with_capacity(selectables.len().saturating_sub(1)); let mut weight_acc = 0 as Weight; + + // also shuffle the prefered ones + rng.shuffle(&mut prefered_indices); + for prefered_idx in prefered_indices { + + // prefered indices originate from outside + if let Some(item) = selectables.get(prefered_idx) { + weight_acc += weight_fn(item); + + let updated = weight_acc + weight_fn(item); + if updated > weight_limit { + continue + } + weight_acc = updated; + picked_indices.push(prefered_idx); + } + } + while !indices.is_empty() { // randomly pick an index let pick = rng.gen_range(0..indices.len()); @@ -743,6 +766,21 @@ fn apply_weight_limit( return total } + // Prefer code upgrades, they tend to be large and hence stand no chance to be picked + // late while maintaining the weight bounds + let preferd_indices = candidates + .iter() + .enumerate() + .filter_map(|(idx, &candidate)| { + candidate + .candidate + .commitments + .new_validation_code + .as_ref() + .map(move |_code| idx) + }) + .collect::>(); + // There is weight remaining to be consumed by a subset of candidates // which are going to be picked now. if let Some(remaining_weight) = remaining_weight.checked_sub(total_bitfields_weight) { @@ -750,6 +788,7 @@ fn apply_weight_limit( random_sel::::Hash>, _>( rng, candidates.clone(), + vec![], |c| backed_candidate_weight::(c), remaining_weight, ); @@ -772,6 +811,7 @@ fn apply_weight_limit( let (total, indices) = random_sel::( rng, bitfields.clone(), + vec![], |_| <::WeightInfo as WeightInfo>::enter_bitfields(), remaining_weight, ); @@ -1010,6 +1050,7 @@ fn limit_disputes( let (acc_remote_disputes_weight, indices) = random_sel::( rng, d, + vec![], |v| <::WeightInfo as WeightInfo>::enter_variable_disputes(*v), remaining_weight, ); From 4e0703542a3c0e46742b8bdb4d33c749e44cd0e1 Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:17:42 +0100 Subject: [PATCH 2/9] do not stop attempting to select, just because one did not fit --- runtime/parachains/src/paras_inherent.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 74141e725606..040d43a882ec 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -722,11 +722,12 @@ fn random_sel Weight>( let idx = indices.swap_remove(pick); let item = &selectables[idx]; - weight_acc += weight_fn(item); + let updated = weight_acc + weight_fn(item); - if weight_acc > weight_limit { - break + if updated > weight_limit { + continue } + weight_acc = updated; picked_indices.push(idx); } From adaa92a05f112d1b4e921b575954295cd56e59c8 Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:17:55 +0100 Subject: [PATCH 3/9] doc --- runtime/parachains/src/paras_inherent.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 040d43a882ec..dbd19dcf7fe8 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -969,6 +969,10 @@ fn sanitize_backed_candidates(parent_hash: T::Hash) -> [u8; 32] { const CANDIDATE_SEED_SUBJECT: [u8; 32] = *b"candidate-seed-selection-subject"; let vrf_random = CurrentBlockRandomness::::random(&CANDIDATE_SEED_SUBJECT[..]).0; From eca1c495fc96072456cd5b171f46c48f52d60400 Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:33:41 +0100 Subject: [PATCH 4/9] prefered -> preferred --- runtime/parachains/src/paras_inherent.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index dbd19dcf7fe8..4b1e07407aba 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -682,28 +682,28 @@ where fn random_sel Weight>( rng: &mut rand_chacha::ChaChaRng, selectables: Vec, - mut prefered_indices: Vec, + mut preferred_indices: Vec, weight_fn: F, weight_limit: Weight, ) -> (Weight, Vec) { if selectables.is_empty() { return (0 as Weight, Vec::new()) } - // all indices that are not part of the prefered set + // all indices that are not part of the preferred set let mut indices = (0..selectables.len()) .into_iter() - .filter(|idx| !prefered_indices.contains(idx)) + .filter(|idx| !preferred_indices.contains(idx)) .collect::>(); let mut picked_indices = Vec::with_capacity(selectables.len().saturating_sub(1)); let mut weight_acc = 0 as Weight; - // also shuffle the prefered ones - rng.shuffle(&mut prefered_indices); - for prefered_idx in prefered_indices { + // also shuffle the preferred ones + rng.shuffle(&mut preferred_indices); + for preferred_idx in preferred_indices { - // prefered indices originate from outside - if let Some(item) = selectables.get(prefered_idx) { + // preferred indices originate from outside + if let Some(item) = selectables.get(preferred_idx) { weight_acc += weight_fn(item); let updated = weight_acc + weight_fn(item); @@ -711,7 +711,7 @@ fn random_sel Weight>( continue } weight_acc = updated; - picked_indices.push(prefered_idx); + picked_indices.push(preferred_idx); } } From ff0bb1bbf57741f690805838eb7d8903fb47ef2a Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:35:34 +0100 Subject: [PATCH 5/9] missing usage of the preferred indices --- runtime/parachains/src/paras_inherent.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 4b1e07407aba..8dd3bfe09ed5 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -672,7 +672,7 @@ where DisputedBitfield::from(bitvec) } -/// Select a random subset +/// Select a random subset, with preference for certain indices. /// /// Adds random items to the set until all candidates /// are tried or the remaining weight is depleted. @@ -789,7 +789,7 @@ fn apply_weight_limit( random_sel::::Hash>, _>( rng, candidates.clone(), - vec![], + preferred_indices, |c| backed_candidate_weight::(c), remaining_weight, ); From f90246350f0549a8c0471733ef2b4ed96650f7cc Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:36:38 +0100 Subject: [PATCH 6/9] sigh --- runtime/parachains/src/paras_inherent.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 8dd3bfe09ed5..dd6ce247c021 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -769,7 +769,7 @@ fn apply_weight_limit( // Prefer code upgrades, they tend to be large and hence stand no chance to be picked // late while maintaining the weight bounds - let preferd_indices = candidates + let preferred_indices = candidates .iter() .enumerate() .filter_map(|(idx, &candidate)| { From f1de2d368671efafdfaa31765c87653b1027d32a Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:37:56 +0100 Subject: [PATCH 7/9] shuffle is not available for chacha --- runtime/parachains/src/paras_inherent.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index dd6ce247c021..9d67eb1ff0b2 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -698,9 +698,11 @@ fn random_sel Weight>( let mut weight_acc = 0 as Weight; - // also shuffle the preferred ones - rng.shuffle(&mut preferred_indices); - for preferred_idx in preferred_indices { + while !preferred_indices.is_empty() { + // randomly pick an index from the preferred set + let pick = rng.gen_range(0..preferred_indices.len()); + // remove the index from the available set of preferred indices + let preferred_idx = preferred_indices.swap_remove(pick); // preferred indices originate from outside if let Some(item) = selectables.get(preferred_idx) { From 7bd1bd0186bfae17e40cf8e5fa8e837567eada19 Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 17:49:29 +0100 Subject: [PATCH 8/9] remove duplicate weight addition --- runtime/parachains/src/paras_inherent.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index 9d67eb1ff0b2..e4ac62bc10a3 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -706,8 +706,6 @@ fn random_sel Weight>( // preferred indices originate from outside if let Some(item) = selectables.get(preferred_idx) { - weight_acc += weight_fn(item); - let updated = weight_acc + weight_fn(item); if updated > weight_limit { continue From 5e3d1fdd1f5f32be4f15e0d06e5f9b3b936c56fa Mon Sep 17 00:00:00 2001 From: Bernhard Schuster Date: Fri, 19 Nov 2021 18:00:18 +0100 Subject: [PATCH 9/9] ref vs no ref --- runtime/parachains/src/paras_inherent.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/runtime/parachains/src/paras_inherent.rs b/runtime/parachains/src/paras_inherent.rs index e4ac62bc10a3..8f34181d1149 100644 --- a/runtime/parachains/src/paras_inherent.rs +++ b/runtime/parachains/src/paras_inherent.rs @@ -772,13 +772,8 @@ fn apply_weight_limit( let preferred_indices = candidates .iter() .enumerate() - .filter_map(|(idx, &candidate)| { - candidate - .candidate - .commitments - .new_validation_code - .as_ref() - .map(move |_code| idx) + .filter_map(|(idx, candidate)| { + candidate.candidate.commitments.new_validation_code.as_ref().map(|_code| idx) }) .collect::>();