Skip to main content

DispatchEngine

Trait DispatchEngine 

Source
pub trait DispatchEngine: Send + Sync {
    // Required methods
    fn start(&self);
    fn submit_job(&self, job: &NzbJob, progress_tx: Sender<ProgressUpdate>);
    fn pause_job(&self, job_id: &str);
    fn resume_job(&self, job_id: &str);
    fn cancel_job(&self, job_id: &str);
    fn abort_job(&self, job_id: &str, reason: String);
    fn has_job(&self, job_id: &str) -> bool;
    fn reconcile_servers(&self);
    fn set_max_worker_idle(&self, d: Duration);
    fn eviction_count(&self) -> u64;
    fn shutdown<'life0, 'async_trait>(
        &'life0 self,
    ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;

    // Provided method
    fn server_stats_snapshot(&self) -> Vec<(String, ServerAttemptStats)> { ... }
}
Expand description

Article-dispatch engine: accepts jobs, drives NNTP fetches, emits progress.

Constructed by the facade/queue layer and owned as Arc<dyn DispatchEngine>. All methods are &self; implementations use interior mutability to allow concurrent use across tokio tasks.

Required Methods§

Source

fn start(&self)

Spawn workers for all currently enabled servers and start the supervisor task. Idempotent (safe to call more than once).

Source

fn submit_job(&self, job: &NzbJob, progress_tx: Sender<ProgressUpdate>)

Register a new job and begin dispatching its unfinished articles. Progress is streamed to progress_tx as ProgressUpdates; the channel is closed when the job reaches a terminal state.

Source

fn pause_job(&self, job_id: &str)

Pause dispatch for job_id. In-flight articles finish; no new work is popped for this job until resume_job.

Source

fn resume_job(&self, job_id: &str)

Resume a paused job.

Source

fn cancel_job(&self, job_id: &str)

Cancel job_id. In-flight articles may still complete but their results are discarded; no terminal progress update is emitted beyond the one triggered by cancellation.

Source

fn abort_job(&self, job_id: &str, reason: String)

Abort job_id with a human-readable reason. Emits ProgressUpdate::JobAborted once outstanding articles drain.

Source

fn has_job(&self, job_id: &str) -> bool

Is job_id currently known to the dispatcher?

Source

fn reconcile_servers(&self)

Re-read the server list and adjust workers to match. Call after any mutation to the server config (add, remove, enable, disable, resize).

Source

fn set_max_worker_idle(&self, d: Duration)

Override the idle-worker eviction threshold. Tests shrink this to make the watchdog converge in seconds; production uses the default.

Source

fn eviction_count(&self) -> u64

Lifetime count of worker evictions performed by the heartbeat watchdog. Increases by 1 each time the supervisor reclaims a stalled worker. Useful for tests and observability.

Source

fn shutdown<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Gracefully shut down: stop accepting new work, signal all workers, and wait for the supervisor to exit.

Provided Methods§

Source

fn server_stats_snapshot(&self) -> Vec<(String, ServerAttemptStats)>

Snapshot of per-server lifetime attempt counters. Used by the queue manager to emit a diagnostic breakdown alongside a job abort — distinguishes “server returned 430 for every article” (dead NZB) from “server had auth errors” (transient). Default is empty for engines that don’t track per-server stats.

Implementors§