use std::sync::Arc;
use deadpool::managed::{Manager, Metrics, RecycleResult};
use crate::config::DaemonServer;
use crate::error::Error;
use crate::job::Job;
pub struct JobManager {
server: Arc<DaemonServer>,
registry: Arc<crate::pool::routing::Registry>,
}
impl JobManager {
#[allow(private_interfaces)]
#[must_use]
pub fn new(server: Arc<DaemonServer>, registry: Arc<crate::pool::routing::Registry>) -> Self {
Self { server, registry }
}
}
impl Manager for JobManager {
type Type = Arc<Job>;
type Error = Error;
async fn create(&self) -> Result<Arc<Job>, Error> {
let job = Arc::new(Job::connect(&self.server).await?);
self.registry.track(&job);
#[cfg(feature = "metrics")]
metrics::counter!(crate::observability::POOL_CREATE_TOTAL).increment(1);
Ok(job)
}
async fn recycle(&self, job: &mut Arc<Job>, _: &Metrics) -> RecycleResult<Error> {
use deadpool::managed::RecycleError;
match job.ping().await {
Ok(_) => {
#[cfg(feature = "metrics")]
metrics::counter!(crate::observability::POOL_RECYCLE_SUCCESS_TOTAL).increment(1);
Ok(())
}
Err(e) => {
#[cfg(feature = "metrics")]
metrics::counter!(crate::observability::POOL_RECYCLE_FAIL_TOTAL).increment(1);
Err(RecycleError::Backend(e))
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn assert_manager<M: Manager>() {}
#[test]
fn jobmanager_satisfies_manager_trait() {
assert_manager::<JobManager>();
}
}