Skip to content

Commit

Permalink
fix: fix apply/validate blocks benchmarks (#4773)
Browse files Browse the repository at this point in the history
* fix: fix apply_block and validate_block benchmarks
* fix: fix no_extra_or_missing_schemas
* fix: derive Ord for AccountIdDomainCompare
* fix: remove account permissions and roles with account
* fix: decrease size of block validate_blocks and apply_blocks benchmars
* bump: update storage crate

Signed-off-by: Shanin Roman <shanin1000@yandex.ru>
  • Loading branch information
Erigara authored Jun 27, 2024
1 parent 4dcdd2c commit 8db7d8c
Show file tree
Hide file tree
Showing 13 changed files with 244 additions and 104 deletions.
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ parity-scale-codec = { version = "3.6.12", default-features = false }
json5 = "0.4.1"
toml = "0.8.14"

storage = { git = "https://github.com/Erigara/storage.git", rev = "6bd9fdd95220da7626471d190b17b2f5b8815c47" }
storage = { git = "https://github.com/Erigara/storage.git", rev = "cf82588d20494a1c1613ea2f4faa1e66bd827b5c" }

[workspace.lints]
rustdoc.private_doc_tests = "deny"
Expand Down
26 changes: 18 additions & 8 deletions core/benches/blocks/apply_blocks.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use eyre::Result;
use iroha_core::{block::CommittedBlock, prelude::*, state::State};
use iroha_core::{
block::CommittedBlock, prelude::*, state::State, sumeragi::network_topology::Topology,
};
use iroha_data_model::peer::PeerId;
use test_samples::gen_account_in;

#[path = "./common.rs"]
Expand All @@ -20,17 +23,22 @@ impl StateApplyBlocks {
/// - Failed to generate [`KeyPair`]
/// - Failed to create instructions for block
pub fn setup(rt: &tokio::runtime::Handle) -> Self {
let domains = 100;
let accounts_per_domain = 1000;
let assets_per_domain = 1000;
let domains = 10;
let accounts_per_domain = 100;
let assets_per_domain = 100;
let (domain_ids, account_ids, asset_definition_ids) =
generate_ids(domains, accounts_per_domain, assets_per_domain);
let (peer_public_key, peer_private_key) = KeyPair::random().into_parts();
let peer_id = PeerId::new("127.0.0.1:8080".parse().unwrap(), peer_public_key);
let topology = Topology::new(vec![peer_id]);
let (alice_id, alice_keypair) = gen_account_in("wonderland");
let state = build_state(rt, &alice_id);

let nth = 100;
let nth = 10;
let instructions = [
populate_state(domains, accounts_per_domain, assets_per_domain, &alice_id),
delete_every_nth(domains, accounts_per_domain, assets_per_domain, nth),
restore_every_nth(domains, accounts_per_domain, assets_per_domain, nth),
populate_state(&domain_ids, &account_ids, &asset_definition_ids, &alice_id),
delete_every_nth(&domain_ids, &account_ids, &asset_definition_ids, nth),
restore_every_nth(&domain_ids, &account_ids, &asset_definition_ids, nth),
];

let blocks = {
Expand All @@ -45,6 +53,8 @@ impl StateApplyBlocks {
instructions,
alice_id.clone(),
alice_keypair.private_key(),
&topology,
&peer_private_key,
);
let _events = state_block.apply_without_execution(&block);
state_block.commit();
Expand Down
9 changes: 8 additions & 1 deletion core/benches/blocks/apply_blocks_oneshot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
mod apply_blocks;

use apply_blocks::StateApplyBlocks;
use iroha_config::base::{env::std_env, read::ConfigReader};
use iroha_logger::InitConfig;

fn main() {
let rt = tokio::runtime::Builder::new_multi_thread()
Expand All @@ -16,7 +18,12 @@ fn main() {
.expect("Failed building the Runtime");
{
let _guard = rt.enter();
iroha_logger::test_logger();
let config = ConfigReader::new()
.with_env(std_env)
.read_and_complete()
.expect("Failed to load config");
let config = InitConfig::new(config, true);
let _ = iroha_logger::init_global(config).expect("Failed to initialize logger");
}
iroha_logger::info!("Starting...");
let bench = StateApplyBlocks::setup(rt.handle());
Expand Down
154 changes: 95 additions & 59 deletions core/benches/blocks/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,26 @@ pub fn create_block(
state: &mut StateBlock<'_>,
instructions: Vec<InstructionBox>,
account_id: AccountId,
private_key: &PrivateKey,
account_private_key: &PrivateKey,
topology: &Topology,
peer_private_key: &PrivateKey,
) -> CommittedBlock {
let chain_id = ChainId::from("00000000-0000-0000-0000-000000000000");

let transaction = TransactionBuilder::new(chain_id.clone(), account_id)
.with_instructions(instructions)
.sign(private_key);
.sign(account_private_key);
let limits = state.transaction_executor().transaction_limits;

let (peer_public_key, _) = KeyPair::random().into_parts();
let peer_id = PeerId::new("127.0.0.1:8080".parse().unwrap(), peer_public_key);
let topology = Topology::new(vec![peer_id]);
let block = BlockBuilder::new(
vec![AcceptedTransaction::accept(transaction, &chain_id, limits).unwrap()],
topology.clone(),
Vec::new(),
)
.chain(0, state)
.sign(private_key)
.sign(peer_private_key)
.unpack(|_| {})
.commit(&topology)
.commit(topology)
.unpack(|_| {})
.unwrap();

Expand All @@ -58,76 +57,83 @@ pub fn create_block(
}

pub fn populate_state(
domains: usize,
accounts_per_domain: usize,
assets_per_domain: usize,
domains: &[DomainId],
accounts: &[AccountId],
asset_definitions: &[AssetDefinitionId],
owner_id: &AccountId,
) -> Vec<InstructionBox> {
let mut instructions: Vec<InstructionBox> = Vec::new();
for i in 0..domains {
let domain_id = construct_domain_id(i);

for domain_id in domains {
let domain = Domain::new(domain_id.clone());
instructions.push(Register::domain(domain).into());
let can_unregister_domain = Grant::permission(
Permission::new(
"CanUnregisterDomain".parse().unwrap(),
JsonString::from(&json!({ "domain_id": domain_id.clone() })),
JsonString::from(&json!({ "domain": domain_id.clone() })),
),
owner_id.clone(),
);
instructions.push(can_unregister_domain.into());
for _ in 0..accounts_per_domain {
let account_id = generate_account_id(domain_id.clone());
let account = Account::new(account_id.clone());
instructions.push(Register::account(account).into());
let can_unregister_account = Grant::permission(
Permission::new(
"CanUnregisterAccount".parse().unwrap(),
JsonString::from(&json!({ "account_id": account_id.clone() })),
),
owner_id.clone(),
);
instructions.push(can_unregister_account.into());
}
for k in 0..assets_per_domain {
let asset_definition_id = construct_asset_definition_id(k, domain_id.clone());
let asset_definition = AssetDefinition::numeric(asset_definition_id.clone());
instructions.push(Register::asset_definition(asset_definition).into());
let can_unregister_asset_definition = Grant::permission(
Permission::new(
"CanUnregisterAssetDefinition".parse().unwrap(),
JsonString::from(&json!({ "asset_definition_id": asset_definition_id })),
),
owner_id.clone(),
);
instructions.push(can_unregister_asset_definition.into());
}
}

for account_id in accounts {
let account = Account::new(account_id.clone());
instructions.push(Register::account(account).into());
let can_unregister_account = Grant::permission(
Permission::new(
"CanUnregisterAccount".parse().unwrap(),
JsonString::from(&json!({ "account": account_id.clone() })),
),
owner_id.clone(),
);
instructions.push(can_unregister_account.into());
}

for asset_definition_id in asset_definitions {
let asset_definition = AssetDefinition::numeric(asset_definition_id.clone());
instructions.push(Register::asset_definition(asset_definition).into());
let can_unregister_asset_definition = Grant::permission(
Permission::new(
"CanUnregisterAssetDefinition".parse().unwrap(),
JsonString::from(&json!({ "asset_definition": asset_definition_id })),
),
owner_id.clone(),
);
instructions.push(can_unregister_asset_definition.into());
}

instructions
}

pub fn delete_every_nth(
domains: usize,
accounts_per_domain: usize,
assets_per_domain: usize,
domains: &[DomainId],
accounts: &[AccountId],
asset_definitions: &[AssetDefinitionId],
nth: usize,
) -> Vec<InstructionBox> {
let mut instructions: Vec<InstructionBox> = Vec::new();
for i in 0..domains {
let domain_id = construct_domain_id(i);
for (i, domain_id) in domains.iter().enumerate() {
if i % nth == 0 {
instructions.push(Unregister::domain(domain_id.clone()).into());
} else {
for j in 0..accounts_per_domain {
for (j, account_id) in accounts
.iter()
.filter(|account_id| account_id.domain() == domain_id)
.enumerate()
{
if j % nth == 0 {
let account_id = generate_account_id(domain_id.clone());
instructions.push(Unregister::account(account_id.clone()).into());
}
}
for k in 0..assets_per_domain {
for (k, asset_definition_id) in asset_definitions
.iter()
.filter(|asset_definition_id| asset_definition_id.domain() == domain_id)
.enumerate()
{
if k % nth == 0 {
let asset_definition_id = construct_asset_definition_id(k, domain_id.clone());
instructions.push(Unregister::asset_definition(asset_definition_id).into());
instructions
.push(Unregister::asset_definition(asset_definition_id.clone()).into());
}
}
}
Expand All @@ -136,29 +142,34 @@ pub fn delete_every_nth(
}

pub fn restore_every_nth(
domains: usize,
accounts_per_domain: usize,
assets_per_domain: usize,
domains: &[DomainId],
accounts: &[AccountId],
asset_definitions: &[AssetDefinitionId],
nth: usize,
) -> Vec<InstructionBox> {
let mut instructions: Vec<InstructionBox> = Vec::new();
for i in 0..domains {
let domain_id = construct_domain_id(i);
for (i, domain_id) in domains.iter().enumerate() {
if i % nth == 0 {
let domain = Domain::new(domain_id.clone());
instructions.push(Register::domain(domain).into());
}
for j in 0..accounts_per_domain {
for (j, account_id) in accounts
.iter()
.filter(|account_id| account_id.domain() == domain_id)
.enumerate()
{
if j % nth == 0 || i % nth == 0 {
let account_id = generate_account_id(domain_id.clone());
let account = Account::new(account_id.clone());
instructions.push(Register::account(account).into());
}
}
for k in 0..assets_per_domain {
for (k, asset_definition_id) in asset_definitions
.iter()
.filter(|asset_definition_id| asset_definition_id.domain() == domain_id)
.enumerate()
{
if k % nth == 0 || i % nth == 0 {
let asset_definition_id = construct_asset_definition_id(k, domain_id.clone());
let asset_definition = AssetDefinition::numeric(asset_definition_id);
let asset_definition = AssetDefinition::numeric(asset_definition_id.clone());
instructions.push(Register::asset_definition(asset_definition).into());
}
}
Expand Down Expand Up @@ -221,3 +232,28 @@ fn construct_asset_definition_id(i: usize, domain_id: DomainId) -> AssetDefiniti
Name::from_str(&format!("non_inlinable_asset_definition_name_{i}")).unwrap(),
)
}

pub fn generate_ids(
domains: usize,
accounts_per_domain: usize,
assets_per_domain: usize,
) -> (Vec<DomainId>, Vec<AccountId>, Vec<AssetDefinitionId>) {
let mut domain_ids = Vec::new();
let mut account_ids = Vec::new();
let mut asset_definition_ids = Vec::new();

for i in 0..domains {
let domain_id = construct_domain_id(i);
domain_ids.push(domain_id.clone());
for _ in 0..accounts_per_domain {
let account_id = generate_account_id(domain_id.clone());
account_ids.push(account_id)
}
for k in 0..assets_per_domain {
let asset_definition_id = construct_asset_definition_id(k, domain_id.clone());
asset_definition_ids.push(asset_definition_id);
}
}

(domain_ids, account_ids, asset_definition_ids)
}
Loading

0 comments on commit 8db7d8c

Please sign in to comment.