]> git.proxmox.com Git - proxmox-backup.git/commitdiff
proxy: split out code to run garbage collection job
authorDietmar Maurer <dietmar@proxmox.com>
Fri, 30 Oct 2020 09:54:31 +0000 (10:54 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 30 Oct 2020 10:01:45 +0000 (11:01 +0100)
src/bin/proxmox-backup-proxy.rs
src/server.rs
src/server/gc_job.rs [new file with mode: 0644]

index 745961b7fd0cfc95512247f145df5e247292e038..329d7f577044d7720a538831c81a0c864176e398 100644 (file)
@@ -248,8 +248,6 @@ async fn schedule_datastore_garbage_collection() {
         },
     };
 
-    let email = server::lookup_user_email(Userid::root_userid());
-
     let config = match datastore::config() {
         Err(err) => {
             eprintln!("unable to read datastore config - {}", err);
@@ -329,39 +327,10 @@ async fn schedule_datastore_garbage_collection() {
             Err(_) => continue, // could not get lock
         };
 
-        let store2 = store.clone();
-        let email2 = email.clone();
-
-        if let Err(err) = WorkerTask::new_thread(
-            worker_type,
-            Some(store.clone()),
-            Authid::backup_auth_id().clone(),
-            false,
-            move |worker| {
-                job.start(&worker.upid().to_string())?;
-
-                worker.log(format!("starting garbage collection on store {}", store));
-                worker.log(format!("task triggered by schedule '{}'", event_str));
+        let auth_id = Authid::backup_auth_id();
 
-                let result = datastore.garbage_collection(&*worker, worker.upid());
-
-                let status = worker.create_state(&result);
-
-                if let Err(err) = job.finish(status) {
-                    eprintln!("could not finish job state for {}: {}", worker_type, err);
-                }
-
-                if let Some(email2) = email2 {
-                    let gc_status = datastore.last_gc_status();
-                    if let Err(err) = crate::server::send_gc_status(&email2, datastore.name(), &gc_status, &result) {
-                        eprintln!("send gc notification failed: {}", err);
-                    }
-                }
-
-                result
-            }
-        ) {
-            eprintln!("unable to start garbage collection on store {} - {}", store2, err);
+        if let Err(err) = crate::server::do_garbage_collection_job(job, datastore, auth_id, Some(event_str)) {
+            eprintln!("unable to start garbage collection job on datastore {} - {}", store, err);
         }
     }
 }
index eddff72209d947cb2ac7af157269225254b3cd20..f0db500e2c0d3e4c181e919adc4744357d6baea1 100644 (file)
@@ -38,5 +38,8 @@ pub use verify_job::*;
 mod prune_job;
 pub use prune_job::*;
 
+mod gc_job;
+pub use gc_job::*;
+
 mod email_notifications;
 pub use email_notifications::*;
diff --git a/src/server/gc_job.rs b/src/server/gc_job.rs
new file mode 100644 (file)
index 0000000..dabbb23
--- /dev/null
@@ -0,0 +1,62 @@
+use std::sync::Arc;
+use anyhow::Error;
+
+use crate::{
+    server::WorkerTask,
+    api2::types::*,
+    server::jobstate::Job,
+    backup::DataStore,
+};
+
+/// Runs a garbage collection job.
+pub fn do_garbage_collection_job(
+    mut job: Job,
+    datastore: Arc<DataStore>,
+    auth_id: &Authid,
+    schedule: Option<String>,
+) -> Result<String, Error> {
+
+    let email = crate::server::lookup_user_email(auth_id.user());
+
+    let store = datastore.name().to_string();
+
+    let worker_type = job.jobtype().to_string();
+    let upid_str = WorkerTask::new_thread(
+        &worker_type,
+        Some(store.clone()),
+        auth_id.clone(),
+        false,
+        move |worker| {
+            job.start(&worker.upid().to_string())?;
+
+            worker.log(format!("starting garbage collection on store {}", store));
+            if let Some(event_str) = schedule {
+                worker.log(format!("task triggered by schedule '{}'", event_str));
+            }
+
+            let result = datastore.garbage_collection(&*worker, worker.upid());
+
+            let status = worker.create_state(&result);
+
+            match job.finish(status) {
+                Err(err) => eprintln!(
+                    "could not finish job state for {}: {}",
+                    job.jobtype().to_string(),
+                    err
+                ),
+                Ok(_) => (),
+            }
+
+            if let Some(email) = email {
+                let gc_status = datastore.last_gc_status();
+                if let Err(err) = crate::server::send_gc_status(&email, &store, &gc_status, &result) {
+                    eprintln!("send gc notification failed: {}", err);
+                }
+            }
+
+            result
+        }
+    )?;
+
+    Ok(upid_str)
+}