mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-15 19:41:05 +00:00
refactor out validation hosts to pool struct (#972)
* refactor out validation hosts to pool struct * make web-wasm compatible * typo * remove now-unused static hosts
This commit is contained in:
committed by
GitHub
parent
a2a4f4c755
commit
15a83079ba
@@ -59,6 +59,7 @@ pub trait Collators: Clone {
|
||||
|
||||
/// A future which resolves when a collation is available.
|
||||
pub async fn collation_fetch<C: Collators, P>(
|
||||
validation_pool: Option<crate::pipeline::ValidationPool>,
|
||||
parachain: ParaId,
|
||||
relay_parent: Hash,
|
||||
collators: C,
|
||||
@@ -76,6 +77,7 @@ pub async fn collation_fetch<C: Collators, P>(
|
||||
let collation = collators.collate(parachain, relay_parent).await?;
|
||||
let Collation { info, pov } = collation;
|
||||
let res = crate::pipeline::full_output_validation_with_api(
|
||||
validation_pool.as_ref(),
|
||||
&*client,
|
||||
&info,
|
||||
&pov,
|
||||
|
||||
@@ -36,6 +36,8 @@ use sp_api::ProvideRuntimeApi;
|
||||
use parking_lot::Mutex;
|
||||
use crate::Error;
|
||||
|
||||
pub use parachain::wasm_executor::ValidationPool;
|
||||
|
||||
/// Does basic checks of a collation. Provide the encoded PoV-block.
|
||||
pub fn basic_checks(
|
||||
collation: &CollationInfo,
|
||||
@@ -227,6 +229,7 @@ impl<'a> ValidatedCandidate<'a> {
|
||||
|
||||
/// Does full checks of a collation, with provided PoV-block and contextual data.
|
||||
pub fn validate<'a>(
|
||||
validation_pool: Option<&'_ ValidationPool>,
|
||||
collation: &'a CollationInfo,
|
||||
pov_block: &'a PoVBlock,
|
||||
local_validation: &'a LocalValidationData,
|
||||
@@ -251,12 +254,16 @@ pub fn validate<'a>(
|
||||
per_byte: 0,
|
||||
};
|
||||
|
||||
let execution_mode = validation_pool
|
||||
.map(ExecutionMode::Remote)
|
||||
.unwrap_or(ExecutionMode::Local);
|
||||
|
||||
let ext = Externalities::new(local_validation.balance, fee_schedule);
|
||||
match wasm_executor::validate_candidate(
|
||||
&validation_code,
|
||||
params,
|
||||
ext.clone(),
|
||||
ExecutionMode::Remote,
|
||||
execution_mode,
|
||||
) {
|
||||
Ok(result) => {
|
||||
if result.head_data == collation.head_data.0 {
|
||||
@@ -306,6 +313,7 @@ where
|
||||
|
||||
/// Does full-pipeline validation of a collation with provided contextual parameters.
|
||||
pub fn full_output_validation_with_api<P>(
|
||||
validation_pool: Option<&ValidationPool>,
|
||||
api: &P,
|
||||
collation: &CollationInfo,
|
||||
pov_block: &PoVBlock,
|
||||
@@ -330,6 +338,7 @@ pub fn full_output_validation_with_api<P>(
|
||||
&encoded_pov,
|
||||
)
|
||||
.and_then(|()| validate(
|
||||
validation_pool,
|
||||
&collation,
|
||||
&pov_block,
|
||||
&local_validation,
|
||||
|
||||
@@ -39,7 +39,7 @@ use self::includable::IncludabilitySender;
|
||||
use primitives::Pair;
|
||||
use sp_api::ProvideRuntimeApi;
|
||||
|
||||
use crate::pipeline::FullOutput;
|
||||
use crate::pipeline::{FullOutput, ValidationPool};
|
||||
use crate::Error;
|
||||
|
||||
mod includable;
|
||||
@@ -132,6 +132,7 @@ struct SharedTableInner {
|
||||
trackers: Vec<IncludabilitySender>,
|
||||
availability_store: AvailabilityStore,
|
||||
validated: HashMap<Hash, ValidationWork>,
|
||||
validation_pool: Option<ValidationPool>,
|
||||
}
|
||||
|
||||
impl SharedTableInner {
|
||||
@@ -193,6 +194,7 @@ impl SharedTableInner {
|
||||
};
|
||||
|
||||
work.map(|work| ParachainWork {
|
||||
validation_pool: self.validation_pool.clone(),
|
||||
availability_store: self.availability_store.clone(),
|
||||
relay_parent: context.signing_context.parent_hash.clone(),
|
||||
work,
|
||||
@@ -259,6 +261,7 @@ impl Validated {
|
||||
|
||||
/// Future that performs parachain validation work.
|
||||
pub struct ParachainWork<Fetch> {
|
||||
validation_pool: Option<ValidationPool>,
|
||||
work: Work<Fetch>,
|
||||
relay_parent: Hash,
|
||||
availability_store: AvailabilityStore,
|
||||
@@ -283,9 +286,11 @@ impl<Fetch: Future + Unpin> ParachainWork<Fetch> {
|
||||
let n_validators = self.n_validators;
|
||||
let expected_relay_parent = self.relay_parent;
|
||||
|
||||
let pool = self.validation_pool.clone();
|
||||
let validate = move |pov_block: &PoVBlock, candidate: &AbridgedCandidateReceipt| {
|
||||
let collation_info = candidate.to_collation_info();
|
||||
let full_output = crate::pipeline::full_output_validation_with_api(
|
||||
pool.as_ref(),
|
||||
&*api,
|
||||
&collation_info,
|
||||
pov_block,
|
||||
@@ -416,6 +421,7 @@ impl SharedTable {
|
||||
signing_context: SigningContext,
|
||||
availability_store: AvailabilityStore,
|
||||
max_block_data_size: Option<u64>,
|
||||
validation_pool: Option<ValidationPool>,
|
||||
) -> Self {
|
||||
SharedTable {
|
||||
context: Arc::new(TableContext { groups, key, signing_context, validators: validators.clone(), }),
|
||||
@@ -425,6 +431,7 @@ impl SharedTable {
|
||||
validated: HashMap::new(),
|
||||
trackers: Vec::new(),
|
||||
availability_store,
|
||||
validation_pool,
|
||||
}))
|
||||
}
|
||||
}
|
||||
@@ -685,6 +692,7 @@ mod tests {
|
||||
signing_context.clone(),
|
||||
AvailabilityStore::new_in_memory(DummyErasureNetworking),
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
let mut candidate = AbridgedCandidateReceipt::default();
|
||||
@@ -741,6 +749,7 @@ mod tests {
|
||||
signing_context.clone(),
|
||||
AvailabilityStore::new_in_memory(DummyErasureNetworking),
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
let mut candidate = AbridgedCandidateReceipt::default();
|
||||
@@ -798,6 +807,7 @@ mod tests {
|
||||
availability_store: store.clone(),
|
||||
max_block_data_size: None,
|
||||
n_validators,
|
||||
validation_pool: None,
|
||||
};
|
||||
|
||||
for i in 0..n_validators {
|
||||
@@ -867,6 +877,7 @@ mod tests {
|
||||
availability_store: store.clone(),
|
||||
max_block_data_size: None,
|
||||
n_validators,
|
||||
validation_pool: None,
|
||||
};
|
||||
|
||||
let validated = block_on(producer.prime_with(|_, _| Ok(
|
||||
@@ -921,6 +932,7 @@ mod tests {
|
||||
signing_context.clone(),
|
||||
AvailabilityStore::new_in_memory(DummyErasureNetworking),
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
let mut candidate = AbridgedCandidateReceipt::default();
|
||||
@@ -988,6 +1000,7 @@ mod tests {
|
||||
signing_context.clone(),
|
||||
AvailabilityStore::new_in_memory(DummyErasureNetworking),
|
||||
None,
|
||||
None,
|
||||
);
|
||||
|
||||
let mut candidate = AbridgedCandidateReceipt::default();
|
||||
|
||||
@@ -47,6 +47,7 @@ use log::{warn, error, info, debug, trace};
|
||||
|
||||
use super::{Network, Collators, SharedTable, TableRouter};
|
||||
use crate::Error;
|
||||
use crate::pipeline::ValidationPool;
|
||||
|
||||
/// A handle to spawn background tasks onto.
|
||||
pub type TaskExecutor = Arc<dyn Spawn + Send + Sync>;
|
||||
@@ -164,13 +165,15 @@ impl<C, N, P, SC, SP> ServiceBuilder<C, N, P, SC, SP> where
|
||||
NotifyImport(sc_client_api::BlockImportNotification<Block>),
|
||||
}
|
||||
|
||||
let validation_pool = Some(ValidationPool::new());
|
||||
let mut parachain_validation = ParachainValidationInstances {
|
||||
client: self.client.clone(),
|
||||
network: self.network,
|
||||
spawner: self.spawner,
|
||||
availability_store: self.availability_store,
|
||||
live_instances: HashMap::new(),
|
||||
collation_fetch: DefaultCollationFetch(self.collators),
|
||||
validation_pool: validation_pool.clone(),
|
||||
collation_fetch: DefaultCollationFetch(self.collators, validation_pool),
|
||||
};
|
||||
|
||||
let client = self.client;
|
||||
@@ -252,7 +255,7 @@ pub(crate) trait CollationFetch {
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct DefaultCollationFetch<C>(C);
|
||||
struct DefaultCollationFetch<C>(C, Option<ValidationPool>);
|
||||
impl<C> CollationFetch for DefaultCollationFetch<C>
|
||||
where
|
||||
C: Collators + Send + Sync + Unpin + 'static,
|
||||
@@ -272,10 +275,12 @@ impl<C> CollationFetch for DefaultCollationFetch<C>
|
||||
P::Api: ParachainHost<Block, Error = sp_blockchain::Error>,
|
||||
P: ProvideRuntimeApi<Block> + Send + Sync + 'static,
|
||||
{
|
||||
let DefaultCollationFetch(collators, validation_pool) = self;
|
||||
crate::collation::collation_fetch(
|
||||
validation_pool,
|
||||
parachain,
|
||||
relay_parent,
|
||||
self.0,
|
||||
collators,
|
||||
client,
|
||||
max_block_data_size,
|
||||
n_validators,
|
||||
@@ -307,6 +312,9 @@ pub(crate) struct ParachainValidationInstances<N, P, SP, CF> {
|
||||
/// Live agreements. Maps relay chain parent hashes to attestation
|
||||
/// instances.
|
||||
live_instances: HashMap<Hash, ValidationInstanceHandle>,
|
||||
/// The underlying validation pool of processes to use.
|
||||
/// Only `None` in tests.
|
||||
validation_pool: Option<ValidationPool>,
|
||||
/// Used to fetch a collation.
|
||||
collation_fetch: CF,
|
||||
}
|
||||
@@ -406,6 +414,7 @@ impl<N, P, SP, CF> ParachainValidationInstances<N, P, SP, CF> where
|
||||
signing_context,
|
||||
self.availability_store.clone(),
|
||||
max_block_data_size,
|
||||
self.validation_pool.clone(),
|
||||
));
|
||||
|
||||
let build_router = self.network.build_table_router(
|
||||
@@ -709,6 +718,7 @@ mod tests {
|
||||
spawner: executor.clone(),
|
||||
availability_store: AvailabilityStore::new_in_memory(MockErasureNetworking),
|
||||
live_instances: HashMap::new(),
|
||||
validation_pool: None,
|
||||
};
|
||||
|
||||
parachain_validation.get_or_instantiate(Default::default(), &keystore, None)
|
||||
@@ -747,6 +757,7 @@ mod tests {
|
||||
spawner: executor.clone(),
|
||||
availability_store: AvailabilityStore::new_in_memory(MockErasureNetworking),
|
||||
live_instances: HashMap::new(),
|
||||
validation_pool: None,
|
||||
};
|
||||
|
||||
parachain_validation.get_or_instantiate(Default::default(), &keystore, None)
|
||||
|
||||
Reference in New Issue
Block a user