use std::{fmt::Display, num::NonZeroUsize};
use enum_iterator::IntoEnumIterator;
use serde::Serialize;
#[derive(
Copy, Clone, Debug, Eq, PartialEq, Hash, IntoEnumIterator, PartialOrd, Ord, Serialize, Default,
)]
pub enum QueueKind {
Control,
NetworkIncoming,
NetworkLowPriority,
NetworkDemand,
Network,
NetworkInfo,
Fetch,
SyncGlobalState,
FinalitySignature,
#[default]
Regular,
Gossip,
FromStorage,
ToStorage,
ContractRuntime,
Consensus,
Validation,
Api,
}
impl Display for QueueKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let str_value = match self {
QueueKind::Control => "Control",
QueueKind::NetworkIncoming => "NetworkIncoming",
QueueKind::NetworkLowPriority => "NetworkLowPriority",
QueueKind::NetworkDemand => "NetworkDemand",
QueueKind::Network => "Network",
QueueKind::NetworkInfo => "NetworkInfo",
QueueKind::Fetch => "Fetch",
QueueKind::Regular => "Regular",
QueueKind::Gossip => "Gossip",
QueueKind::FromStorage => "FromStorage",
QueueKind::ToStorage => "ToStorage",
QueueKind::ContractRuntime => "ContractRuntime",
QueueKind::SyncGlobalState => "SyncGlobalState",
QueueKind::FinalitySignature => "FinalitySignature",
QueueKind::Consensus => "Consensus",
QueueKind::Validation => "Validation",
QueueKind::Api => "Api",
};
write!(f, "{}", str_value)
}
}
impl QueueKind {
fn weight(self) -> NonZeroUsize {
NonZeroUsize::new(match self {
QueueKind::NetworkLowPriority => 1,
QueueKind::NetworkInfo => 2,
QueueKind::NetworkDemand => 2,
QueueKind::NetworkIncoming => 8,
QueueKind::Network => 4,
QueueKind::Regular => 4,
QueueKind::Fetch => 4,
QueueKind::Gossip => 4,
QueueKind::FromStorage => 4,
QueueKind::ToStorage => 4,
QueueKind::ContractRuntime => 4,
QueueKind::SyncGlobalState => 4,
QueueKind::Consensus => 4,
QueueKind::FinalitySignature => 4,
QueueKind::Validation => 8,
QueueKind::Api => 8,
QueueKind::Control => 16,
})
.expect("weight must be positive")
}
pub(crate) fn weights() -> Vec<(Self, NonZeroUsize)> {
QueueKind::into_enum_iter()
.map(|q| (q, q.weight()))
.collect()
}
pub(crate) fn metrics_name(&self) -> &str {
match self {
QueueKind::Control => "control",
QueueKind::NetworkIncoming => "network_incoming",
QueueKind::NetworkDemand => "network_demands",
QueueKind::NetworkLowPriority => "network_low_priority",
QueueKind::Network => "network",
QueueKind::NetworkInfo => "network_info",
QueueKind::SyncGlobalState => "sync_global_state",
QueueKind::Fetch => "fetch",
QueueKind::Gossip => "gossip",
QueueKind::FromStorage => "from_storage",
QueueKind::ToStorage => "to_storage",
QueueKind::ContractRuntime => "contract_runtime",
QueueKind::Consensus => "consensus",
QueueKind::Validation => "validation",
QueueKind::FinalitySignature => "finality_signature",
QueueKind::Api => "api",
QueueKind::Regular => "regular",
}
}
}