From f92c44ab59ef92d6ccb0a740107618abbbb75fcb Mon Sep 17 00:00:00 2001 From: Luc Perkins Date: Mon, 20 May 2024 07:16:32 -0300 Subject: [PATCH] Spawn daemon in separate process (this should fail in CI) --- .github/workflows/build.yaml | 4 ++-- magic-nix-cache/src/main.rs | 26 ++++++++++++++++---------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 32403b5..b292cc3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -41,8 +41,8 @@ jobs: - name: Build package and create closure for ${{ matrix.systems.system }} run: | - nix build .# -L --fallback && \ - nix-store --export $(nix-store -qR ./result) | xz -9 > "${{ env.ARCHIVE_NAME }}" + nix build .# -L --fallback + nix-store --export $(nix-store -qR ./result) | xz -9 > "${{ env.ARCHIVE_NAME }}" - name: Upload magic-nix-cache closure for ${{ matrix.systems.system }} uses: actions/upload-artifact@v3.1.2 diff --git a/magic-nix-cache/src/main.rs b/magic-nix-cache/src/main.rs index e0af249..fb97e3c 100644 --- a/magic-nix-cache/src/main.rs +++ b/magic-nix-cache/src/main.rs @@ -26,6 +26,7 @@ use std::io::Write; use std::net::SocketAddr; use std::os::unix::fs::PermissionsExt; use std::path::{Path, PathBuf}; +use std::process::exit; use std::sync::Arc; use ::attic::nix_store::NixStore; @@ -370,6 +371,21 @@ async fn main_cli() -> Result<()> { tracing::info!("Listening on {}", args.listen); + let server = axum::Server::bind(&args.listen) + .serve(app.into_make_service()) + .with_graceful_shutdown(async move { + shutdown_receiver.await.ok(); + tracing::info!("Shutting down"); + }); + + // Spawn here so that post-startup tasks can proceed + tokio::spawn(async move { + if let Err(e) = server.await { + tracing::error!("failed to start up daemon: {e}"); + exit(1); + } + }); + // Notify of startup via HTTP if let Some(startup_notification_url) = args.startup_notification_url { tracing::debug!("Startup notification via HTTP POST to {startup_notification_url}"); @@ -411,21 +427,11 @@ async fn main_cli() -> Result<()> { tracing::debug!("Created startup notification file at {startup_notification_file_path:?}"); } - let ret = axum::Server::bind(&args.listen) - .serve(app.into_make_service()) - .with_graceful_shutdown(async move { - shutdown_receiver.await.ok(); - tracing::info!("Shutting down"); - }) - .await; - // Notify diagnostics endpoint if let Some(diagnostic_endpoint) = diagnostic_endpoint { state.metrics.send(diagnostic_endpoint).await; } - ret?; - Ok(()) }