mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-17 15:55:42 +00:00
eaf057c5ed
* First baby steps * Split scheduler into several modules * Towards a more modular approach for scheduling * move free_cores; IntoInterator -> BTreeMap * Move clear() * Move more functions out of scheduler * Change weight composition * More abstraction * Further refactor * clippy * fmt * fix test-runtime * Add parathreads pallet to construct_runtime! * Make all runtimes use (Parachains, Parathreads) scheduling * Delete commented out code * Remove parathreads scheduler from westend, rococo, and kusama * fix rococo, westend, and kusama config * Revert "fix rococo, westend, and kusama config" This reverts commit 59e4de380d5c7d17eaaba5e2c2b81405de3465e3. * Revert "Remove parathreads scheduler from westend, rococo, and kusama" This reverts commit 4c44255296083ac5670560790ed77104917890a4. * Remove CoreIndex from free_cores * Remove unnecessary struct for parathreads * parathreads provider take 1 * Comment out parathread tests * Pop into lookahead * fmt * Fill lookahead with two entries for parachains * fmt * Current stage * Towards ab parathreads * no AB use * Make tests typecheck * quick hack to set scheduling lookahead to 1 * Fix scheduler tests * fix paras_inherent tests * misc * Update more of a test * cfg(test) * some cleanup * Undo paras_inherent changes * Adjust paras inherent tests * Undo changes to v2 primitives * Undo v2 mod changes to tests * minor * Remove parathreads assigner and pallet * minor * minor * more cleanup * fmt * minor * minor * minor * Remove on_new_session from assignment provider * Make adder collator integration test pass * disable failing unit tests * minor * minor * re-enable one unit test * minor * handle retries, add concluded para to pop interface * comment out unused code * Remove core_para from interface * Remove first claimqueue element on clear if None instead removing all Nones * Move claimqueue get out of loop * Use VecDeque instead of Ved in ClaimQueue * Make occupied() AB ready(?) * handle freed disputed in clear_and_fill_claimqueue * clear_and_fill_claimqueue returns scheduled Vec * Rename and minor refactor * return position of assignment taken from claimqueue * minor * Fix session boundary parachains number change + extended test * Fix runtimes * Fix polkadot runtime * Remove polkadot pallet from benchmarks * fix test runtime * Add storage migration * Minor refactor * Minor * migratin typechecks * Add migration to runtimes * Towards modular scheduling II (#6568) * Add post migration check * pebkac * Disable migrations but mine * Revert "Disable migrations but mine" This reverts commit 4fa5c5a370c199944a7e0926f50b08626bfbad4c. * Move scheduler migration * Revert "Move scheduler migration" This reverts commit a16b1659a907950bae048a9f7010f2aa76e02b6d. * Fix migration * cleanup * Don't lose retries value anymore * comment out test function * Remove retries value from Assignment again * minor * Make collator for parathreads optional * data type refactor * update scheduler tests * Change test function cfg * comment out test function * Try cfg(test) only * fix cfg flags * Add get_max_retries function to provider interface (#7047) * Fix merge commit * pebkac * fix merge * update cargo.lock * fix merge * fix merge * Use btreemap instead of vec, fix scheduler calls. * Use imported `ScheduledCore` * Remove unused import in inclusion tests * Use keys() instead of mapping over a BTreeMap * Fix migrations for parachains scheduler * Use BlockNumberFor<T> everywhere in scheduler * Add on demand assignment provider pallet (#7110) * Address some PR comments * minor * more cleanup * find_map and timeout availability fixes * Change default scheduling_lookahead to 1 * Add on demand assignment provider pallet * Move test-runtime to new assignment provider * Run cargo format on scheduler tests * minor * Mutate cores in single loop * timeout predicate simplification * claimqueue desired size fix * Replace expect by ok_or * More improvements * Fix push back order and next_up_on_timeout * minor * session change docs * Add pre_new_session call to hand pre session updates * Remove sc_network dependency and PeerId from unnecessary data structures * Remove unnecessary peer_ids * Add OnDemandOrdering proxy (#7156) * Add OnDemandBidding proxy * Fix names * OnDemandAssigner for rococo only * Check PeerId in collator protocol before fetching collation * On occupied, remove non occupied cores from the claimqueue front and refill * Add missing docs * Comment out unused field * fix ScheduledCore in tests * Fix the fix * pebkac * fmt * Fix occupied dropping * Remove double import * ScheduledCore fixes * Readd sc-network dep * pebkac * OpaquePeerId -> PeerId in can_collate interface * Cargo.lock update for interface change * Remove checks not needed anymore? * Drop occupied core on session change if it would time out after the new session * Add on demand assignment provider pallet * Move test-runtime to new assignment provider * Run cargo format on scheduler tests * Add OnDemandOrdering proxy (#7156) * Add OnDemandBidding proxy * Fix names * OnDemandAssigner for rococo only * Remove unneeded config values * Update comments * Use and_then for queue position * Return the max size of the spot queue on error * Add comments to add_parathread_entry * Add module comments * Add log for when can_collate fails * Change assigner queue type to `Assignment` * Update assignment provider tests * More logs * Remove unused keyring import * disable can_collate * comment out can_collate * Can collate first checks set if empty * Move can_collate call to collation advertisement * Fix backing test * map to loop * Remove obsolete check * Move invalid collation test from backing to collator-protocol * fix unused imports * fix test * fix Debug derivation * Increase time limit on zombienet predicates * Increase zombienet timeout * Minor * Address some PR comments * Address PR comments * Comment out failing assert due to on-demand assigner missing * remove collator_restrictions info from backing * Move can_collate to ActiveParas * minor * minor * Update weight information for on demand config * Add ttl to parasentry * Fix tests missing parasentry ttl * Adjust scheduler tests to use ttl default values * Use match instead of if let for ttl drop * Use RuntimeDebug trait for `ParasEntry` fields * Add comments to on demand assignment pallet * Fix spot traffic calculation * Revert runtimedebug changes to primitives * Remove runtimedebug derivation from `ParasEntry` * Mention affinity in pallet level docs * Use RuntimeDebug trait for ParasEntry child types * Remove collator restrictions * Fix primitive versioning and other merge issues * Fix tests post merge * Fix node side tests * Edit parascheduler migration for clarity * Move parascheduler migration up to next release * Remove vestiges from merge * Fix tests * Refactor ttl handling * Remove unused things from scheduler tests * Move on demand assigner to own directory * Update documentation * Remove unused sc-network dependency in primitives Was used for collator restrictions * Remove unused import * Reenable scheduler test * Remove unused storage value * Enable timeout predicate test and fix fn Turns out that the issue with the compiler is fixed and we can now use impl Trait in the manner used here. * Remove unused imports * Add benchmarking entry for perbill in config * Correct typo * Address review comments * Log out errors when calculating spot traffic. * Change parascheduler's log target name * Update scheduler_common documentation * Use mutate for affinity fns, add tests * Add another on demand affinity test * Unify parathreads and parachains in HostConfig (take 2) (#7452) * Unify parathreads and parachains in HostConfig * Fixed missed occurences * Remove commented out lines * `HostConfiguration v7` * Fix version check * Add `MigrateToV7` to `Unreleased` * fmt * fmt * Fix compilation errors after the rebase * Update runtime/parachains/src/scheduler/tests.rs Co-authored-by: Anton Vilhelm Ásgeirsson <antonva@users.noreply.github.com> * Update runtime/parachains/src/scheduler/tests.rs Co-authored-by: Anton Vilhelm Ásgeirsson <antonva@users.noreply.github.com> * fmt * Fix migration test * Fix tests * Remove unneeded assert from tests * parathread_cores -> on_demand_cores; parathread_retries -> on_demand_retries * Fix a compilation error in tests * Remove unused `use` * update colander image version --------- Co-authored-by: alexgparity <alex.gremm@parity.io> Co-authored-by: Anton Vilhelm Ásgeirsson <antonva@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> * Fix branch after merge with master * Refactor out duplicate checks into a helper fn * Fix tests post merge * Rename add_parathread_assignment, add test * Update docs * Remove unused on_finalize function * Add weight info to on demand pallet * Update runtime/parachains/src/configuration.rs Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> * Update runtime/parachains/src/scheduler_common/mod.rs Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> * Update runtime/parachains/src/assigner_on_demand/mod.rs Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> * Add benchmarking to on demand pallet * Make place_order test check for success * Add on demand benchmarks * Add local test weights to rococo runtime * Modify TTL drop behaviour to not skip claims Previous behaviour would jump a new claim from the assignment provider ahead in the claimqueue, assuming lookahead is larger than 1. * Refactor ttl test to test claimqueue order * Disable place_order ext. when no on_demand cores * Use default genesis config for benchmark tests * Refactor config builder param * Move lifecycle test from scheduler to on demand * Remove unneeded lifecycle test Paras module via the parachain assignment provider doesn't provide new assignments if a parachain loses it's lease. The on demand assignment provider doesn't provide an assignment that is not a parathread. * Re enable validator shuffle test * More realistic weights for place_order * Remove redundant import * Fix backwards compatibility (hopefully) * ".git/.scripts/commands/bench/bench.sh" --subcommand=runtime --runtime=rococo --target_dir=polkadot --pallet=runtime_parachains::assigner_on_demand * Fix tests. * Fix off-by-one. * Re enable claimqueue fills test * Re enable schedule_rotates_groups test * Fix fill_claimqueue_fills test * Re enable next_up_on_timeout test, move fn * Do not pop from assignment provider when retrying * Fix tests missing collator in scheduledcore * Add comment about timeout predicate. * Rename parasentry retries to availability timeouts * Re enable schedule_schedules... test * Refactor prune retried test to new scheduler * Have all scheduler tests use genesis_cfg fn * Update docs * Update copyright notices on new files * Rename is_parachain_core to is_bulk_core * Remove erroneous TODO * Simplify import * ".git/.scripts/commands/bench/bench.sh" --subcommand=runtime --runtime=rococo --target_dir=polkadot --pallet=runtime_parachains::configuration * Revert AdvertiseCollation order shuffle * Refactor place_order into keepalive and allowdeath * Revert rename of hrmp max inbound channels parachain encompasses both on demand and slot auction / bulk. * Restore availability_timeout_predicate function * Clean up leftover comments * Update runtime/parachains/src/scheduler/tests.rs Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> * ".git/.scripts/commands/bench/bench.sh" --subcommand=runtime --runtime=westend --target_dir=polkadot --pallet=runtime_parachains::configuration --------- Co-authored-by: alexgparity <alex.gremm@parity.io> Co-authored-by: alexgparity <115470171+alexgparity@users.noreply.github.com> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: eskimor <eskimor@no-such-url.com> Co-authored-by: command-bot <> * On Demand - update weights and small nits (#7605) * Remove collator restriction test in inclusion On demand parachains won't have collator restrictions implemented in this way but will instead use a preferred collator registered to a `ParaId` in `paras_registrar`. * Remove redundant config guard for test fns * Update weights * Update WeightInfo for on_demand assigner * Unify assignment provider parameters into one call (#7606) * Combine assignmentprovider params into one fn call * Move scheduler_common to a module under scheduler * Fix ttl handling in benchmark builder * Run cargo format * Remove obsolete test. * Small improvement. * Use same migration pattern as config module * Remove old TODO * Change log target name for assigner on demand * Fix migration * Fix clippy warnings * Add HostConfiguration storage migration to V8 * Add `MigrateToV8` to unreleased migrations for all runtimes * Fix storage version check for config v8 * Set `StorageVersion` to 8 in `MigrateToV8` * Remove dups. * Update primitives/src/v5/mod.rs Co-authored-by: Bastian Köcher <git@kchr.de> --------- Co-authored-by: alexgparity <alex.gremm@parity.io> Co-authored-by: alexgparity <115470171+alexgparity@users.noreply.github.com> Co-authored-by: antonva <anton.asgeirsson@parity.io> Co-authored-by: Tsvetomir Dimitrov <tsvetomir@parity.io> Co-authored-by: Anton Vilhelm Ásgeirsson <antonva@users.noreply.github.com> Co-authored-by: Javier Viola <javier@parity.io> Co-authored-by: eskimor <eskimor@no-such-url.com> Co-authored-by: Bastian Köcher <git@kchr.de>
342 lines
11 KiB
Rust
342 lines
11 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Polkadot is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! This module is responsible for maintaining a consistent initialization order for all other
|
|
//! parachains modules. It's also responsible for finalization and session change notifications.
|
|
//!
|
|
//! This module can throw fatal errors if session-change notifications are received after
|
|
//! initialization.
|
|
|
|
use crate::{
|
|
configuration::{self, HostConfiguration},
|
|
disputes::{self, DisputesHandler as _, SlashingHandler as _},
|
|
dmp, hrmp, inclusion, paras, scheduler, session_info, shared,
|
|
};
|
|
use frame_support::{
|
|
traits::{OneSessionHandler, Randomness},
|
|
weights::Weight,
|
|
};
|
|
use frame_system::limits::BlockWeights;
|
|
use parity_scale_codec::{Decode, Encode};
|
|
use primitives::{BlockNumber, ConsensusLog, SessionIndex, ValidatorId};
|
|
use scale_info::TypeInfo;
|
|
use sp_std::prelude::*;
|
|
|
|
#[cfg(test)]
|
|
mod tests;
|
|
|
|
#[cfg(feature = "runtime-benchmarks")]
|
|
mod benchmarking;
|
|
|
|
pub use pallet::*;
|
|
|
|
/// Information about a session change that has just occurred.
|
|
#[derive(Clone)]
|
|
pub struct SessionChangeNotification<BlockNumber> {
|
|
/// The new validators in the session.
|
|
pub validators: Vec<ValidatorId>,
|
|
/// The queued validators for the following session.
|
|
pub queued: Vec<ValidatorId>,
|
|
/// The configuration before handling the session change
|
|
pub prev_config: HostConfiguration<BlockNumber>,
|
|
/// The configuration after handling the session change.
|
|
pub new_config: HostConfiguration<BlockNumber>,
|
|
/// A secure random seed for the session, gathered from BABE.
|
|
pub random_seed: [u8; 32],
|
|
/// New session index.
|
|
pub session_index: SessionIndex,
|
|
}
|
|
|
|
/// Number of validators (not only parachain) in a session.
|
|
pub type ValidatorSetCount = u32;
|
|
|
|
impl<BlockNumber: Default + From<u32>> Default for SessionChangeNotification<BlockNumber> {
|
|
fn default() -> Self {
|
|
Self {
|
|
validators: Vec::new(),
|
|
queued: Vec::new(),
|
|
prev_config: HostConfiguration::default(),
|
|
new_config: HostConfiguration::default(),
|
|
random_seed: Default::default(),
|
|
session_index: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Encode, Decode, TypeInfo)]
|
|
struct BufferedSessionChange {
|
|
validators: Vec<ValidatorId>,
|
|
queued: Vec<ValidatorId>,
|
|
session_index: SessionIndex,
|
|
}
|
|
|
|
pub trait WeightInfo {
|
|
fn force_approve(d: u32) -> Weight;
|
|
}
|
|
|
|
impl WeightInfo for () {
|
|
fn force_approve(_: u32) -> Weight {
|
|
BlockWeights::default().max_block
|
|
}
|
|
}
|
|
|
|
#[frame_support::pallet]
|
|
pub mod pallet {
|
|
use super::*;
|
|
use frame_support::pallet_prelude::*;
|
|
use frame_system::pallet_prelude::*;
|
|
|
|
#[pallet::pallet]
|
|
#[pallet::without_storage_info]
|
|
pub struct Pallet<T>(_);
|
|
|
|
#[pallet::config]
|
|
pub trait Config:
|
|
frame_system::Config
|
|
+ configuration::Config
|
|
+ shared::Config
|
|
+ paras::Config
|
|
+ scheduler::Config
|
|
+ inclusion::Config
|
|
+ session_info::Config
|
|
+ disputes::Config
|
|
+ dmp::Config
|
|
+ hrmp::Config
|
|
{
|
|
/// A randomness beacon.
|
|
type Randomness: Randomness<Self::Hash, BlockNumberFor<Self>>;
|
|
/// An origin which is allowed to force updates to parachains.
|
|
type ForceOrigin: EnsureOrigin<<Self as frame_system::Config>::RuntimeOrigin>;
|
|
/// Weight information for extrinsics in this pallet.
|
|
type WeightInfo: WeightInfo;
|
|
}
|
|
|
|
/// Whether the parachains modules have been initialized within this block.
|
|
///
|
|
/// Semantically a `bool`, but this guarantees it should never hit the trie,
|
|
/// as this is cleared in `on_finalize` and Frame optimizes `None` values to be empty values.
|
|
///
|
|
/// As a `bool`, `set(false)` and `remove()` both lead to the next `get()` being false, but one
|
|
/// of them writes to the trie and one does not. This confusion makes `Option<()>` more suitable
|
|
/// for the semantics of this variable.
|
|
#[pallet::storage]
|
|
pub(super) type HasInitialized<T: Config> = StorageValue<_, ()>;
|
|
|
|
/// Buffered session changes along with the block number at which they should be applied.
|
|
///
|
|
/// Typically this will be empty or one element long. Apart from that this item never hits
|
|
/// the storage.
|
|
///
|
|
/// However this is a `Vec` regardless to handle various edge cases that may occur at runtime
|
|
/// upgrade boundaries or if governance intervenes.
|
|
#[pallet::storage]
|
|
pub(super) type BufferedSessionChanges<T: Config> =
|
|
StorageValue<_, Vec<BufferedSessionChange>, ValueQuery>;
|
|
|
|
#[pallet::hooks]
|
|
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
|
|
fn on_initialize(now: BlockNumberFor<T>) -> Weight {
|
|
// The other modules are initialized in this order:
|
|
// - Configuration
|
|
// - Paras
|
|
// - Scheduler
|
|
// - Inclusion
|
|
// - `SessionInfo`
|
|
// - Disputes
|
|
// - DMP
|
|
// - UMP
|
|
// - HRMP
|
|
let total_weight = configuration::Pallet::<T>::initializer_initialize(now) +
|
|
shared::Pallet::<T>::initializer_initialize(now) +
|
|
paras::Pallet::<T>::initializer_initialize(now) +
|
|
scheduler::Pallet::<T>::initializer_initialize(now) +
|
|
inclusion::Pallet::<T>::initializer_initialize(now) +
|
|
session_info::Pallet::<T>::initializer_initialize(now) +
|
|
T::DisputesHandler::initializer_initialize(now) +
|
|
T::SlashingHandler::initializer_initialize(now) +
|
|
dmp::Pallet::<T>::initializer_initialize(now) +
|
|
hrmp::Pallet::<T>::initializer_initialize(now);
|
|
|
|
HasInitialized::<T>::set(Some(()));
|
|
|
|
total_weight
|
|
}
|
|
|
|
fn on_finalize(now: BlockNumberFor<T>) {
|
|
// reverse initialization order.
|
|
hrmp::Pallet::<T>::initializer_finalize();
|
|
dmp::Pallet::<T>::initializer_finalize();
|
|
T::SlashingHandler::initializer_finalize();
|
|
T::DisputesHandler::initializer_finalize();
|
|
session_info::Pallet::<T>::initializer_finalize();
|
|
inclusion::Pallet::<T>::initializer_finalize();
|
|
scheduler::Pallet::<T>::initializer_finalize();
|
|
paras::Pallet::<T>::initializer_finalize(now);
|
|
shared::Pallet::<T>::initializer_finalize();
|
|
configuration::Pallet::<T>::initializer_finalize();
|
|
|
|
// Apply buffered session changes as the last thing. This way the runtime APIs and the
|
|
// next block will observe the next session.
|
|
//
|
|
// Note that we only apply the last session as all others lasted less than a block
|
|
// (weirdly).
|
|
if let Some(BufferedSessionChange { session_index, validators, queued }) =
|
|
BufferedSessionChanges::<T>::take().pop()
|
|
{
|
|
Self::apply_new_session(session_index, validators, queued);
|
|
}
|
|
|
|
HasInitialized::<T>::take();
|
|
}
|
|
}
|
|
|
|
#[pallet::call]
|
|
impl<T: Config> Pallet<T> {
|
|
/// Issue a signal to the consensus engine to forcibly act as though all parachain
|
|
/// blocks in all relay chain blocks up to and including the given number in the current
|
|
/// chain are valid and should be finalized.
|
|
#[pallet::call_index(0)]
|
|
#[pallet::weight((
|
|
<T as Config>::WeightInfo::force_approve(
|
|
frame_system::Pallet::<T>::digest().logs.len() as u32,
|
|
),
|
|
DispatchClass::Operational,
|
|
))]
|
|
pub fn force_approve(origin: OriginFor<T>, up_to: BlockNumber) -> DispatchResult {
|
|
T::ForceOrigin::ensure_origin(origin)?;
|
|
|
|
frame_system::Pallet::<T>::deposit_log(ConsensusLog::ForceApprove(up_to).into());
|
|
Ok(())
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Config> Pallet<T> {
|
|
fn apply_new_session(
|
|
session_index: SessionIndex,
|
|
all_validators: Vec<ValidatorId>,
|
|
queued: Vec<ValidatorId>,
|
|
) {
|
|
let random_seed = {
|
|
let mut buf = [0u8; 32];
|
|
// TODO: audit usage of randomness API
|
|
// https://github.com/paritytech/polkadot/issues/2601
|
|
let (random_hash, _) = T::Randomness::random(&b"paras"[..]);
|
|
let len = sp_std::cmp::min(32, random_hash.as_ref().len());
|
|
buf[..len].copy_from_slice(&random_hash.as_ref()[..len]);
|
|
buf
|
|
};
|
|
|
|
// inform about upcoming new session
|
|
scheduler::Pallet::<T>::pre_new_session();
|
|
|
|
let configuration::SessionChangeOutcome { prev_config, new_config } =
|
|
configuration::Pallet::<T>::initializer_on_new_session(&session_index);
|
|
let new_config = new_config.unwrap_or_else(|| prev_config.clone());
|
|
|
|
let validators = shared::Pallet::<T>::initializer_on_new_session(
|
|
session_index,
|
|
random_seed,
|
|
&new_config,
|
|
all_validators,
|
|
);
|
|
|
|
let notification = SessionChangeNotification {
|
|
validators,
|
|
queued,
|
|
prev_config,
|
|
new_config,
|
|
random_seed,
|
|
session_index,
|
|
};
|
|
|
|
let outgoing_paras = paras::Pallet::<T>::initializer_on_new_session(¬ification);
|
|
scheduler::Pallet::<T>::initializer_on_new_session(¬ification);
|
|
inclusion::Pallet::<T>::initializer_on_new_session(¬ification, &outgoing_paras);
|
|
session_info::Pallet::<T>::initializer_on_new_session(¬ification);
|
|
T::DisputesHandler::initializer_on_new_session(¬ification);
|
|
T::SlashingHandler::initializer_on_new_session(session_index);
|
|
dmp::Pallet::<T>::initializer_on_new_session(¬ification, &outgoing_paras);
|
|
hrmp::Pallet::<T>::initializer_on_new_session(¬ification, &outgoing_paras);
|
|
}
|
|
|
|
/// Should be called when a new session occurs. Buffers the session notification to be applied
|
|
/// at the end of the block. If `queued` is `None`, the `validators` are considered queued.
|
|
fn on_new_session<'a, I: 'a>(
|
|
_changed: bool,
|
|
session_index: SessionIndex,
|
|
validators: I,
|
|
queued: Option<I>,
|
|
) where
|
|
I: Iterator<Item = (&'a T::AccountId, ValidatorId)>,
|
|
{
|
|
let validators: Vec<_> = validators.map(|(_, v)| v).collect();
|
|
let queued: Vec<_> = if let Some(queued) = queued {
|
|
queued.map(|(_, v)| v).collect()
|
|
} else {
|
|
validators.clone()
|
|
};
|
|
|
|
if session_index == 0 {
|
|
// Genesis session should be immediately enacted.
|
|
Self::apply_new_session(0, validators, queued);
|
|
} else {
|
|
BufferedSessionChanges::<T>::mutate(|v| {
|
|
v.push(BufferedSessionChange { validators, queued, session_index })
|
|
});
|
|
}
|
|
}
|
|
|
|
// Allow to trigger `on_new_session` in tests, this is needed as long as `pallet_session` is not
|
|
// implemented in mock.
|
|
#[cfg(any(test, feature = "runtime-benchmarks"))]
|
|
pub(crate) fn test_trigger_on_new_session<'a, I: 'a>(
|
|
changed: bool,
|
|
session_index: SessionIndex,
|
|
validators: I,
|
|
queued: Option<I>,
|
|
) where
|
|
I: Iterator<Item = (&'a T::AccountId, ValidatorId)>,
|
|
{
|
|
Self::on_new_session(changed, session_index, validators, queued)
|
|
}
|
|
}
|
|
|
|
impl<T: Config> sp_runtime::BoundToRuntimeAppPublic for Pallet<T> {
|
|
type Public = ValidatorId;
|
|
}
|
|
|
|
impl<T: pallet_session::Config + Config> OneSessionHandler<T::AccountId> for Pallet<T> {
|
|
type Key = ValidatorId;
|
|
|
|
fn on_genesis_session<'a, I: 'a>(validators: I)
|
|
where
|
|
I: Iterator<Item = (&'a T::AccountId, Self::Key)>,
|
|
{
|
|
<Pallet<T>>::on_new_session(false, 0, validators, None);
|
|
}
|
|
|
|
fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued: I)
|
|
where
|
|
I: Iterator<Item = (&'a T::AccountId, Self::Key)>,
|
|
{
|
|
let session_index = <pallet_session::Pallet<T>>::current_index();
|
|
<Pallet<T>>::on_new_session(changed, session_index, validators, Some(queued));
|
|
}
|
|
|
|
fn on_disabled(_i: u32) {}
|
|
}
|