فهرست منبع

Handle tokio task failure case

Mauricio Cassola 2 سال پیش
والد
کامیت
d5741bf8e1
1فایلهای تغییر یافته به همراه22 افزوده شده و 7 حذف شده
  1. 22 7
      src/main.rs

+ 22 - 7
src/main.rs

@@ -243,15 +243,30 @@ async fn run_server(addr: SocketAddr) -> anyhow::Result<()> {
     // spawning a background task that will run the scheduled jobs
     // every JOB_PROCESSING_CADENCE_IN_SECS
     task::spawn(async move {
-        let pool = db::ClientPool::new();
-
         loop {
-            db::run_scheduled_jobs(&*pool.get().await)
-                .await
-                .context("run database scheduled jobs")
-                .unwrap();
+            let res = task::spawn(async move {
+                let pool = db::ClientPool::new();
+
+                loop {
+                    db::run_scheduled_jobs(&*pool.get().await)
+                        .await
+                        .context("run database scheduled jobs")
+                        .unwrap();
 
-            sleep(Duration::from_secs(JOB_PROCESSING_CADENCE_IN_SECS)).await;
+                    sleep(Duration::from_secs(JOB_PROCESSING_CADENCE_IN_SECS)).await;
+                }
+            });
+
+            match res.await {
+                Err(err) if err.is_panic() => {
+                    /* handle panic in above task, re-launching */
+                    tracing::trace!("run_scheduled_jobs task died (error={})", err);
+                }
+                _ => {
+                    /* break in other case by default */
+                    break;
+                }
+            }
         }
     });