Add reconcile loop scheduler (#69)
This commit was merged in pull request #69.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
//! arr — reconcile loop and process entry point. See DESIGN.md §8.
|
||||
|
||||
mod config;
|
||||
pub mod reconcile;
|
||||
mod web;
|
||||
|
||||
use std::process::ExitCode;
|
||||
@@ -11,6 +12,7 @@ use arr_compat::CompatState;
|
||||
use arr_db::Db;
|
||||
use arr_meta::TmdbClient;
|
||||
use config::Config;
|
||||
use reconcile::ReconcileLoop;
|
||||
use tower_http::trace::TraceLayer;
|
||||
|
||||
/// Dump the `OpenAPI` document and exit, instead of serving. `just gen-client`
|
||||
@@ -72,12 +74,15 @@ enum Error {
|
||||
},
|
||||
#[error("serve: {0}")]
|
||||
Serve(std::io::Error),
|
||||
#[error("reconcile task: {0}")]
|
||||
ReconcileTask(#[from] tokio::task::JoinError),
|
||||
}
|
||||
|
||||
async fn run() -> Result<(), Error> {
|
||||
let config = Config::load()?;
|
||||
let database = Db::connect(&config.database_path).await?;
|
||||
database.migrate().await?;
|
||||
let reconcile = ReconcileLoop::new(database.clone());
|
||||
|
||||
// Jellyseerr's Radarr shim (DESIGN.md §9.4) reads the same database and
|
||||
// needs its own TMDB client for `movie/lookup`.
|
||||
@@ -112,10 +117,30 @@ async fn run() -> Result<(), Error> {
|
||||
|
||||
tracing::info!(addr = %config.bind_addr, docs = arr_api::DOCS_PATH, "listening");
|
||||
|
||||
axum::serve(listener, app)
|
||||
.with_graceful_shutdown(shutdown())
|
||||
.await
|
||||
.map_err(Error::Serve)
|
||||
let (shutdown_tx, shutdown_rx) = tokio::sync::watch::channel(false);
|
||||
let mut reconcile_task = tokio::spawn(reconcile.run(shutdown_rx));
|
||||
let signal_tx = shutdown_tx.clone();
|
||||
let server = async move {
|
||||
axum::serve(listener, app)
|
||||
.with_graceful_shutdown(async move {
|
||||
shutdown().await;
|
||||
let _ = signal_tx.send(true);
|
||||
})
|
||||
.await
|
||||
};
|
||||
tokio::pin!(server);
|
||||
|
||||
tokio::select! {
|
||||
result = &mut server => {
|
||||
let _ = shutdown_tx.send(true);
|
||||
reconcile_task.await?;
|
||||
result.map_err(Error::Serve)
|
||||
}
|
||||
result = &mut reconcile_task => {
|
||||
result?;
|
||||
server.await.map_err(Error::Serve)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Stop accepting on Ctrl-C, or on the SIGTERM a service manager sends.
|
||||
|
||||
Reference in New Issue
Block a user