Skip to content

Commit

Permalink
feat: add /peers API endpoint to torii
Browse files Browse the repository at this point in the history
Signed-off-by: Marin Veršić <[email protected]>
  • Loading branch information
mversic committed Nov 14, 2024
1 parent a90040c commit d7ff3ac
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 62 deletions.
2 changes: 1 addition & 1 deletion crates/iroha/tests/status_response.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use tokio::task::spawn_blocking;
fn status_eq_excluding_uptime_and_queue(lhs: &Status, rhs: &Status) -> bool {
lhs.peers == rhs.peers
&& lhs.blocks == rhs.blocks
&& lhs.txs_accepted == rhs.txs_accepted
&& lhs.txs_approved == rhs.txs_approved
&& lhs.txs_rejected == rhs.txs_rejected
&& lhs.view_changes == rhs.view_changes
}
Expand Down
2 changes: 1 addition & 1 deletion crates/iroha_core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ pub const TX_RETRIEVAL_INTERVAL: Duration = Duration::from_millis(100);
pub type IrohaNetwork = iroha_p2p::NetworkHandle<NetworkMessage>;

/// Ids of peers.
pub type PeersIds = UniqueVec<PeerId>;
pub type Peers = UniqueVec<PeerId>;

/// Type of `Sender<EventBox>` which should be used for channels of `Event` messages.
pub type EventsSender = broadcast::Sender<EventBox>;
Expand Down
6 changes: 6 additions & 0 deletions crates/iroha_core/src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use std::{num::NonZeroUsize, sync::Arc, time::SystemTime};

