pub trait TaskQueue: Send + Sync {
Show 15 methods
// Required methods
fn enqueue(
&self,
task_id: TaskId,
run_id: RunId,
priority: u32,
command_class: CommandClass,
available_at: Option<DateTime<Utc>>,
) -> Result<Uuid, QueueError>;
fn claim(
&self,
request: &ClaimRequest,
config: &ConcurrencyConfig,
) -> Result<Vec<QueueEntry>, QueueError>;
fn heartbeat(
&self,
queue_id: Uuid,
worker_id: &str,
lease_ttl: Duration,
) -> Result<(), QueueError>;
fn complete(
&self,
queue_id: Uuid,
worker_id: &str,
) -> Result<(), QueueError>;
fn fail(&self, queue_id: Uuid, worker_id: &str) -> Result<(), QueueError>;
fn cancel(&self, queue_id: Uuid) -> Result<(), QueueError>;
fn reclaim_stale(&self, grace_period: Duration) -> Result<usize, QueueError>;
fn stats(&self) -> QueueStats;
fn entries(&self) -> Vec<QueueEntry>;
fn override_priority(
&self,
task_id: TaskId,
priority: u32,
) -> Result<(), QueueError>;
fn leased_count_for_run(&self, run_id: RunId) -> usize;
fn leased_count_for_class(&self, class: CommandClass) -> usize;
fn pending_count(&self) -> usize;
fn cancel_for_run(&self, run_id: RunId) -> Result<usize, QueueError>;
fn cancel_stale_runs(
&self,
active_run_ids: &[RunId],
) -> Result<usize, QueueError>;
}Expand description
Abstract task queue. Implementations must be thread-safe.
Mirrors the lease-based scheduling from Section 9.3 and 10.2.
Required Methods§
Sourcefn enqueue(
&self,
task_id: TaskId,
run_id: RunId,
priority: u32,
command_class: CommandClass,
available_at: Option<DateTime<Utc>>,
) -> Result<Uuid, QueueError>
fn enqueue( &self, task_id: TaskId, run_id: RunId, priority: u32, command_class: CommandClass, available_at: Option<DateTime<Utc>>, ) -> Result<Uuid, QueueError>
Enqueue a task for scheduling.
Returns the queue_id. Rejects duplicates (same task_id already pending/leased).
Sourcefn claim(
&self,
request: &ClaimRequest,
config: &ConcurrencyConfig,
) -> Result<Vec<QueueEntry>, QueueError>
fn claim( &self, request: &ClaimRequest, config: &ConcurrencyConfig, ) -> Result<Vec<QueueEntry>, QueueError>
Claim up to limit pending tasks, ordered by priority DESC (with aging).
Implements SELECT ... FOR UPDATE SKIP LOCKED LIMIT N semantics:
only returns entries that are Pending, not claimed by another worker,
and whose available_at <= now. Sets lease owner and expiry atomically.
Respects concurrency caps from the provided config.
Sourcefn heartbeat(
&self,
queue_id: Uuid,
worker_id: &str,
lease_ttl: Duration,
) -> Result<(), QueueError>
fn heartbeat( &self, queue_id: Uuid, worker_id: &str, lease_ttl: Duration, ) -> Result<(), QueueError>
Extend the lease for an active entry (heartbeat).
The worker must match the current lease owner. Resets lease_expires_at
to now + lease_ttl.
Sourcefn complete(&self, queue_id: Uuid, worker_id: &str) -> Result<(), QueueError>
fn complete(&self, queue_id: Uuid, worker_id: &str) -> Result<(), QueueError>
Mark a leased entry as completed. Only the lease owner can complete.
Sourcefn fail(&self, queue_id: Uuid, worker_id: &str) -> Result<(), QueueError>
fn fail(&self, queue_id: Uuid, worker_id: &str) -> Result<(), QueueError>
Mark a leased entry as failed. Only the lease owner can fail.
Sourcefn cancel(&self, queue_id: Uuid) -> Result<(), QueueError>
fn cancel(&self, queue_id: Uuid) -> Result<(), QueueError>
Override priority for all known entries belonging to a task.
Returns QueueError::NotFound(task_id) when no rows match the task id.
Cancel a pending or leased entry. Cancelled entries are not retried.
Sourcefn reclaim_stale(&self, grace_period: Duration) -> Result<usize, QueueError>
fn reclaim_stale(&self, grace_period: Duration) -> Result<usize, QueueError>
Reclaim stale leases: entries where lease_expires_at + grace < now.
Reclaimed entries move to Pending with incremented attempt_no.
Returns the number of entries reclaimed.
Sourcefn stats(&self) -> QueueStats
fn stats(&self) -> QueueStats
Return the number of entries in each status.
Sourcefn entries(&self) -> Vec<QueueEntry>
fn entries(&self) -> Vec<QueueEntry>
Return a snapshot of all known queue entries.
The snapshot is best-effort and suitable for read-only debug/introspection surfaces. Entries are ordered according to underlying storage semantics.
Sourcefn override_priority(
&self,
task_id: TaskId,
priority: u32,
) -> Result<(), QueueError>
fn override_priority( &self, task_id: TaskId, priority: u32, ) -> Result<(), QueueError>
Update priority for all entries for a task.
Returns an error when the task has no queue rows.
Sourcefn leased_count_for_run(&self, run_id: RunId) -> usize
fn leased_count_for_run(&self, run_id: RunId) -> usize
Return the number of currently leased entries for a given run.
Sourcefn leased_count_for_class(&self, class: CommandClass) -> usize
fn leased_count_for_class(&self, class: CommandClass) -> usize
Return the number of currently leased entries for a given command class.
Sourcefn pending_count(&self) -> usize
fn pending_count(&self) -> usize
Return total pending entries.
Sourcefn cancel_for_run(&self, run_id: RunId) -> Result<usize, QueueError>
fn cancel_for_run(&self, run_id: RunId) -> Result<usize, QueueError>
Cancel all pending and leased entries for a given run.
Returns the number of entries cancelled. Used during run cancellation to drain stale queue rows that would otherwise starve concurrency caps.
Sourcefn cancel_stale_runs(
&self,
active_run_ids: &[RunId],
) -> Result<usize, QueueError>
fn cancel_stale_runs( &self, active_run_ids: &[RunId], ) -> Result<usize, QueueError>
Cancel all pending and leased entries NOT belonging to the given set of run IDs.
Used at scheduler startup to drain stale rows from prior crashed/cancelled runs. Returns the number of entries cancelled.