diff --git a/polkadot/runtime/parachains/src/session_info.rs b/polkadot/runtime/parachains/src/session_info.rs index c3faec7eeb16252bd37c8af183aaadd0c5c267a7..decc25a20d01fdcf34329710820b0f12a7fc39ba 100644 --- a/polkadot/runtime/parachains/src/session_info.rs +++ b/polkadot/runtime/parachains/src/session_info.rs @@ -101,8 +101,11 @@ impl<T: Config> Module<T> { // update `EarliestStoredSession` based on `config.dispute_period` EarliestStoredSession::set(new_earliest_stored_session); // remove all entries from `Sessions` from the previous value up to the new value - for idx in old_earliest_stored_session..new_earliest_stored_session { - Sessions::remove(&idx); + // avoid a potentially heavy loop when introduced on a live chain + if old_earliest_stored_session != 0 || Sessions::get(0).is_some() { + for idx in old_earliest_stored_session..new_earliest_stored_session { + Sessions::remove(&idx); + } } // create a new entry in `Sessions` with information about the current session let new_session_info = SessionInfo { @@ -216,7 +219,7 @@ mod tests { } #[test] - fn session_pruning_is_based_on_dispute_deriod() { + fn session_pruning_is_based_on_dispute_period() { new_test_ext(genesis_config()).execute_with(|| { run_to_block(100, session_changes); assert_eq!(EarliestStoredSession::get(), 9); @@ -253,4 +256,26 @@ mod tests { assert_eq!(session.needed_approvals, 42); }) } + + #[test] + fn session_pruning_avoids_heavy_loop() { + new_test_ext(genesis_config()).execute_with(|| { + let start = 1_000_000_000; + System::on_initialize(start); + System::set_block_number(start); + + if let Some(notification) = new_session_every_block(start) { + Configuration::initializer_on_new_session(¬ification.validators, ¬ification.queued); + SessionInfo::initializer_on_new_session(¬ification); + } + + Configuration::initializer_initialize(start); + SessionInfo::initializer_initialize(start); + + assert_eq!(EarliestStoredSession::get(), start - 1); + + run_to_block(start + 1, new_session_every_block); + assert_eq!(EarliestStoredSession::get(), start); + }) + } }