Skip to content

Commit 45492e3

Browse files
sw10pabkchr
andauthored
runtime-api: remove redundant version checks (#7610)
## Issue - [[#1940] Cleanup boilerplate code when DisabledValidators runtime api call is released](#1940) - Includes other runtime APIs, such as `MinimumBackingVotes` and `NodeFeatures`, that are already supported by Polkadot. ## Description This PR removes unnecessary runtime API version checks from `subsystem-util/src/runtime` for APIs supported by Polkadot (the most recent network to upgrade). Specifically, it applies to the `DisabledValidators`, `MinimumBackingVotes` and `NodeFeatures` APIs. --------- Co-authored-by: Bastian Köcher <git@kchr.de>
1 parent 1abdb7f commit 45492e3

23 files changed

Lines changed: 171 additions & 229 deletions

File tree

polkadot/node/collation-generation/src/lib.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ use polkadot_node_subsystem::{
4444
SubsystemContext, SubsystemError, SubsystemResult, SubsystemSender,
4545
};
4646
use polkadot_node_subsystem_util::{
47-
request_claim_queue, request_persisted_validation_data, request_session_index_for_child,
48-
request_validation_code_hash, request_validators,
49-
runtime::{request_node_features, ClaimQueueSnapshot},
47+
request_claim_queue, request_node_features, request_persisted_validation_data,
48+
request_session_index_for_child, request_validation_code_hash, request_validators,
49+
runtime::ClaimQueueSnapshot,
5050
};
5151
use polkadot_primitives::{
5252
collator_signature_payload,
@@ -56,8 +56,7 @@ use polkadot_primitives::{
5656
ClaimQueueOffset, CommittedCandidateReceiptV2, TransposedClaimQueue,
5757
},
5858
CandidateCommitments, CandidateDescriptor, CollatorPair, CoreIndex, Hash, Id as ParaId,
59-
NodeFeatures, OccupiedCoreAssumption, PersistedValidationData, SessionIndex,
60-
ValidationCodeHash,
59+
OccupiedCoreAssumption, PersistedValidationData, SessionIndex, ValidationCodeHash,
6160
};
6261
use schnellru::{ByLength, LruMap};
6362
use sp_core::crypto::Pair;
@@ -510,9 +509,8 @@ impl SessionInfoCache {
510509
let n_validators =
511510
request_validators(relay_parent, &mut sender.clone()).await.await??.len();
512511

513-
let node_features = request_node_features(relay_parent, session_index, sender)
514-
.await?
515-
.unwrap_or(NodeFeatures::EMPTY);
512+
let node_features =
513+
request_node_features(relay_parent, session_index, sender).await.await??;
516514

517515
let info = PerSessionInfo {
518516
v2_receipts: node_features

polkadot/node/collation-generation/src/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use polkadot_node_subsystem_util::TimeoutExt;
2929
use polkadot_primitives::{
3030
node_features,
3131
vstaging::{CandidateDescriptorVersion, CoreSelector, UMPSignal, UMP_SEPARATOR},
32-
CollatorPair, PersistedValidationData,
32+
CollatorPair, NodeFeatures, PersistedValidationData,
3333
};
3434
use polkadot_primitives_test_helpers::dummy_head_data;
3535
use rstest::rstest;

polkadot/node/core/av-store/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1329,7 +1329,7 @@ fn store_available_data(
13291329
})
13301330
.collect();
13311331

1332-
let chunk_indices = availability_chunk_indices(Some(&node_features), n_validators, core_index)?;
1332+
let chunk_indices = availability_chunk_indices(&node_features, n_validators, core_index)?;
13331333
for (validator_index, chunk_index) in chunk_indices.into_iter().enumerate() {
13341334
write_chunk(
13351335
&mut tx,

polkadot/node/core/av-store/src/tests.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -510,12 +510,8 @@ fn store_pov_and_queries_work() {
510510

511511
let query_all_chunks_res = query_all_chunks(
512512
&mut virtual_overseer,
513-
availability_chunk_indices(
514-
Some(&node_features),
515-
n_validators as usize,
516-
core_index,
517-
)
518-
.unwrap(),
513+
availability_chunk_indices(&node_features, n_validators as usize, core_index)
514+
.unwrap(),
519515
candidate_hash,
520516
)
521517
.await;
@@ -596,12 +592,8 @@ fn store_pov_and_queries_work() {
596592

597593
let query_all_chunks_res = query_all_chunks(
598594
&mut virtual_overseer,
599-
availability_chunk_indices(
600-
Some(&node_features),
601-
n_validators as usize,
602-
core_index,
603-
)
604-
.unwrap(),
595+
availability_chunk_indices(&node_features, n_validators as usize, core_index)
596+
.unwrap(),
605597
candidate_hash,
606598
)
607599
.await;
@@ -618,7 +610,7 @@ fn store_pov_and_queries_work() {
618610
.await
619611
.unwrap();
620612
let expected_chunk_index = availability_chunk_index(
621-
Some(&node_features),
613+
&node_features,
622614
n_validators as usize,
623615
core_index,
624616
ValidatorIndex(validator_index),
@@ -723,7 +715,8 @@ fn query_all_chunks_works() {
723715
}
724716

725717
let chunk_indices =
726-
availability_chunk_indices(None, n_validators as usize, CoreIndex(0)).unwrap();
718+
availability_chunk_indices(&NodeFeatures::EMPTY, n_validators as usize, CoreIndex(0))
719+
.unwrap();
727720

728721
assert_eq!(
729722
query_all_chunks(&mut virtual_overseer, chunk_indices.clone(), candidate_hash_1)

polkadot/node/core/backing/src/lib.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,10 @@ use polkadot_node_subsystem::{
9999
use polkadot_node_subsystem_util::{
100100
self as util,
101101
backing_implicit_view::View as ImplicitView,
102-
request_claim_queue, request_disabled_validators, request_session_executor_params,
103-
request_session_index_for_child, request_validator_groups, request_validators,
104-
runtime::{self, request_min_backing_votes, ClaimQueueSnapshot},
102+
request_claim_queue, request_disabled_validators, request_min_backing_votes,
103+
request_node_features, request_session_executor_params, request_session_index_for_child,
104+
request_validator_groups, request_validators,
105+
runtime::{self, ClaimQueueSnapshot},
105106
Validator,
106107
};
107108
use polkadot_parachain_primitives::primitives::IsSystem;
@@ -125,7 +126,6 @@ use polkadot_statement_table::{
125126
Context as TableContextTrait, Table,
126127
};
127128
use sp_keystore::KeystorePtr;
128-
use util::runtime::request_node_features;
129129

130130
mod error;
131131

@@ -260,7 +260,7 @@ struct PerSessionCache {
260260
/// Cache for storing validators list, retrieved from the runtime.
261261
validators_cache: LruMap<SessionIndex, Arc<Vec<ValidatorId>>>,
262262
/// Cache for storing node features, retrieved from the runtime.
263-
node_features_cache: LruMap<SessionIndex, Option<NodeFeatures>>,
263+
node_features_cache: LruMap<SessionIndex, NodeFeatures>,
264264
/// Cache for storing executor parameters, retrieved from the runtime.
265265
executor_params_cache: LruMap<SessionIndex, Arc<ExecutorParams>>,
266266
/// Cache for storing the minimum backing votes threshold, retrieved from the runtime.
@@ -322,15 +322,20 @@ impl PerSessionCache {
322322
session_index: SessionIndex,
323323
parent: Hash,
324324
sender: &mut impl overseer::SubsystemSender<RuntimeApiMessage>,
325-
) -> Result<Option<NodeFeatures>, Error> {
325+
) -> Result<NodeFeatures, RuntimeApiError> {
326326
// Try to get the node features from the cache.
327327
if let Some(node_features) = self.node_features_cache.get(&session_index) {
328328
return Ok(node_features.clone());
329329
}
330330

331331
// Fetch the node features from the runtime since it was not in the cache.
332-
let node_features: Option<NodeFeatures> =
333-
request_node_features(parent, session_index, sender).await?;
332+
let node_features = request_node_features(parent, session_index, sender)
333+
.await
334+
.await
335+
.map_err(|err| RuntimeApiError::Execution {
336+
runtime_api_name: "NodeFeatures",
337+
source: Arc::new(err),
338+
})??;
334339

335340
// Cache the fetched node features for future use.
336341
self.node_features_cache.insert(session_index, node_features.clone());
@@ -388,11 +393,12 @@ impl PerSessionCache {
388393

389394
// Fetch the value from the runtime since it was not in the cache.
390395
let minimum_backing_votes = request_min_backing_votes(parent, session_index, sender)
396+
.await
391397
.await
392398
.map_err(|err| RuntimeApiError::Execution {
393399
runtime_api_name: "MinimumBackingVotes",
394400
source: Arc::new(err),
395-
})?;
401+
})??;
396402

397403
// Cache the fetched value for future use.
398404
self.minimum_backing_votes_cache.insert(session_index, minimum_backing_votes);
@@ -1152,10 +1158,8 @@ async fn construct_per_relay_parent_state<Context>(
11521158
let validators = per_session_cache.validators(session_index, parent, ctx.sender()).await;
11531159
let validators = try_runtime_api!(validators);
11541160

1155-
let node_features = per_session_cache
1156-
.node_features(session_index, parent, ctx.sender())
1157-
.await?
1158-
.unwrap_or(NodeFeatures::EMPTY);
1161+
let node_features = per_session_cache.node_features(session_index, parent, ctx.sender()).await;
1162+
let node_features = try_runtime_api!(node_features);
11591163

11601164
let inject_core_index = node_features
11611165
.get(FeatureIndex::ElasticScalingMVP as usize)

polkadot/node/core/dispute-coordinator/src/tests.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -413,13 +413,6 @@ impl TestState {
413413
)) => {
414414
tx.send(Ok(Vec::new())).unwrap();
415415
},
416-
AllMessages::RuntimeApi(RuntimeApiMessage::Request(
417-
_new_leaf,
418-
RuntimeApiRequest::Version(tx),
419-
)) => {
420-
tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT))
421-
.unwrap();
422-
},
423416
AllMessages::RuntimeApi(RuntimeApiMessage::Request(
424417
_new_leaf,
425418
RuntimeApiRequest::DisabledValidators(tx),
@@ -4387,15 +4380,6 @@ async fn handle_disabled_validators_queries(
43874380
virtual_overseer: &mut VirtualOverseer,
43884381
disabled_validators: Vec<ValidatorIndex>,
43894382
) {
4390-
assert_matches!(
4391-
virtual_overseer.recv().await,
4392-
AllMessages::RuntimeApi(RuntimeApiMessage::Request(
4393-
_new_leaf,
4394-
RuntimeApiRequest::Version(tx),
4395-
)) => {
4396-
tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)).unwrap();
4397-
}
4398-
);
43994383
assert_matches!(
44004384
virtual_overseer.recv().await,
44014385
AllMessages::RuntimeApi(RuntimeApiMessage::Request(

polkadot/node/core/provisioner/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ pub enum Error {
4747
#[error("failed to get session index")]
4848
CanceledSessionIndex(#[source] oneshot::Canceled),
4949

50+
#[error("failed to get node features")]
51+
CanceledNodeFeatures(#[source] oneshot::Canceled),
52+
5053
#[error("failed to get backed candidates")]
5154
CanceledBackedCandidates(#[source] oneshot::Canceled),
5255

polkadot/node/core/provisioner/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,13 @@ use polkadot_node_subsystem::{
3535
SubsystemError,
3636
};
3737
use polkadot_node_subsystem_util::{
38-
request_availability_cores, request_session_index_for_child, runtime::request_node_features,
39-
TimeoutExt,
38+
request_availability_cores, request_node_features, request_session_index_for_child, TimeoutExt,
4039
};
4140
use polkadot_primitives::{
4241
node_features::FeatureIndex,
4342
vstaging::{BackedCandidate, CoreState},
44-
CandidateHash, CoreIndex, Hash, Id as ParaId, NodeFeatures, SessionIndex,
45-
SignedAvailabilityBitfield, ValidatorIndex,
43+
CandidateHash, CoreIndex, Hash, Id as ParaId, SessionIndex, SignedAvailabilityBitfield,
44+
ValidatorIndex,
4645
};
4746
use std::collections::{BTreeMap, HashMap};
4847

@@ -203,8 +202,9 @@ async fn handle_active_leaves_update(
203202
.map_err(Error::CanceledSessionIndex)??;
204203
if per_session.get(&session_index).is_none() {
205204
let elastic_scaling_mvp = request_node_features(leaf.hash, session_index, sender)
206-
.await?
207-
.unwrap_or(NodeFeatures::EMPTY)
205+
.await
206+
.await
207+
.map_err(Error::CanceledNodeFeatures)??
208208
.get(FeatureIndex::ElasticScalingMVP as usize)
209209
.map(|b| *b)
210210
.unwrap_or(false);

polkadot/node/network/availability-distribution/src/error.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use polkadot_primitives::SessionIndex;
2323

2424
use futures::channel::oneshot;
2525

26-
use polkadot_node_subsystem::{ChainApiError, SubsystemError};
26+
use polkadot_node_subsystem::{ChainApiError, RuntimeApiError, SubsystemError};
2727
use polkadot_node_subsystem_util::runtime;
2828

2929
use crate::LOG_TARGET;
@@ -55,6 +55,9 @@ pub enum Error {
5555
#[error("Retrieving response from Chain API unexpectedly failed with error: {0}")]
5656
ChainApi(#[from] ChainApiError),
5757

58+
#[error("Failed to get node features from the runtime")]
59+
FailedNodeFeatures(#[source] RuntimeApiError),
60+
5861
// av-store will drop the sender on any error that happens.
5962
#[error("Response channel to obtain chunk failed")]
6063
QueryChunkResponseChannel(#[source] oneshot::Canceled),
@@ -108,6 +111,7 @@ pub fn log_error(
108111
JfyiError::NoSuchCachedSession { .. } |
109112
JfyiError::QueryAvailableDataResponseChannel(_) |
110113
JfyiError::QueryChunkResponseChannel(_) |
114+
JfyiError::FailedNodeFeatures(_) |
111115
JfyiError::ErasureCoding(_) => gum::warn!(target: LOG_TARGET, error = %jfyi, ctx),
112116
JfyiError::FetchPoV(_) |
113117
JfyiError::SendResponse |

polkadot/node/network/availability-distribution/src/requester/session_cache.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rand::{seq::SliceRandom, thread_rng};
2020
use schnellru::{ByLength, LruMap};
2121

2222
use polkadot_node_subsystem::overseer;
23-
use polkadot_node_subsystem_util::runtime::{request_node_features, RuntimeInfo};
23+
use polkadot_node_subsystem_util::{request_node_features, runtime::RuntimeInfo};
2424
use polkadot_primitives::{
2525
AuthorityDiscoveryId, GroupIndex, Hash, NodeFeatures, SessionIndex, ValidatorIndex,
2626
};
@@ -66,7 +66,7 @@ pub struct SessionInfo {
6666
pub our_group: Option<GroupIndex>,
6767

6868
/// Node features.
69-
pub node_features: Option<NodeFeatures>,
69+
pub node_features: NodeFeatures,
7070
}
7171

7272
/// Report of bad validators.
@@ -175,8 +175,10 @@ impl SessionCache {
175175
.get_session_info_by_index(ctx.sender(), relay_parent, session_index)
176176
.await?;
177177

178-
let node_features =
179-
request_node_features(relay_parent, session_index, ctx.sender()).await?;
178+
let node_features = request_node_features(relay_parent, session_index, ctx.sender())
179+
.await
180+
.await?
181+
.map_err(Error::FailedNodeFeatures)?;
180182

181183
let discovery_keys = info.session_info.discovery_keys.clone();
182184
let mut validator_groups = info.session_info.validator_groups.clone();

0 commit comments

Comments
 (0)