Skip to content

Commit 7347bc1

Browse files
committed
(feat/malloc_size_of): inspect transition frontier and snark pool resources usage
1 parent 1a77392 commit 7347bc1

File tree

4 files changed

+78
-14
lines changed

4 files changed

+78
-14
lines changed

node/src/rpc/mod.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
mod rpc_state;
2-
use std::collections::BTreeMap;
2+
use std::collections::{BTreeMap, BTreeSet};
33
use std::str::FromStr;
44

55
use ark_ff::fields::arithmetic::InvalidBigInt;
@@ -461,7 +461,29 @@ pub struct RpcNodeStatus {
461461
pub snark_pool: RpcNodeStatusSnarkPool,
462462
pub transaction_pool: RpcNodeStatusTransactionPool,
463463
pub current_block_production_attempt: Option<BlockProductionAttempt>,
464+
pub resources_status: RpcNodeStatusResources,
465+
}
466+
467+
#[derive(Serialize, Debug, Clone)]
468+
pub struct RpcNodeStatusResources {
464469
pub p2p_malloc_size: usize,
470+
pub transition_frontier: RpcNodeStatusResourcesTransitionFrontier,
471+
pub snark_pool: RpcNodeStatusResourcesSnarkPool,
472+
}
473+
474+
#[derive(Serialize, Debug, Clone)]
475+
pub struct RpcNodeStatusResourcesTransitionFrontier {
476+
pub best_chain_size: usize,
477+
pub needed_protocol_states_size: usize,
478+
pub blacklist_size: usize,
479+
pub diff_tx_size: usize,
480+
}
481+
482+
#[derive(Serialize, Debug, Clone)]
483+
pub struct RpcNodeStatusResourcesSnarkPool {
484+
pub pool_size: usize,
485+
pub candidates_size: usize,
486+
pub candidates_inconsistency: BTreeSet<(PeerId, SnarkJobId)>,
465487
}
466488

467489
#[derive(Serialize, Debug, Clone)]

