]>
Commit | Line | Data |
---|---|---|
a4915dfc | 1 | use anyhow::{format_err, Error}; |
acc3d9df | 2 | |
c23192d3 | 3 | use pbs_datastore::task_log; |
e3619d41 | 4 | use pbs_api_types::{Authid, VerificationJobConfig}; |
c23192d3 | 5 | |
acc3d9df DM |
6 | use crate::{ |
7 | server::WorkerTask, | |
acc3d9df | 8 | server::jobstate::Job, |
acc3d9df DM |
9 | backup::{ |
10 | DataStore, | |
037e6c0c | 11 | verify_filter, |
a4915dfc | 12 | verify_all_backups, |
acc3d9df | 13 | }, |
acc3d9df DM |
14 | }; |
15 | ||
16 | /// Runs a verification job. | |
17 | pub fn do_verification_job( | |
18 | mut job: Job, | |
19 | verification_job: VerificationJobConfig, | |
e6dc35ac | 20 | auth_id: &Authid, |
acc3d9df DM |
21 | schedule: Option<String>, |
22 | ) -> Result<String, Error> { | |
a4915dfc | 23 | |
acc3d9df DM |
24 | let datastore = DataStore::lookup_datastore(&verification_job.store)?; |
25 | ||
44288184 | 26 | let outdated_after = verification_job.outdated_after; |
b4b14dc1 | 27 | let ignore_verified_snapshots = verification_job.ignore_verified.unwrap_or(true); |
a4915dfc | 28 | |
f47c1d3a | 29 | let (email, notify) = crate::server::lookup_datastore_notify_settings(&verification_job.store); |
b9e7bcc2 | 30 | |
dbd45a72 FG |
31 | let job_id = format!("{}:{}", |
32 | &verification_job.store, | |
33 | job.jobname()); | |
acc3d9df DM |
34 | let worker_type = job.jobtype().to_string(); |
35 | let upid_str = WorkerTask::new_thread( | |
36 | &worker_type, | |
dbd45a72 | 37 | Some(job_id.clone()), |
e6dc35ac | 38 | auth_id.clone(), |
acc3d9df DM |
39 | false, |
40 | move |worker| { | |
41 | job.start(&worker.upid().to_string())?; | |
42 | ||
43 | task_log!(worker,"Starting datastore verify job '{}'", job_id); | |
acc3d9df DM |
44 | if let Some(event_str) = schedule { |
45 | task_log!(worker,"task triggered by schedule '{}'", event_str); | |
46 | } | |
47 | ||
9c26a3d6 | 48 | let verify_worker = crate::backup::VerifyWorker::new(worker.clone(), datastore); |
037e6c0c HL |
49 | let result = verify_all_backups( |
50 | &verify_worker, | |
51 | worker.upid(), | |
52 | None, | |
53 | Some(&move |manifest| { | |
54 | verify_filter(ignore_verified_snapshots, outdated_after, manifest) | |
55 | }), | |
56 | ); | |
a4915dfc | 57 | let job_result = match result { |
a4fa3fc2 FG |
58 | Ok(ref failed_dirs) if failed_dirs.is_empty() => Ok(()), |
59 | Ok(ref failed_dirs) => { | |
60 | worker.log("Failed to verify the following snapshots/groups:"); | |
61 | for dir in failed_dirs { | |
62 | worker.log(format!("\t{}", dir)); | |
63 | } | |
64 | ||
65 | Err(format_err!("verification failed - please check the log for details")) | |
66 | }, | |
a4915dfc DM |
67 | Err(_) => Err(format_err!("verification failed - job aborted")), |
68 | }; | |
acc3d9df | 69 | |
a4915dfc | 70 | let status = worker.create_state(&job_result); |
acc3d9df | 71 | |
b92cad09 FG |
72 | if let Err(err) = job.finish(status) { |
73 | eprintln!( | |
acc3d9df DM |
74 | "could not finish job state for {}: {}", |
75 | job.jobtype().to_string(), | |
76 | err | |
b92cad09 | 77 | ); |
acc3d9df DM |
78 | } |
79 | ||
b9e7bcc2 | 80 | if let Some(email) = email { |
f47c1d3a | 81 | if let Err(err) = crate::server::send_verify_status(&email, notify, verification_job, &result) { |
b9e7bcc2 DM |
82 | eprintln!("send verify notification failed: {}", err); |
83 | } | |
84 | } | |
85 | ||
a4915dfc | 86 | job_result |
acc3d9df DM |
87 | }, |
88 | )?; | |
89 | Ok(upid_str) | |
90 | } |