d-engine-server 0.2.3

Production-ready Raft consensus engine server and runtime
Documentation
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) // Filter only numbers <= learner_next_index
        .max_by_key(|index| **index) // Find the maximum of the filtered numbers
        .map(|index| *index) // Convert from reference to value
}

/// record down cluster level error for debug and code optimization purpose.
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);
}

/// Format error logging
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)
}