iridium-db 0.4.0

A high-performance vector-graph hybrid storage and indexing engine
use std::collections::{HashMap, VecDeque};

use crate::core::topology::CoreId;

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BackgroundJobState {
    Queued,
    Running,
    Succeeded,
    Failed { reason: String },
    Canceled,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BackgroundJobRecord {
    pub job_id: u64,
    pub job_kind: String,
    pub attempts: u32,
    pub state: BackgroundJobState,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct BackgroundJobConfig {
    pub max_queued_jobs: usize,
    pub max_retained_terminal_jobs: usize,
}

impl Default for BackgroundJobConfig {
    fn default() -> Self {
        Self {
            max_queued_jobs: 256,
            max_retained_terminal_jobs: 2048,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BackgroundJobError {
    InvalidInput(String),
    Backpressure {
        queued_jobs: usize,
        max_queued_jobs: usize,
    },
    Shutdown,
    NotFound(u64),
    InvalidTransition(String),
}

pub type BackgroundJobResult<T> = std::result::Result<T, BackgroundJobError>;

pub struct BackgroundJobTracker {
    pub(super) config: BackgroundJobConfig,
    pub(super) next_job_id: u64,
    pub(super) is_shutdown: bool,
    pub(super) queued: VecDeque<u64>,
    pub(super) jobs: HashMap<u64, BackgroundJobRecord>,
    pub(super) terminal_order: VecDeque<u64>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HealthStatus {
    Healthy,
    Degraded,
    Unhealthy,
}

#[derive(Debug, Clone, PartialEq)]
pub struct HealthReport {
    pub status: HealthStatus,
    pub reason: String,
    pub error_rate: f64,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Metrics {
    pub query_total: u64,
    pub query_errors: u64,
    pub query_avg_latency_micros: u64,
    pub query_p95_latency_micros: u64,
    pub query_p99_latency_micros: u64,
    pub ingest_accepted: u64,
    pub ingest_rejected: u64,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct CoreMetrics {
    pub core_id: CoreId,
    pub query_total: u64,
    pub query_errors: u64,
    pub query_avg_latency_micros: u64,
    pub ingest_accepted: u64,
    pub ingest_rejected: u64,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct CoreMetricsAggregate {
    pub query_total: u64,
    pub query_errors: u64,
    pub query_avg_latency_micros: u64,
    pub ingest_accepted: u64,
    pub ingest_rejected: u64,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub(super) struct CoreMetricsAccumulator {
    pub query_total: u64,
    pub query_errors: u64,
    pub query_latency_total_micros: u64,
    pub ingest_accepted: u64,
    pub ingest_rejected: u64,
}