From: Hannes Laimer <h.laimer@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH v3 proxmox-backup 04/14] add do_verification_job function to verify.rs
Date: Tue, 13 Oct 2020 11:32:59 +0200 [thread overview]
Message-ID: <20201013093309.14917-5-h.laimer@proxmox.com> (raw)
In-Reply-To: <20201013093309.14917-1-h.laimer@proxmox.com>
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
src/backup/verify.rs | 94 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index 0c55305f..fc711d54 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::VerificationJobConfig,
tools::ParallelHandler,
backup::{
DataStore,
@@ -419,3 +421,95 @@ 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,
+ verification_job: VerificationJobConfig,
+ userid: &Userid,
+ schedule: Option<String>,
+) -> Result<String, Error> {
+ let datastore = DataStore::lookup_datastore(&verification_job.store)?;
+
+ let mut backups_to_verify = BackupInfo::list_backups(&datastore.base_path())?;
+ if verification_job.ignore_verified.unwrap_or(true) {
+ backups_to_verify.retain(|backup_info| {
+ let manifest = match datastore.load_manifest(&backup_info.backup_dir) {
+ Ok((manifest, _)) => manifest,
+ Err(_) => return false,
+ };
+
+ let raw_verify_state = manifest.unprotected["verify_state"].clone();
+ let last_state = match serde_json::from_value::<SnapshotVerifyState>(raw_verify_state) {
+ Ok(last_state) => last_state,
+ Err(_) => return true,
+ };
+
+ let now = proxmox::tools::time::epoch_i64();
+ let days_since_last_verify = (now - last_state.upid.starttime) / 86400;
+ verification_job.outdated_after.is_some()
+ && days_since_last_verify > verification_job.outdated_after.unwrap()
+ })
+ }
+
+ 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())?;
+
+ worker.log(format!("Starting datastore verify job '{}'", job_id));
+ worker.log(format!("verifying {} backups", backups_to_verify.len()));
+ if let Some(event_str) = schedule {
+ worker.log(format!("task triggered by schedule '{}'", event_str));
+ }
+
+ let verified_chunks = Arc::new(Mutex::new(HashSet::with_capacity(1024 * 16)));
+ let corrupt_chunks = Arc::new(Mutex::new(HashSet::with_capacity(64)));
+ let result = proxmox::try_block!({
+ let mut failed_dirs: Vec<String> = Vec::new();
+
+ for backup_info in backups_to_verify {
+ let verification_result = verify_backup_dir(
+ datastore.clone(),
+ &backup_info.backup_dir,
+ verified_chunks.clone(),
+ corrupt_chunks.clone(),
+ worker.clone(),
+ );
+
+ if let Ok(false) = verification_result {
+ failed_dirs.push(backup_info.backup_dir.to_string());
+ } // otherwise successful or aborted
+ }
+
+ 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);
+
+ match job.finish(status) {
+ Err(err) => eprintln!(
+ "could not finish job state for {}: {}",
+ job.jobtype().to_string(),
+ err
+ ),
+ Ok(_) => (),
+ }
+
+ result
+ },
+ )?;
+ Ok(upid_str)
+}
--
2.20.1
next prev parent reply other threads:[~2020-10-13 9:33 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-13 9:32 [pbs-devel] [PATCH v3 proxmox-backup 00/14] add job based verify scheduling Hannes Laimer
2020-10-13 9:32 ` [pbs-devel] [PATCH v3 proxmox-backup 01/14] add two new schemas for verification jobs Hannes Laimer
2020-10-15 16:13 ` Thomas Lamprecht
2020-10-13 9:32 ` [pbs-devel] [PATCH v3 proxmox-backup 02/14] add verification job config Hannes Laimer
2020-10-13 9:32 ` [pbs-devel] [PATCH v3 proxmox-backup 03/14] api2: add verify job config endpoint Hannes Laimer
2020-10-13 9:32 ` Hannes Laimer [this message]
2020-10-15 16:15 ` [pbs-devel] [PATCH v3 proxmox-backup 04/14] add do_verification_job function to verify.rs Thomas Lamprecht
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 05/14] api2: add verification job admin endpoint Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 06/14] add scheduling for verification jobs Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 07/14] set a diffrent worker_type based on what is going to be verified(snapshot, group, ds) Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 08/14] ui: add verification job view Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 09/14] ui: add verification job edit window Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 10/14] ui: add task descriptions for the different types of verification(job, snapshpt, group, ds) Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 11/14] remove verify_schedule field from datastore config endpoint Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 12/14] remove verify_schedule field from DatastoreConfig Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 13/14] remove verify-schedule field from DataStoreEdit and DataStoreConfig Hannes Laimer
2020-10-13 9:33 ` [pbs-devel] [PATCH v3 proxmox-backup 14/14] remove old verification scheduling from proxmox-backup-proxy.rs Hannes Laimer
2020-10-15 16:18 ` Thomas Lamprecht
2020-10-14 11:55 ` [pbs-devel] [PATCH v3 proxmox-backup 00/14] add job based verify scheduling Wolfgang Bumiller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201013093309.14917-5-h.laimer@proxmox.com \
--to=h.laimer@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.