graphile_worker 0.13.6

High performance Rust/PostgreSQL job queue (also suitable for getting jobs generated by PostgreSQL triggers/functions out into a different work queue)
Documentation
use std::sync::atomic::Ordering;

use graphile_worker_lifecycle_hooks::{LocalQueueMode, LocalQueueSetModeContext};
use tracing::trace;

use super::super::LocalQueue;

impl LocalQueue {
    /// Emits genuine mode transitions while preventing a released queue restarting.
    pub(in crate::local_queue) async fn set_mode(&self, new_mode: LocalQueueMode) {
        let mut mode = self.0.mode.write().await;
        let old_mode = *mode;
        if old_mode == new_mode
            || old_mode == LocalQueueMode::Released
            || (old_mode == LocalQueueMode::TtlExpired
                && new_mode == LocalQueueMode::Polling
                && !self.0.ttl_return_complete.load(Ordering::Acquire))
        {
            return;
        }
        trace!(?old_mode, ?new_mode, "LocalQueue mode transition");
        *mode = new_mode;
        drop(mode);

        self.0
            .hooks
            .emit(LocalQueueSetModeContext {
                worker_id: self.0.worker_id.clone(),
                old_mode,
                new_mode,
            })
            .await;

        self.0.state_notify.notify_waiters();
    }
}