node/src/rpc_effectful/rpc_effectful_effects.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ use crate::{
1414
AccountQuery, AccountSlim, ActionStatsQuery, ActionStatsResponse, CurrentMessageProgress,
1515
MessagesStats, NodeHeartbeat, RootLedgerSyncProgress, RootStagedLedgerSyncProgress,
1616
RpcAction, RpcBlockProducerStats, RpcMessageProgressResponse, RpcNodeStatus,
17-
RpcNodeStatusTransactionPool, RpcNodeStatusTransitionFrontier,
18-
RpcNodeStatusTransitionFrontierBlockSummary, RpcNodeStatusTransitionFrontierSync,
19-
RpcRequestExtraData, RpcScanStateSummary, RpcScanStateSummaryBlock,
20-
RpcScanStateSummaryBlockTransaction, RpcScanStateSummaryBlockTransactionKind,
21-
RpcScanStateSummaryScanStateJob, RpcSnarkPoolJobFull, RpcSnarkPoolJobSnarkWork,
22-
RpcSnarkPoolJobSummary, RpcSnarkerJobCommitResponse, RpcSnarkerJobSpecResponse,
23-
RpcTransactionInjectResponse, TransactionStatus,
17+
RpcNodeStatusResources, RpcNodeStatusResourcesSnarkPool,
18+
RpcNodeStatusResourcesTransitionFrontier, RpcNodeStatusTransactionPool,
19+
RpcNodeStatusTransitionFrontier, RpcNodeStatusTransitionFrontierBlockSummary,
20+
RpcNodeStatusTransitionFrontierSync, RpcRequestExtraData, RpcScanStateSummary,
21+
RpcScanStateSummaryBlock, RpcScanStateSummaryBlockTransaction,
22+
RpcScanStateSummaryBlockTransactionKind, RpcScanStateSummaryScanStateJob,
23+
RpcSnarkPoolJobFull, RpcSnarkPoolJobSnarkWork, RpcSnarkPoolJobSummary,
24+
RpcSnarkerJobCommitResponse, RpcSnarkerJobSpecResponse, RpcTransactionInjectResponse,
25+
TransactionStatus,
2426
},
2527
snark_pool::SnarkPoolAction,
2628
transition_frontier::sync::{
@@ -810,11 +812,33 @@ fn compute_node_status<S: Service>(store: &mut Store<S>) -> RpcNodeStatus {
810812
transaction_candidates: state.transaction_pool.candidates.transactions_count(),
811813
},
812814
current_block_production_attempt,
813-
p2p_malloc_size: {
814-
let mut set = BTreeSet::new();
815-
let fun = move |ptr: *const c_void| !set.insert(ptr.addr());
816-
let mut ops = MallocSizeOfOps::new(None, Some(Box::new(fun)));
817-
size_of_val(&state.p2p) + state.p2p.size_of(&mut ops)
815+
resources_status: RpcNodeStatusResources {
816+
p2p_malloc_size: {
817+
let mut set = BTreeSet::new();
818+
let fun = move |ptr: *const c_void| !set.insert(ptr.addr());
819+
let mut ops = MallocSizeOfOps::new(None, Some(Box::new(fun)));
820+
size_of_val(&state.p2p) + state.p2p.size_of(&mut ops)
821+
},
822+
transition_frontier: RpcNodeStatusResourcesTransitionFrontier {
823+
best_chain_size: state.transition_frontier.best_chain.len(),
824+
needed_protocol_states_size: state.transition_frontier.needed_protocol_states.len(),
825+
blacklist_size: state.transition_frontier.blacklist.len(),
826+
diff_tx_size: state
827+
.transition_frontier
828+
.chain_diff
829+
.as_ref()
830+
.map(|d| d.new_commands.len() + d.removed_commands.len())
831+
.unwrap_or_default(),
832+
},
833+
snark_pool: {
834+
let (candidates_size, candidates_inconsistency) =
835+
state.snark_pool.candidates.check();
836+
RpcNodeStatusResourcesSnarkPool {
837+
pool_size: state.snark_pool.pool.len(),
838+
candidates_size,
839+
candidates_inconsistency,
840+
}
841+
},
818842
},
819843
};
820844
status

node/src/snark_pool/candidate/snark_pool_candidate_state.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,24 @@ impl SnarkPoolCandidatesState {
5151
Self::default()
5252
}
5353

54+
pub fn check(&self) -> (usize, BTreeSet<(PeerId, SnarkJobId)>) {
55+
let len = self.by_peer.iter().map(|(_, v)| v.len()).sum::<usize>();
56+
let lhs = self
57+
.by_job_id
58+
.iter()
59+
.map(|(job_id, v)| v.iter().map(|peer_id| (*peer_id, job_id.clone())))
60+
.flatten()
61+
.collect::<BTreeSet<_>>();
62+
let rhs = self
63+
.by_peer
64+
.iter()
65+
.map(|(peer_id, v)| v.keys().map(|job_id| (*peer_id, job_id.clone())))
66+
.flatten()
67+
.collect::<BTreeSet<_>>();
68+
let inconsistency = lhs.symmetric_difference(&rhs).cloned().collect();
69+
(len, inconsistency)
70+
}
71+
5472
pub fn peer_work_count(&self, peer_id: &PeerId) -> usize {
5573
self.by_peer.get(peer_id).map(|v| v.len()).unwrap_or(0)
5674
}

node/src/snark_pool/snark_pool_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use super::SnarkPoolConfig;
1515
#[derive(Serialize, Deserialize, Clone)]
1616
pub struct SnarkPoolState {
1717
config: SnarkPoolConfig,
18-
pool: DistributedPool<JobState, SnarkJobId>,
18+
pub pool: DistributedPool<JobState, SnarkJobId>,
1919
pub candidates: SnarkPoolCandidatesState,
2020
pub(super) last_check_timeouts: Timestamp,
2121
}

0 commit comments

Comments
 (0)