wowlab_sentinel/scheduler/
mod.rs1mod 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}