use eyre::{Result, WrapErr as _};
use iroha_data_model::peer::Peer;
use iroha_telemetry::metrics::Metrics;
use mv::storage::StorageReadOnly;
use parking_lot::Mutex;
Expand Down Expand Up @@ -147,4 +148,9 @@ impl MetricsReporter {
pub fn metrics(&self) -> &Metrics {
&self.metrics
}

/// Last known online peers
pub fn online_peers(&self) -> Vec<Peer> {
self.network.online_peers(|x| x.iter().cloned().collect())
}
}
8 changes: 4 additions & 4 deletions crates/iroha_core/src/smartcontracts/isi/world.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ pub mod isi {
let peer_id = self.object;

let world = &mut state_transaction.world;
if let PushResult::Duplicate(duplicate) = world.trusted_peers_ids.push(peer_id.clone())
{
if let PushResult::Duplicate(duplicate) = world.peers.push(peer_id.clone()) {
return Err(RepetitionError {
instruction: InstructionType::Register,
id: IdBox::PeerId(duplicate),
Expand All @@ -63,11 +62,11 @@ pub mod isi {
) -> Result<(), Error> {
let peer_id = self.object;
let world = &mut state_transaction.world;
let Some(index) = world.trusted_peers_ids.iter().position(|id| id == &peer_id) else {
let Some(index) = world.peers.iter().position(|id| id == &peer_id) else {
return Err(FindError::Peer(peer_id).into());
};

world.trusted_peers_ids.remove(index);
world.peers.remove(index);

world.emit_events(Some(PeerEvent::Removed(peer_id)));

Expand Down Expand Up @@ -513,6 +512,7 @@ pub mod query {
Ok(state_ro
.world()
.peers()
.into_iter()
.filter(move |peer| filter.applies(peer))
.cloned())
}
Expand Down
66 changes: 27 additions & 39 deletions crates/iroha_core/src/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ use crate::{
},
wasm, Execute,
},
PeersIds,
Peers,
};

/// The global entity consisting of `domains`, `triggers` and etc.
Expand All @@ -65,8 +65,8 @@ use crate::{
pub struct World {
/// Iroha on-chain parameters.
pub(crate) parameters: Cell<Parameters>,
/// Identifications of discovered trusted peers.
pub(crate) trusted_peers_ids: Cell<PeersIds>,
/// Identifications of discovered peers.
pub(crate) peers: Cell<Peers>,
/// Registered domains.
pub(crate) domains: Storage<DomainId, Domain>,
/// Registered accounts.
Expand All @@ -93,8 +93,8 @@ pub struct World {
pub struct WorldBlock<'world> {
/// Iroha on-chain parameters.
pub parameters: CellBlock<'world, Parameters>,
/// Identifications of discovered trusted peers.
pub(crate) trusted_peers_ids: CellBlock<'world, PeersIds>,
/// Identifications of discovered peers.
pub(crate) peers: CellBlock<'world, Peers>,
/// Registered domains.
pub(crate) domains: StorageBlock<'world, DomainId, Domain>,
/// Registered accounts.
Expand Down Expand Up @@ -123,8 +123,8 @@ pub struct WorldBlock<'world> {
pub struct WorldTransaction<'block, 'world> {
/// Iroha on-chain parameters.
pub(crate) parameters: CellTransaction<'block, 'world, Parameters>,
/// Identifications of discovered trusted peers.
pub(crate) trusted_peers_ids: CellTransaction<'block, 'world, PeersIds>,
/// Identifications of discovered peers.
pub(crate) peers: CellTransaction<'block, 'world, Peers>,
/// Registered domains.
pub(crate) domains: StorageTransaction<'block, 'world, DomainId, Domain>,
/// Registered accounts.
Expand Down Expand Up @@ -162,8 +162,8 @@ struct TransactionEventBuffer<'block> {
pub struct WorldView<'world> {
/// Iroha on-chain parameters.
pub(crate) parameters: CellView<'world, Parameters>,
/// Identifications of discovered trusted peers.
pub(crate) trusted_peers_ids: CellView<'world, PeersIds>,
/// Identifications of discovered peers.
pub(crate) peers: CellView<'world, Peers>,
/// Registered domains.
pub(crate) domains: StorageView<'world, DomainId, Domain>,
/// Registered accounts.
Expand Down Expand Up @@ -303,7 +303,7 @@ impl World {
Self::default()
}

/// Creates a [`World`] with these [`Domain`]s and trusted [`PeerId`]s.
/// Creates a [`World`] with these [`Domain`]s and [`Peer`]s.
pub fn with<D, A, Ad>(domains: D, accounts: A, asset_definitions: Ad) -> Self
where
D: IntoIterator<Item = Domain>,
Expand All @@ -313,7 +313,7 @@ impl World {
Self::with_assets(domains, accounts, asset_definitions, [])
}

/// Creates a [`World`] with these [`Domain`]s and trusted [`PeerId`]s.
/// Creates a [`World`] with these [`Domain`]s and [`Peer`]s.
pub fn with_assets<D, A, Ad, As>(
domains: D,
accounts: A,
Expand Down Expand Up @@ -352,7 +352,7 @@ impl World {
pub fn block(&self) -> WorldBlock {
WorldBlock {
parameters: self.parameters.block(),
trusted_peers_ids: self.trusted_peers_ids.block(),
peers: self.peers.block(),
domains: self.domains.block(),
accounts: self.accounts.block(),
asset_definitions: self.asset_definitions.block(),
Expand All @@ -371,7 +371,7 @@ impl World {
pub fn block_and_revert(&self) -> WorldBlock {
WorldBlock {
parameters: self.parameters.block_and_revert(),
trusted_peers_ids: self.trusted_peers_ids.block_and_revert(),
peers: self.peers.block_and_revert(),
domains: self.domains.block_and_revert(),
accounts: self.accounts.block_and_revert(),
asset_definitions: self.asset_definitions.block_and_revert(),
Expand All @@ -390,7 +390,7 @@ impl World {
pub fn view(&self) -> WorldView {
WorldView {
parameters: self.parameters.view(),
trusted_peers_ids: self.trusted_peers_ids.view(),
peers: self.peers.view(),
domains: self.domains.view(),
accounts: self.accounts.view(),
asset_definitions: self.asset_definitions.view(),
Expand All @@ -409,7 +409,7 @@ impl World {
#[allow(missing_docs)]
pub trait WorldReadOnly {
fn parameters(&self) -> &Parameters;
fn trusted_peers_ids(&self) -> &PeersIds;
fn peers(&self) -> &Peers;
fn domains(&self) -> &impl StorageReadOnly<DomainId, Domain>;
fn accounts(&self) -> &impl StorageReadOnly<AccountId, Account>;
fn asset_definitions(&self) -> &impl StorageReadOnly<AssetDefinitionId, AssetDefinition>;
Expand Down Expand Up @@ -635,17 +635,6 @@ pub trait WorldReadOnly {
fn asset_total_amount(&self, definition_id: &AssetDefinitionId) -> Result<Numeric, FindError> {
Ok(self.asset_definition(definition_id)?.total_quantity)
}

/// Get an immutable iterator over the [`PeerId`]s.
fn peers(&self) -> impl ExactSizeIterator<Item = &PeerId> {
self.trusted_peers_ids().iter()
}

/// Returns reference for trusted peer ids
#[inline]
fn peers_ids(&self) -> &PeersIds {
self.trusted_peers_ids()
}
}

macro_rules! impl_world_ro {
Expand All @@ -654,8 +643,8 @@ macro_rules! impl_world_ro {
fn parameters(&self) -> &Parameters {
&self.parameters
}
fn trusted_peers_ids(&self) -> &PeersIds {
&self.trusted_peers_ids
fn peers(&self) -> &Peers {
&self.peers
}
fn domains(&self) -> &impl StorageReadOnly<DomainId, Domain> {
&self.domains
Expand Down Expand Up @@ -700,7 +689,7 @@ impl<'world> WorldBlock<'world> {
pub fn trasaction(&mut self) -> WorldTransaction<'_, 'world> {
WorldTransaction {
parameters: self.parameters.transaction(),
trusted_peers_ids: self.trusted_peers_ids.transaction(),
peers: self.peers.transaction(),
domains: self.domains.transaction(),
accounts: self.accounts.transaction(),
asset_definitions: self.asset_definitions.transaction(),
Expand All @@ -723,7 +712,7 @@ impl<'world> WorldBlock<'world> {
// NOTE: intentionally destruct self not to forget commit some fields
let Self {
parameters,
trusted_peers_ids,
peers,
domains,
accounts,
asset_definitions,
Expand All @@ -747,7 +736,7 @@ impl<'world> WorldBlock<'world> {
asset_definitions.commit();
accounts.commit();
domains.commit();
trusted_peers_ids.commit();
peers.commit();
parameters.commit();
}
}
Expand All @@ -758,7 +747,7 @@ impl WorldTransaction<'_, '_> {
// NOTE: intentionally destruct self not to forget commit some fields
let Self {
parameters,
trusted_peers_ids,
peers,
domains,
accounts,
asset_definitions,
Expand All @@ -781,7 +770,7 @@ impl WorldTransaction<'_, '_> {
asset_definitions.apply();
accounts.apply();
domains.apply();
trusted_peers_ids.apply();
peers.apply();
parameters.apply();
events_buffer.events_created_in_transaction = 0;
}
Expand Down Expand Up @@ -1864,7 +1853,7 @@ pub(crate) mod deserialize {
M: MapAccess<'de>,
{
let mut parameters = None;
let mut trusted_peers_ids = None;
let mut peers = None;
let mut domains = None;
let mut accounts = None;
let mut asset_definitions = None;
Expand All @@ -1881,8 +1870,8 @@ pub(crate) mod deserialize {
"parameters" => {
parameters = Some(map.next_value()?);
}
"trusted_peers_ids" => {
trusted_peers_ids = Some(map.next_value()?);
"peers" => {
peers = Some(map.next_value()?);
}
"domains" => {
domains = Some(map.next_value()?);
Expand Down Expand Up @@ -1925,8 +1914,7 @@ pub(crate) mod deserialize {
Ok(World {
parameters: parameters
.ok_or_else(|| serde::de::Error::missing_field("parameters"))?,
trusted_peers_ids: trusted_peers_ids
.ok_or_else(|| serde::de::Error::missing_field("trusted_peers_ids"))?,
peers: peers.ok_or_else(|| serde::de::Error::missing_field("peers"))?,
domains: domains
.ok_or_else(|| serde::de::Error::missing_field("domains"))?,
accounts: accounts
Expand Down Expand Up @@ -1955,7 +1943,7 @@ pub(crate) mod deserialize {
"World",
&[
"parameters",
"trusted_peers_ids",
"peers",
"domains",
"roles",
"account_permissions",
Expand Down
6 changes: 3 additions & 3 deletions crates/iroha_core/src/sumeragi/main_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ impl Sumeragi {
}

// NOTE: By this time genesis block is executed and list of trusted peers is updated
self.topology = Topology::new(state_block.world.trusted_peers_ids.clone());
self.topology = Topology::new(state_block.world.peers.clone());
self.commit_block(block, state_block);
return Ok(());
}
Expand Down Expand Up @@ -318,7 +318,7 @@ impl Sumeragi {
);

// NOTE: By this time genesis block is executed and list of trusted peers is updated
self.topology = Topology::new(state_block.world.trusted_peers_ids.clone());
self.topology = Topology::new(state_block.world.peers.clone());

let genesis = genesis
.commit(&self.topology)
Expand All @@ -343,7 +343,7 @@ impl Sumeragi {
let prev_role = self.role();

self.topology
.block_committed(state_block.world.peers().cloned());
.block_committed(state_block.world.peers().clone());

let state_events =
state_block.apply_without_execution(&block, self.topology.as_ref().to_owned());
Expand Down
4 changes: 2 additions & 2 deletions crates/iroha_core/src/sumeragi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,10 @@ impl SumeragiHandle {
.expect("INTERNAL BUG: Invalid block stored in Kura");

if block.as_ref().header().is_genesis() {
*topology = Topology::new(state_block.world.trusted_peers_ids.clone());
*topology = Topology::new(state_block.world.peers.clone());
}

topology.block_committed(state_block.world.peers().cloned());
topology.block_committed(state_block.world.peers().clone());

state_block
.apply_without_execution(&block, topology.as_ref().to_owned())
Expand Down
8 changes: 4 additions & 4 deletions crates/iroha_telemetry/src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ pub struct Status {
/// Number of committed blocks (blockchain height)
#[codec(compact)]
pub blocks: u64,
/// Number of accepted transactions
/// Number of approved transactions
#[codec(compact)]
pub txs_accepted: u64,
pub txs_approved: u64,
/// Number of rejected transactions
#[codec(compact)]
pub txs_rejected: u64,
Expand All @@ -76,7 +76,7 @@ impl<T: Deref<Target = Metrics>> From<&T> for Status {
Self {
peers: val.connected_peers.get(),
blocks: val.block_height.get(),
txs_accepted: val.txs.with_label_values(&["accepted"]).get(),
txs_approved: val.txs.with_label_values(&["accepted"]).get(),
txs_rejected: val.txs.with_label_values(&["rejected"]).get(),
uptime: Uptime(Duration::from_millis(val.uptime_since_genesis_ms.get())),
view_changes: val
Expand Down Expand Up @@ -249,7 +249,7 @@ mod test {
Status {
peers: 4,
blocks: 5,
txs_accepted: 31,
txs_approved: 31,
txs_rejected: 3,
uptime: Uptime(Duration::new(5, 937_000_000)),
view_changes: 2,
Expand Down
21 changes: 14 additions & 7 deletions crates/iroha_torii/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,13 @@ impl Torii {
let kiso = self.kiso.clone();
move || routing::handle_get_configuration(kiso)
}),
)
.route(
uri::API_VERSION,
get({
let state = self.state.clone();
move || routing::handle_version(state)
}),
);

#[cfg(feature = "telemetry")]
Expand All @@ -122,6 +129,13 @@ impl Torii {
}
}),
)
.route(
uri::PEERS,
get({
let metrics_reporter = self.metrics_reporter.clone();
move || core::future::ready(routing::handle_peers(&metrics_reporter))
}),
)
.route(
uri::STATUS,
get({
Expand All @@ -137,13 +151,6 @@ impl Torii {
let metrics_reporter = self.metrics_reporter.clone();
move || core::future::ready(routing::handle_metrics(&metrics_reporter))
}),
)
.route(
uri::API_VERSION,
get({
let state = self.state.clone();
move || routing::handle_version(state)
}),
);

#[cfg(feature = "schema")]
Expand Down
Loading

0 comments on commit d7ff3ac

Please sign in to comment.