]> git.proxmox.com Git - proxmox-backup.git/blob - src/server/gc_job.rs
proxy: split out code to run garbage collection job
[proxmox-backup.git] / src / server / gc_job.rs
1 use std::sync::Arc;
2 use anyhow::Error;
3
4 use crate::{
5 server::WorkerTask,
6 api2::types::*,
7 server::jobstate::Job,
8 backup::DataStore,
9 };
10
11 /// Runs a garbage collection job.
12 pub fn do_garbage_collection_job(
13 mut job: Job,
14 datastore: Arc<DataStore>,
15 auth_id: &Authid,
16 schedule: Option<String>,
17 ) -> Result<String, Error> {
18
19 let email = crate::server::lookup_user_email(auth_id.user());
20
21 let store = datastore.name().to_string();
22
23 let worker_type = job.jobtype().to_string();
24 let upid_str = WorkerTask::new_thread(
25 &worker_type,
26 Some(store.clone()),
27 auth_id.clone(),
28 false,
29 move |worker| {
30 job.start(&worker.upid().to_string())?;
31
32 worker.log(format!("starting garbage collection on store {}", store));
33 if let Some(event_str) = schedule {
34 worker.log(format!("task triggered by schedule '{}'", event_str));
35 }
36
37 let result = datastore.garbage_collection(&*worker, worker.upid());
38
39 let status = worker.create_state(&result);
40
41 match job.finish(status) {
42 Err(err) => eprintln!(
43 "could not finish job state for {}: {}",
44 job.jobtype().to_string(),
45 err
46 ),
47 Ok(_) => (),
48 }
49
50 if let Some(email) = email {
51 let gc_status = datastore.last_gc_status();
52 if let Err(err) = crate::server::send_gc_status(&email, &store, &gc_status, &result) {
53 eprintln!("send gc notification failed: {}", err);
54 }
55 }
56
57 result
58 }
59 )?;
60
61 Ok(upid_str)
62 }