Skip to main content

wowlab_sentinel/scheduler/
mod.rs

1mod assignment;
2pub(crate) mod backlog;
3pub(crate) mod burst;
4mod dispatch;
5mod driver;
6mod eligibility;
7mod planning;
8pub(crate) mod reclaim;
9mod repository;
10pub(crate) mod runtime;
11mod runtime_aggregate;
12mod runtime_breakdown;
13mod runtime_completion_log;
14mod runtime_factorial;
15
16use std::sync::Arc;
17
18use serde::Serialize;
19use tokio_util::sync::CancellationToken;
20
21use crate::state::ServerState;
22
23crate::db_client!(SchedulerDb, "scheduler", max = 5);
24
25#[derive(Debug, Serialize)]
26#[serde(rename_all = "camelCase")]
27pub(crate) struct JobProgressEvent {
28    pub r#type: &'static str,
29    pub payload: JobProgressPayload,
30}
31
32#[derive(Debug, Serialize)]
33#[serde(rename_all = "camelCase")]
34pub(crate) struct JobProgressPayload {
35    pub status: &'static str,
36    pub chunks_completed: i32,
37    pub chunks_total: i32,
38    pub completed_at: Option<String>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub phase: Option<u32>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub phase_count: Option<u32>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub permutations_active: Option<u32>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub top_mean_dps_x10: Option<u32>,
47    #[serde(skip_serializing_if = "Vec::is_empty")]
48    pub top_k: Vec<JobProgressTopPermutation>,
49}
50
51#[derive(Clone, Copy, Debug, Serialize)]
52#[serde(rename_all = "camelCase")]
53pub(crate) struct JobProgressTopPermutation {
54    pub perm_idx: u32,
55    pub mean_dps_x10: u32,
56    pub iterations: u32,
57}
58
59pub(crate) async fn run(
60    state: Arc<ServerState>,
61    shutdown: CancellationToken,
62) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
63    driver::run(state, shutdown).await;
64
65    Ok(())
66}