Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

lookahead collator: read allowed ancestry len from relay clien #3059

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 43 additions & 12 deletions client/consensus/aura/src/collators/lookahead.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,16 @@
//! The main limitation is block propagation time - i.e. the new blocks created by an author
//! must be propagated to the next author before their turn.

use codec::{Codec, Encode};
use codec::{Codec, Decode, Encode};
use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface;
use cumulus_client_consensus_common::{
self as consensus_common, ParachainBlockImportMarker, ParentSearchParams,
};
use cumulus_client_consensus_proposer::ProposerInterface;
use cumulus_primitives_aura::AuraUnincludedSegmentApi;
use cumulus_primitives_core::{
relay_chain::Hash as PHash, CollectCollationInfo, PersistedValidationData,
relay_chain::{self, Hash as PHash},
AbridgedHostConfiguration, CollectCollationInfo, PersistedValidationData,
};
use cumulus_relay_chain_interface::RelayChainInterface;

Expand Down Expand Up @@ -416,16 +417,46 @@ where
Some(SlotClaim::unchecked::<P>(author_pub, slot, timestamp))
}

/// Reads allowed ancestry length parameter from the relay chain storage at the given relay parent.
///
/// Falls back to 0 in case of an error.
async fn max_ancestry_lookback(
_relay_parent: PHash,
_relay_client: &impl RelayChainInterface,
relay_parent: PHash,
relay_client: &impl RelayChainInterface,
) -> usize {
// TODO [https://github.com/paritytech/cumulus/issues/2706]
// We need to read the relay-chain state to know what the maximum
// age truly is, but that depends on those pallets existing.
//
// For now, just provide the conservative value of '2'.
// Overestimating can cause problems, as we'd be building on forks of the
// chain that can never get included. Underestimating is less of an issue.
2
let bytes = match relay_client
.get_storage_by_key(relay_parent, relay_chain::well_known_keys::ACTIVE_CONFIG)
.await
{
Ok(bytes) => bytes,
Err(err) => {
tracing::error!(
target: crate::LOG_TARGET,
?err,
"Failed to read active config from relay chain client",
);
return 0
},
};

let read_result = match bytes {
Some(bytes) => AbridgedHostConfiguration::decode(&mut &bytes[..]).map_err(|err| {
tracing::error!(
target: crate::LOG_TARGET,
?err,
"Failed to decode active config value from relay chain storage",
)
}),
None => {
tracing::error!(
target: crate::LOG_TARGET,
"Active config is missing in relay chain storage",
);
Err(())
},
};

read_result
.map(|config| config.async_backing_params.allowed_ancestry_len as usize)
.unwrap_or(0)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Default value was 2, but any error in this path indicates huge problem related to the node or relay chain.

So 0 is somewhat conservative, although makes little to no difference.

}