From 10b0b4a3f46e05c50d83a0e618a4fcbc1287c241 Mon Sep 17 00:00:00 2001 From: Parity Date: Mon, 22 Feb 2021 20:20:37 +0530 Subject: [PATCH 1/5] override authorities runtime call --- runtime/parachains/src/runtime_api_impl/v1.rs | 18 +++++++++++++++++- runtime/rococo/src/lib.rs | 7 ++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index da10aa36410c..9bfafd6b8c81 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -25,11 +25,12 @@ use primitives::v1::{ Id as ParaId, OccupiedCoreAssumption, SessionIndex, ValidationCode, CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, GroupIndex, CandidateEvent, PersistedValidationData, SessionInfo, - InboundDownwardMessage, InboundHrmpMessage, Hash, + InboundDownwardMessage, InboundHrmpMessage, Hash, AuthorityDiscoveryId }; use frame_support::debug; use crate::{initializer, inclusion, scheduler, configuration, paras, session_info, dmp, hrmp, shared}; + /// Implementation for the `validators` function of the runtime API. pub fn validators() -> Vec { >::validators() @@ -231,6 +232,21 @@ pub fn session_index_for_child() -> SessionIndex { >::session_index() } +pub fn get_historical_authority_ids() -> Vec { + let current_session_index = session_index_for_child::(); + let earliest_stored_session = >::earliest_stored_session(); + let mut authority_ids = vec![]; + + for session_index in earliest_stored_session..current_session_index { + let info = >::session_info(session_index); + if info.is_some() { + authority_ids.append(&mut info.unwrap().discovery_keys); + } + } + + authority_ids +} + /// Implementation for the `validation_code` function of the runtime API. pub fn validation_code( para_id: ParaId, diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index ba2d833eaa2f..5e34db8ee221 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -849,7 +849,12 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - AuthorityDiscovery::authorities() + let mut authorities = AuthorityDiscovery::authorities(); + let mut past_authorities = runtime_api_impl::get_historical_authority_ids::(); + authorities.append(&mut past_authorities); + authorities.sort(); + authorities.dedup(); + authorities } } From 21846f84bd6621172e3147561c791704d5ec36a3 Mon Sep 17 00:00:00 2001 From: Parth Desai Date: Mon, 22 Feb 2021 23:04:32 +0530 Subject: [PATCH 2/5] addressing feedback --- runtime/parachains/src/runtime_api_impl/v1.rs | 16 ++++++++++++---- runtime/rococo/src/lib.rs | 7 +------ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 9bfafd6b8c81..f40ff9bd2b4b 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -232,18 +232,26 @@ pub fn session_index_for_child() -> SessionIndex { >::session_index() } -pub fn get_historical_authority_ids() -> Vec { +/// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. +/// Gets current and historical authority ids using session_info module. +pub fn get_current_and_historical_authority_ids() -> Vec { let current_session_index = session_index_for_child::(); let earliest_stored_session = >::earliest_stored_session(); let mut authority_ids = vec![]; - for session_index in earliest_stored_session..current_session_index { + // At session boundary, If there is a race condition between getting session indexes above and + // loop execution, we might miss latest session's authority ids, which can break the semantics. + // So, to cover widest possible range here we are querying session info for current+1. + for session_index in earliest_stored_session..=current_session_index+1 { let info = >::session_info(session_index); - if info.is_some() { - authority_ids.append(&mut info.unwrap().discovery_keys); + if let Some(mut info) = info { + authority_ids.append(&mut info.discovery_keys); } } + authority_ids.sort(); + authority_ids.dedup(); + authority_ids } diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 5e34db8ee221..89338e691e1e 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -849,12 +849,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - let mut authorities = AuthorityDiscovery::authorities(); - let mut past_authorities = runtime_api_impl::get_historical_authority_ids::(); - authorities.append(&mut past_authorities); - authorities.sort(); - authorities.dedup(); - authorities + runtime_api_impl::get_current_and_historical_authority_ids::() } } From 25c20f00b2a4b5d89de0393e817812fbd9bb6321 Mon Sep 17 00:00:00 2001 From: Parity Date: Tue, 23 Feb 2021 09:22:31 +0530 Subject: [PATCH 3/5] addressing feedback and restoring semantics --- runtime/parachains/src/runtime_api_impl/v1.rs | 11 +++-------- runtime/rococo/src/lib.rs | 13 ++++++++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index f40ff9bd2b4b..8bc44a87322e 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -233,25 +233,20 @@ pub fn session_index_for_child() -> SessionIndex { } /// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. +/// It is a heavy call, but currently only used for authority discovery, so it is fine. /// Gets current and historical authority ids using session_info module. -pub fn get_current_and_historical_authority_ids() -> Vec { +pub fn get_historical_authority_ids() -> Vec { let current_session_index = session_index_for_child::(); let earliest_stored_session = >::earliest_stored_session(); let mut authority_ids = vec![]; - // At session boundary, If there is a race condition between getting session indexes above and - // loop execution, we might miss latest session's authority ids, which can break the semantics. - // So, to cover widest possible range here we are querying session info for current+1. - for session_index in earliest_stored_session..=current_session_index+1 { + for session_index in earliest_stored_session..current_session_index { let info = >::session_info(session_index); if let Some(mut info) = info { authority_ids.append(&mut info.discovery_keys); } } - authority_ids.sort(); - authority_ids.dedup(); - authority_ids } diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index 89338e691e1e..d4a7cf3dc14a 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -849,7 +849,18 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - runtime_api_impl::get_current_and_historical_authority_ids::() + // Past session's authority ids + let mut past_authority_ids = runtime_api_impl::get_historical_authority_ids::(); + // Current and next session's authority ids + let mut current_and_next_authority_ids = AuthorityDiscovery::authorities(); + + past_authority_ids.append(&mut current_and_next_authority_ids); + let mut authorities = past_authority_ids; + + authorities.sort(); + authorities.dedup(); + + authorities } } From 0f2db999b033eb8b24831c26d27f5e2b743c2d70 Mon Sep 17 00:00:00 2001 From: Parity Date: Tue, 23 Feb 2021 12:24:46 +0530 Subject: [PATCH 4/5] updated helper function --- runtime/parachains/src/runtime_api_impl/v1.rs | 10 ++++++++-- runtime/rococo/src/lib.rs | 13 +------------ 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 8bc44a87322e..14d0ca8d8579 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -235,18 +235,24 @@ pub fn session_index_for_child() -> SessionIndex { /// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. /// It is a heavy call, but currently only used for authority discovery, so it is fine. /// Gets current and historical authority ids using session_info module. -pub fn get_historical_authority_ids() -> Vec { +pub fn get_historical_and_current_authority_ids() -> Vec { let current_session_index = session_index_for_child::(); let earliest_stored_session = >::earliest_stored_session(); let mut authority_ids = vec![]; - for session_index in earliest_stored_session..current_session_index { + for session_index in earliest_stored_session..=current_session_index { let info = >::session_info(session_index); if let Some(mut info) = info { authority_ids.append(&mut info.discovery_keys); } } + let mut next_authorities = >::next_authorities(); + authority_ids.append(&mut next_authorities); + + authority_ids.sort(); + authority_ids.dedup(); + authority_ids } diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index d4a7cf3dc14a..d505eaa09b44 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -849,18 +849,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - // Past session's authority ids - let mut past_authority_ids = runtime_api_impl::get_historical_authority_ids::(); - // Current and next session's authority ids - let mut current_and_next_authority_ids = AuthorityDiscovery::authorities(); - - past_authority_ids.append(&mut current_and_next_authority_ids); - let mut authorities = past_authority_ids; - - authorities.sort(); - authorities.dedup(); - - authorities + runtime_api_impl::get_historical_and_current_authority_ids::() } } From db6dc2b9277768a1f5cc519e35f432e4e6706d01 Mon Sep 17 00:00:00 2001 From: Parity Date: Tue, 23 Feb 2021 16:26:54 +0530 Subject: [PATCH 5/5] naming convention + comment --- runtime/parachains/src/runtime_api_impl/v1.rs | 9 +++------ runtime/rococo/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/runtime/parachains/src/runtime_api_impl/v1.rs b/runtime/parachains/src/runtime_api_impl/v1.rs index 14d0ca8d8579..3898f9f27d60 100644 --- a/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/runtime/parachains/src/runtime_api_impl/v1.rs @@ -234,11 +234,11 @@ pub fn session_index_for_child() -> SessionIndex { /// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. /// It is a heavy call, but currently only used for authority discovery, so it is fine. -/// Gets current and historical authority ids using session_info module. -pub fn get_historical_and_current_authority_ids() -> Vec { +/// Gets next, current and some historical authority ids using session_info module. +pub fn relevant_authority_ids() -> Vec { let current_session_index = session_index_for_child::(); let earliest_stored_session = >::earliest_stored_session(); - let mut authority_ids = vec![]; + let mut authority_ids = >::next_authorities(); for session_index in earliest_stored_session..=current_session_index { let info = >::session_info(session_index); @@ -247,9 +247,6 @@ pub fn get_historical_and_current_authority_ids>::next_authorities(); - authority_ids.append(&mut next_authorities); - authority_ids.sort(); authority_ids.dedup(); diff --git a/runtime/rococo/src/lib.rs b/runtime/rococo/src/lib.rs index d505eaa09b44..b04cd72609e9 100644 --- a/runtime/rococo/src/lib.rs +++ b/runtime/rococo/src/lib.rs @@ -849,7 +849,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - runtime_api_impl::get_historical_and_current_authority_ids::() + runtime_api_impl::relevant_authority_ids::() } }