use std::sync::Arc;
use std::time::SystemTime;
use std::time::UNIX_EPOCH;
use d_engine_proto::common::Entry;
use d_engine_proto::common::NodeRole::Candidate;
use d_engine_proto::common::NodeRole::Follower;
use d_engine_proto::common::NodeRole::Leader;
use d_engine_proto::common::NodeRole::Learner;
use dashmap::DashSet;
use metrics::gauge;
use tracing::error;
pub(crate) fn collect_ids(entries: &[Entry]) -> Vec<u64> {
entries.iter().map(|e| e.index).collect()
}
pub(crate) fn is_majority(
num: usize,
total: usize,
) -> bool {
num > (total / 2)
}
pub fn majority_count(total_nodes: usize) -> usize {
(total_nodes / 2) + 1
}
pub(crate) fn find_nearest_lower_number(
target_index: u64,
set_of_index: Arc<DashSet<u64>>,
) -> Option<u64> {
set_of_index
.iter()
.filter(|index| **index <= target_index) .max_by_key(|index| **index) .map(|index| *index) }
pub(crate) fn record_down_cluster_error(event_id: u64) {
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_secs_f64();
let event_type = event_id.to_string();
gauge!(
"cluster_fatal_error_metric",
"event_type" => event_type
)
.set(timestamp);
}
pub fn error(
func_name: &str,
e: &dyn std::fmt::Debug,
) {
error!("{}::{} failed: {:?}", module_path!(), func_name, e);
}
#[inline]
pub fn is_follower(role_i32: i32) -> bool {
role_i32 == (Follower as i32)
}
#[inline]
pub fn is_candidate(role_i32: i32) -> bool {
role_i32 == (Candidate as i32)
}
#[inline]
pub fn is_leader(role_i32: i32) -> bool {
role_i32 == (Leader as i32)
}
#[inline]
pub fn is_learner(role_i32: i32) -> bool {
role_i32 == (Learner as i32)
}