[pbs-devel] [PATCH v2 proxmox-backup 04/15] add do_verification_job function to verify.rs
Hannes Laimer
h.laimer at proxmox.com
Wed Oct 7 11:03:13 CEST 2020
Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
---
src/backup/verify.rs | 71 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index 0c55305f..517ecbb2 100644
--- a/src/backup/verify.rs
+++ b/src/backup/verify.rs
@@ -8,6 +8,8 @@ use anyhow::{bail, format_err, Error};
use crate::{
server::WorkerTask,
api2::types::*,
+ config::jobstate::Job,
+ config::verify::VerifyJobConfig,
tools::ParallelHandler,
backup::{
DataStore,
@@ -419,3 +421,72 @@ pub fn verify_all_backups(datastore: Arc<DataStore>, worker: Arc<WorkerTask>) ->
Ok(errors)
}
+
+/// Runs a verification job.
+pub fn do_verification_job(
+ mut job: Job,
+ verify_job: VerifyJobConfig,
+ userid: &Userid,
+ schedule: Option<String>,
+) -> Result<String, Error> {
+ let datastore = DataStore::lookup_datastore(&verify_job.store)?;
+ let mut backups_to_verify = BackupInfo::list_backups(&datastore.base_path())?;
+ if verify_job.ignore_verified.unwrap_or(true) {
+ backups_to_verify.retain(|backup_info| {
+ if let Ok((manifest, _)) = datastore.load_manifest(&backup_info.backup_dir) {
+ let verify = manifest.unprotected["verify_state"].clone();
+ if let Ok(verify) = serde_json::from_value::<SnapshotVerifyState>(verify) {
+ let days_since_last_verify =
+ (proxmox::tools::time::epoch_i64() - verify.upid.starttime) / 86400;
+ // if outdated_after is None, verifications do not become outdated
+ verify_job.outdated_after.is_some() && days_since_last_verify > verify_job.outdated_after.unwrap()
+ } else { true } // was never verified, therefore we always want to verify
+ } else { false } // manifest could not be loaded, do not verify in that case
+ })
+ }
+ let job_id = job.jobname().to_string();
+ let worker_type = job.jobtype().to_string();
+ let upid_str = WorkerTask::new_thread(
+ &worker_type,
+ Some(job.jobname().to_string()),
+ userid.clone(),
+ false,
+ move |worker| {
+ job.start(&worker.upid().to_string())?;
+ let verified_chunks = Arc::new(Mutex::new(HashSet::with_capacity(1024 * 16)));
+ let corrupt_chunks = Arc::new(Mutex::new(HashSet::with_capacity(64)));
+ worker.log(format!("Starting datastore verify job '{}'", job_id));
+ if let Some(event_str) = schedule {
+ worker.log(format!("task triggered by schedule '{}'", event_str));
+ }
+ let result = proxmox::try_block!({
+ let mut failed_dirs: Vec<String> = Vec::new();
+ for backup_info in backups_to_verify {
+ if let Ok(false) = verify_backup_dir(
+ datastore.clone(),
+ &backup_info.backup_dir,
+ verified_chunks.clone(),
+ corrupt_chunks.clone(),
+ worker.clone(),
+ ) { failed_dirs.push(backup_info.backup_dir.to_string()); }
+ }
+ if !failed_dirs.is_empty() {
+ worker.log("Failed to verify following snapshots:");
+ for dir in failed_dirs {
+ worker.log(format!("\t{}", dir));
+ }
+ bail!("verification failed - please check the log for details");
+ }
+ Ok(())
+ });
+
+ let status = worker.create_state(&result);
+
+ if let Err(err) = job.finish(status) {
+ eprintln!("could not finish job state for {}: {}", job.jobtype().to_string(), err);
+ }
+
+ result
+ })?;
+ Ok(upid_str)
+}
--
2.20.1
More information about the pbs-devel
mailing list