feat: initialize Kurdistan SDK - independent fork of Polkadot SDK

This commit is contained in:
2025-12-13 15:44:15 +03:00
commit e4778b4576
6838 changed files with 1847450 additions and 0 deletions
@@ -0,0 +1,72 @@
// Copyright (C) Parity Technologies (UK) Ltd.
// This file is part of Pezkuwi.
// Pezkuwi is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Pezkuwi is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Pezkuwi. If not, see <http://www.gnu.org/licenses/>.
//! Error types.
use futures::channel::oneshot;
use pezkuwi_node_subsystem::{
errors::{ChainApiError, RuntimeApiError},
SubsystemError,
};
use pezkuwi_node_subsystem_util::runtime;
use crate::LOG_TARGET;
use fatality::Nested;
#[allow(missing_docs)]
#[fatality::fatality(splitable)]
pub enum Error {
#[fatal]
#[error("Receiving message from overseer failed: {0}")]
SubsystemReceive(#[source] SubsystemError),
#[error("Error while accessing runtime information")]
Runtime(#[from] runtime::Error),
#[error(transparent)]
RuntimeApi(#[from] RuntimeApiError),
#[error(transparent)]
ChainApi(#[from] ChainApiError),
#[error("Request to chain API subsystem dropped")]
ChainApiRequestCanceled(oneshot::Canceled),
#[error("Request to runtime API subsystem dropped")]
RuntimeApiRequestCanceled(oneshot::Canceled),
}
/// General `Result` type.
pub type Result<R> = std::result::Result<R, Error>;
/// Result for non-fatal only failures.
pub type JfyiErrorResult<T> = std::result::Result<T, JfyiError>;
/// Result for fatal only failures.
pub type FatalResult<T> = std::result::Result<T, FatalError>;
/// Utility for eating top level errors and log them.
///
/// We basically always want to try and continue on error. This utility function is meant to
/// consume top-level errors by simply logging them
pub fn log_error(result: Result<()>, ctx: &'static str) -> FatalResult<()> {
match result.into_nested()? {
Ok(()) => Ok(()),
Err(jfyi) => {
gum::debug!(target: LOG_TARGET, error = ?jfyi, ctx);
Ok(())
},
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,158 @@
// Copyright (C) Parity Technologies (UK) Ltd.
// This file is part of Pezkuwi.
// Pezkuwi is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Pezkuwi is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Pezkuwi. If not, see <http://www.gnu.org/licenses/>.
use pezkuwi_node_subsystem::prometheus::Opts;
use pezkuwi_node_subsystem_util::metrics::{
self,
prometheus::{self, Gauge, GaugeVec, U64},
};
#[derive(Clone)]
pub(crate) struct MetricsInner {
time_active_leaves_update: prometheus::Histogram,
time_introduce_seconded_candidate: prometheus::Histogram,
time_candidate_backed: prometheus::Histogram,
time_hypothetical_membership: prometheus::Histogram,
candidate_count: prometheus::GaugeVec<U64>,
active_leaves_count: prometheus::GaugeVec<U64>,
implicit_view_candidate_count: prometheus::Gauge<U64>,
}
/// Candidate backing metrics.
#[derive(Default, Clone)]
pub struct Metrics(pub(crate) Option<MetricsInner>);
impl Metrics {
/// Provide a timer for handling `ActiveLeavesUpdate` which observes on drop.
pub fn time_handle_active_leaves_update(
&self,
) -> Option<metrics::prometheus::prometheus::HistogramTimer> {
self.0.as_ref().map(|metrics| metrics.time_active_leaves_update.start_timer())
}
/// Provide a timer for handling `IntroduceSecondedCandidate` which observes on drop.
pub fn time_introduce_seconded_candidate(
&self,
) -> Option<metrics::prometheus::prometheus::HistogramTimer> {
self.0
.as_ref()
.map(|metrics| metrics.time_introduce_seconded_candidate.start_timer())
}
/// Provide a timer for handling `CandidateBacked` which observes on drop.
pub fn time_candidate_backed(&self) -> Option<metrics::prometheus::prometheus::HistogramTimer> {
self.0.as_ref().map(|metrics| metrics.time_candidate_backed.start_timer())
}
/// Provide a timer for handling `GetHypotheticalMembership` which observes on drop.
pub fn time_hypothetical_membership_request(
&self,
) -> Option<metrics::prometheus::prometheus::HistogramTimer> {
self.0
.as_ref()
.map(|metrics| metrics.time_hypothetical_membership.start_timer())
}
/// Record number of candidates across all fragment chains. First param is the connected
/// candidates count, second param is the unconnected candidates count.
pub fn record_candidate_count(&self, connected_count: u64, unconnected_count: u64) {
self.0.as_ref().map(|metrics| {
metrics.candidate_count.with_label_values(&["connected"]).set(connected_count);
metrics
.candidate_count
.with_label_values(&["unconnected"])
.set(unconnected_count);
});
}
/// Record the number of candidates present in the implicit view of the subsystem.
pub fn record_candidate_count_in_implicit_view(&self, count: u64) {
self.0.as_ref().map(|metrics| {
metrics.implicit_view_candidate_count.set(count);
});
}
/// Record the number of active/inactive leaves kept by the subsystem.
pub fn record_leaves_count(&self, active_count: u64, inactive_count: u64) {
self.0.as_ref().map(|metrics| {
metrics.active_leaves_count.with_label_values(&["active"]).set(active_count);
metrics.active_leaves_count.with_label_values(&["inactive"]).set(inactive_count);
});
}
}
impl metrics::Metrics for Metrics {
fn try_register(registry: &prometheus::Registry) -> Result<Self, prometheus::PrometheusError> {
let metrics = MetricsInner {
time_active_leaves_update: prometheus::register(
prometheus::Histogram::with_opts(prometheus::HistogramOpts::new(
"pezkuwi_teyrchain_prospective_teyrchains_time_active_leaves_update",
"Time spent within `prospective_teyrchains::handle_active_leaves_update`",
))?,
registry,
)?,
time_introduce_seconded_candidate: prometheus::register(
prometheus::Histogram::with_opts(prometheus::HistogramOpts::new(
"pezkuwi_teyrchain_prospective_teyrchains_time_introduce_seconded_candidate",
"Time spent within `prospective_teyrchains::handle_introduce_seconded_candidate`",
))?,
registry,
)?,
time_candidate_backed: prometheus::register(
prometheus::Histogram::with_opts(prometheus::HistogramOpts::new(
"pezkuwi_teyrchain_prospective_teyrchains_time_candidate_backed",
"Time spent within `prospective_teyrchains::handle_candidate_backed`",
))?,
registry,
)?,
time_hypothetical_membership: prometheus::register(
prometheus::Histogram::with_opts(prometheus::HistogramOpts::new(
"pezkuwi_teyrchain_prospective_teyrchains_time_hypothetical_membership",
"Time spent responding to `GetHypotheticalMembership`",
))?,
registry,
)?,
candidate_count: prometheus::register(
GaugeVec::new(
Opts::new(
"pezkuwi_teyrchain_prospective_teyrchains_candidate_count",
"Number of candidates present across all fragment chains, split by connected and unconnected"
),
&["type"],
)?,
registry,
)?,
active_leaves_count: prometheus::register(
GaugeVec::new(
Opts::new(
"pezkuwi_teyrchain_prospective_teyrchains_active_leaves_count",
"Number of leaves kept by the subsystem, split by active/inactive"
),
&["type"],
)?,
registry,
)?,
implicit_view_candidate_count: prometheus::register(
Gauge::new(
"pezkuwi_teyrchain_prospective_teyrchains_implicit_view_candidate_count",
"Number of candidates present in the implicit view"
)?,
registry
)?,
};
Ok(Metrics(Some(metrics)))
}
}
File diff suppressed because it is too large Load Diff