From 29a0fb6ec9cf827992810e17e307c2c4e19203a8 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Tue, 7 May 2024 22:29:53 +0800 Subject: [PATCH] pruntime: Box large value in OrdMap --- .../phactory/src/contracts/support/keeper.rs | 20 ++++++++++++------- crates/phactory/src/prpc_service.rs | 2 +- crates/phactory/src/system/gk.rs | 8 ++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/crates/phactory/src/contracts/support/keeper.rs b/crates/phactory/src/contracts/support/keeper.rs index 0265d720d..395ab8073 100644 --- a/crates/phactory/src/contracts/support/keeper.rs +++ b/crates/phactory/src/contracts/support/keeper.rs @@ -11,7 +11,10 @@ use crate::{ im_helpers::{ordmap_for_each_mut, OrdMap}, }; -type ContractMap = OrdMap; +// size_of::() == 1064, if we don't box it, it would exceed the stack capacity +// when inserting data, even if we have an 8MB stack size. Not sure why the OrdMap::insert +// increases the size so significantly. +type ContractMap = OrdMap>; #[derive(Default, Serialize, Deserialize, Clone, ::scale_info::TypeInfo)] pub struct ContractsKeeper { @@ -24,7 +27,8 @@ pub struct ContractsKeeper { impl ContractsKeeper { pub fn insert(&mut self, contract: Contract) { - self.contracts.insert(contract.address().clone(), contract); + self.contracts + .insert(contract.address().clone(), Box::new(contract)); } pub fn keys(&self) -> impl Iterator { @@ -32,11 +36,13 @@ impl ContractsKeeper { } pub fn get_mut(&mut self, id: &AccountId) -> Option<&mut Contract> { - self.contracts.get_mut(id) + let boxed = self.contracts.get_mut(id)?; + Some(&mut *boxed) } pub fn get(&self, id: &AccountId) -> Option<&Contract> { - self.contracts.get(id) + let boxed = self.contracts.get(id)?; + Some(&*boxed) } #[allow(clippy::len_without_is_empty)] @@ -56,11 +62,11 @@ impl ContractsKeeper { #[allow(clippy::iter_kv_map)] std::mem::take(&mut self.contracts) .into_iter() - .map(|(_, v)| v) + .map(|(_, v)| *v) } pub fn iter(&self) -> impl Iterator { - self.contracts.iter() + self.contracts.iter().map(|(k, v)| (k, &**v)) } pub fn apply_local_cache_quotas(&self) { @@ -73,7 +79,7 @@ pub(super) trait ToWeight { fn to_weight(&self) -> u32; } -impl ToWeight for Contract { +impl ToWeight for Box { fn to_weight(&self) -> u32 { self.weight } diff --git a/crates/phactory/src/prpc_service.rs b/crates/phactory/src/prpc_service.rs index b8df0cf3e..d840f06ab 100644 --- a/crates/phactory/src/prpc_service.rs +++ b/crates/phactory/src/prpc_service.rs @@ -31,8 +31,8 @@ use phala_types::{ ChallengeHandlerInfo, EncryptedWorkerKey, HandoverChallenge, SignedContentType, VersionedWorkerEndpoints, WorkerEndpointPayload, WorkerPublicKey, WorkerRegistrationInfoV2, }; -use pink_loader::types::{AccountId, ExecSideEffects, ExecutionMode}; use phala_types::{DcapChallengeHandlerInfo, DcapHandoverChallenge}; +use pink_loader::types::{AccountId, ExecSideEffects, ExecutionMode}; use sp_application_crypto::UncheckedFrom; use sp_core::hashing::blake2_256; use tracing::{error, info}; diff --git a/crates/phactory/src/system/gk.rs b/crates/phactory/src/system/gk.rs index 6d7539c51..a40a2c5cf 100644 --- a/crates/phactory/src/system/gk.rs +++ b/crates/phactory/src/system/gk.rs @@ -639,7 +639,7 @@ pub struct ComputingEconomics { system_events: TypedReceiver, gatekeeper_events: TypedReceiver, #[cfg_attr(not(test), codec(skip))] - workers: OrdMap, + workers: OrdMap>, #[codec(skip)] tokenomic_params: tokenomic::Params, #[serde(skip, default)] @@ -710,12 +710,12 @@ impl> ComputingEconomics Vec<(WorkerPublicKey, pb::WorkerState)> { self.workers .values() - .map(|info| (info.state.pubkey, info.into())) + .map(|info| (info.state.pubkey, (&**info).into())) .collect() } pub fn worker_state(&self, pubkey: &WorkerPublicKey) -> Option { - self.workers.get(pubkey).map(Into::into) + self.workers.get(pubkey).map(|info| (&**info).into()) } pub fn will_process_block(&mut self, block: &BlockInfo<'_>) { @@ -1019,7 +1019,7 @@ impl> ComputingEconomics