Skip to content

Commit

Permalink
refactor: move shard_layout_from_prev_block to EMA (#7673)
Browse files Browse the repository at this point in the history
Part of #6910
  • Loading branch information
matklad authored and nikurt committed Sep 29, 2022
1 parent 8ba173e commit 87706b5
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 64 deletions.
30 changes: 15 additions & 15 deletions chain/chain/src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,21 @@ impl EpochManagerAdapter for KeyValueRuntime {
Ok(self.get_epoch_and_valset(*parent_hash)?.2)
}

fn get_prev_shard_ids(
&self,
_prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error> {
Ok(shard_ids)
}

fn get_shard_layout_from_prev_block(
&self,
_parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error> {
Ok(ShardLayout::v0(self.num_shards, 0))
}

fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result<EpochId, Error> {
let (epoch_id, _, _) = self.get_epoch_and_valset(*block_hash)?;
Ok(epoch_id)
Expand Down Expand Up @@ -709,21 +724,6 @@ impl RuntimeAdapter for KeyValueRuntime {
Ok(self.store.store_update())
}

fn get_prev_shard_ids(
&self,
_prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error> {
Ok(shard_ids)
}

fn get_shard_layout_from_prev_block(
&self,
_parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error> {
Ok(ShardLayout::v0(self.num_shards, 0))
}

fn shard_id_to_uid(&self, shard_id: ShardId, _epoch_id: &EpochId) -> Result<ShardUId, Error> {
Ok(ShardUId { version: 0, shard_id: shard_id as u32 })
}
Expand Down
12 changes: 0 additions & 12 deletions chain/chain/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,18 +349,6 @@ pub trait RuntimeAdapter: EpochManagerAdapter + Send + Sync {
/// Returns `account_id` that suppose to have the `part_id`.
fn get_part_owner(&self, epoch_id: &EpochId, part_id: u64) -> Result<AccountId, Error>;

fn get_prev_shard_ids(
&self,
prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error>;

/// Get shard layout given hash of previous block.
fn get_shard_layout_from_prev_block(
&self,
parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error>;

fn shard_id_to_uid(&self, shard_id: ShardId, epoch_id: &EpochId) -> Result<ShardUId, Error>;

/// Returns true if the shard layout will change in the next epoch
Expand Down
54 changes: 53 additions & 1 deletion chain/epoch-manager/src/adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use near_primitives::{
epoch_manager::ShardConfig,
errors::EpochError,
hash::CryptoHash,
shard_layout::ShardLayout,
shard_layout::{ShardLayout, ShardLayoutError},
sharding::{ChunkHash, ShardChunkHeader},
types::{
validator_stake::ValidatorStake, AccountId, ApprovalStake, Balance, BlockHeight,
Expand Down Expand Up @@ -50,6 +50,23 @@ pub trait EpochManagerAdapter: Send + Sync {
fn get_next_epoch_id_from_prev_block(&self, parent_hash: &CryptoHash)
-> Result<EpochId, Error>;

/// For each `ShardId` in the current block, returns its parent `ShardId`
/// from previous block.
///
/// Most of the times parent of the shard is the shard itself, unless a
/// resharding happened and some shards were split.
fn get_prev_shard_ids(
&self,
prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error>;

/// Get shard layout given hash of previous block.
fn get_shard_layout_from_prev_block(
&self,
parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error>;

/// Get [`EpochId`] from a block belonging to the epoch.
fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result<EpochId, Error>;

Expand Down Expand Up @@ -261,6 +278,41 @@ impl<T: HasEpochMangerHandle + Send + Sync> EpochManagerAdapter for T {
epoch_manager.get_next_epoch_id_from_prev_block(parent_hash).map_err(Error::from)
}

fn get_prev_shard_ids(
&self,
prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error> {
if self.is_next_block_epoch_start(prev_hash)? {
let shard_layout = self.get_shard_layout_from_prev_block(prev_hash)?;
let prev_shard_layout = self.get_shard_layout(&self.get_epoch_id(prev_hash)?)?;
if prev_shard_layout != shard_layout {
return Ok(shard_ids
.into_iter()
.map(|shard_id| {
shard_layout.get_parent_shard_id(shard_id).map(|parent_shard_id|{
assert!(parent_shard_id < prev_shard_layout.num_shards(),
"invalid shard layout {:?}: parent shard {} does not exist in last shard layout",
shard_layout,
parent_shard_id
);
parent_shard_id
})
})
.collect::<Result<_, ShardLayoutError>>()?);
}
}
Ok(shard_ids)
}

fn get_shard_layout_from_prev_block(
&self,
parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error> {
let epoch_id = self.get_epoch_id_from_prev_block(parent_hash)?;
self.get_shard_layout(&epoch_id)
}

fn get_epoch_id(&self, block_hash: &CryptoHash) -> Result<EpochId, Error> {
let epoch_manager = self.read();
epoch_manager.get_epoch_id(block_hash).map_err(Error::from)
Expand Down
36 changes: 0 additions & 36 deletions nearcore/src/runtime/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ use near_store::{
use near_vm_runner::precompile_contract;
use node_runtime::adapter::ViewRuntimeAdapter;
use node_runtime::config::RuntimeConfig;
use node_runtime::near_primitives::shard_layout::ShardLayoutError;
use node_runtime::state_viewer::TrieViewer;
use node_runtime::{
validate_transaction, verify_and_charge_transaction, ApplyState, Runtime,
Expand Down Expand Up @@ -856,41 +855,6 @@ impl RuntimeAdapter for NightshadeRuntime {
Ok(transactions)
}

fn get_prev_shard_ids(
&self,
prev_hash: &CryptoHash,
shard_ids: Vec<ShardId>,
) -> Result<Vec<ShardId>, Error> {
if self.is_next_block_epoch_start(prev_hash)? {
let shard_layout = self.get_shard_layout_from_prev_block(prev_hash)?;
let prev_shard_layout = self.get_shard_layout(&self.get_epoch_id(prev_hash)?)?;
if prev_shard_layout != shard_layout {
return Ok(shard_ids
.into_iter()
.map(|shard_id| {
shard_layout.get_parent_shard_id(shard_id).map(|parent_shard_id|{
assert!(parent_shard_id < prev_shard_layout.num_shards(),
"invalid shard layout {:?}: parent shard {} does not exist in last shard layout",
shard_layout,
parent_shard_id
);
parent_shard_id
})
})
.collect::<Result<_, ShardLayoutError>>()?);
}
}
Ok(shard_ids)
}

fn get_shard_layout_from_prev_block(
&self,
parent_hash: &CryptoHash,
) -> Result<ShardLayout, Error> {
let epoch_id = self.get_epoch_id_from_prev_block(parent_hash)?;
self.get_shard_layout(&epoch_id)
}

fn shard_id_to_uid(&self, shard_id: ShardId, epoch_id: &EpochId) -> Result<ShardUId, Error> {
let epoch_manager = self.epoch_manager.read();
let shard_layout = epoch_manager.get_shard_layout(epoch_id).map_err(Error::from)?;
Expand Down
1 change: 1 addition & 0 deletions tools/state-viewer/src/apply_chunk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@ mod test {
use near_chain_configs::Genesis;
use near_client::test_utils::TestEnv;
use near_crypto::{InMemorySigner, KeyType};
use near_epoch_manager::EpochManagerAdapter;
use near_network::types::NetworkClientResponses;
use near_primitives::hash::CryptoHash;
use near_primitives::runtime::config_store::RuntimeConfigStore;
Expand Down

0 comments on commit 87706b5

Please sign in to comment.