Skip to main content

orbok_workers/scheduler/
limits.rs

1//! Scheduler resource limits and configuration (RFC-036 §9, §10.3).
2
3/// Per-queue worker concurrency limits (RFC-036 §9.1).
4///
5/// Defaults are intentionally conservative: one calm worker per queue
6/// is better than a fast app that feels hostile on a low-powered machine.
7#[derive(Debug, Clone)]
8pub struct SchedulerLimits {
9    pub scan_workers: usize,
10    pub extract_workers: usize,
11    pub chunk_workers: usize,
12    pub keyword_workers: usize,
13    pub embedding_workers: usize,
14    pub maintenance_workers: usize,
15}
16
17impl Default for SchedulerLimits {
18    fn default() -> Self {
19        Self {
20            scan_workers: 1,
21            extract_workers: 1,
22            chunk_workers: 1,
23            keyword_workers: 1,
24            embedding_workers: 1,
25            maintenance_workers: 1,
26        }
27    }
28}
29
30/// Per-queue depth caps (RFC-036 §10.3).
31///
32/// When a queue hits its cap, upstream production pauses (backpressure).
33/// These are starting points; they will be tuned in RFC-037 benchmarks.
34#[derive(Debug, Clone)]
35pub struct QueueCapacity {
36    pub scan_queue_max: usize,
37    pub extract_queue_max: usize,
38    pub chunk_queue_max: usize,
39    pub keyword_queue_max: usize,
40    pub embedding_queue_max: usize,
41    pub maintenance_queue_max: usize,
42}
43
44impl Default for QueueCapacity {
45    fn default() -> Self {
46        Self {
47            scan_queue_max: 10_000,
48            extract_queue_max: 1_000,
49            chunk_queue_max: 1_000,
50            keyword_queue_max: 1_000,
51            embedding_queue_max: 2_000,
52            maintenance_queue_max: 200,
53        }
54    }
55}
56
57/// Maximum retry attempts before a job is marked permanently failed.
58pub const MAX_JOB_ATTEMPTS: u32 = 3;
59
60/// Complete scheduler configuration.
61#[derive(Debug, Clone, Default)]
62pub struct SchedulerConfig {
63    pub limits: SchedulerLimits,
64    pub capacity: QueueCapacity,
65}