public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: Re: [pbs-devel] [PATCH v1 proxmox-backup 04/14] add do_verification_job function to verify.rs
Date: Thu, 1 Oct 2020 12:40:12 +0200	[thread overview]
Message-ID: <01c8a457-1ce9-da57-5cfc-d7085cc82c08@proxmox.com> (raw)
In-Reply-To: <20200925084330.75484-5-h.laimer@proxmox.com>

high-level: i am not sure i would put that code here

it makes the verify code even more intertwined with the worker-tasks
which is not something that is optimal (the verify code should have no
dependency on a worker task imho)

some comments inline

On 9/25/20 10:43 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
>   src/backup/verify.rs | 91 +++++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 90 insertions(+), 1 deletion(-)
> 
> diff --git a/src/backup/verify.rs b/src/backup/verify.rs
> index 1fad6187..1f54ebeb 100644
> --- a/src/backup/verify.rs
> +++ b/src/backup/verify.rs
> @@ -5,8 +5,10 @@ use std::time::Instant;
>   
>   use anyhow::{bail, format_err, Error};
>   
> -use crate::server::WorkerTask;
> +use crate::server::{WorkerTask, TaskState};
>   use crate::api2::types::*;
> +use crate::config::jobstate::Job;
> +use crate::config::verify::VerifyJobConfig;
>   
>   use super::{
>       DataStore, DataBlob, BackupGroup, BackupDir, BackupInfo, IndexFile,
> @@ -432,3 +434,90 @@ 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 {
> +        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 last verification failed we have to verify again since it might be fixed OR
> +                    // if outdated_after is None, verifications do not become outdated
> +                    verify.state == VerifyState::Failed || (verify_job.outdated_after.is_some()
> +                        && days_since_last_verify > verify_job.outdated_after.unwrap())

after talking some days ago with thomas, it may not be the best way to
try to re-verify failed backups so maybe we can simply drop this and 
only verify 'non-verified' backups


> +                } 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 mut failed_dirs: Vec<String> = Vec::new();
> +            for backup_info in backups_to_verify {
> +                match verify_backup_dir(
> +                    datastore.clone(),
> +                    &backup_info.backup_dir,
> +                    verified_chunks.clone(),
> +                    corrupt_chunks.clone(),
> +                    worker.clone(),
> +                ) {
> +                    Ok(false) => failed_dirs.push(backup_info.backup_dir.to_string()),
> +                    Err(err) => {
> +                        let endtime = proxmox::tools::time::epoch_i64();
> +                        job.finish(TaskState::Error {
> +                            message: err.to_string(),
> +                            endtime
> +                        })?;
> +                        bail!(err.to_string());

here you can use our 'try_block' macro, i would it do it like so:

let result = proxmox::try_block!({
   // basically the whole 'real' worker code
   // this can use '?'/bail to bubble up errors
});

// here goes only one regular job.finish call

> +                    },
> +                    _ => {}
> +                }
> +            }
> +            if !failed_dirs.is_empty() {
> +                worker.log("Failed to verify following snapshots:");
> +                for dir in failed_dirs {
> +                    worker.log(format!("\t{}", dir));
> +                }
> +                let endtime = proxmox::tools::time::epoch_i64();
> +                job.finish(TaskState::Error {
> +                    message: String::from("verification failed - please check the log for details"),
> +                    endtime
> +                })?;
> +                bail!("verification failed - please check the log for details");
> +            }
> +            let endtime = proxmox::tools::time::epoch_i64();
> +            job.finish(TaskState::OK { endtime })?;
> +            Ok(())
> +        })?;
> +
> +    Ok(upid_str)
> +}
> 





  reply	other threads:[~2020-10-01 10:40 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-25  8:43 [pbs-devel] [PATCH v1 proxmox-backup 00/14] add job based verify scheduling Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 01/14] add two new schemas for verify jobs Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 02/14] add verify job config Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 03/14] api2: add verify job config endpoint Hannes Laimer
2020-10-01 10:40   ` Dominik Csapak
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 04/14] add do_verification_job function to verify.rs Hannes Laimer
2020-10-01 10:40   ` Dominik Csapak [this message]
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 05/14] api2: add verify job admin endpoint Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 06/14] add scheduling for verify jobs Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 07/14] set a diffrent worker_type based on what is going to be verified(snapshot, group, ds) Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 08/14] ui: add verify job view Hannes Laimer
2020-10-01 10:40   ` Dominik Csapak
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 09/14] ui: add verify job edit window Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 10/14] ui: add task descriptions for the different types of verify(job, snapshot, group, ds) Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 11/14] remove verify_schedule field from DatastoreConfig Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 12/14] remove verify_schedule field from datastore config endpoint Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 13/14] remove verify-schedule field from DataStoreEdit and DataStoreConfig Hannes Laimer
2020-09-25  8:43 ` [pbs-devel] [PATCH v1 proxmox-backup 14/14] remove old verification scheduling from proxmox-backup-proxy.rs Hannes Laimer
2020-10-01 10:39 ` [pbs-devel] [PATCH v1 proxmox-backup 00/14] add job based verify scheduling Dominik Csapak
2020-10-01 12:21   ` Dietmar Maurer
2020-10-02  6:35     ` Dominik Csapak

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=01c8a457-1ce9-da57-5cfc-d7085cc82c08@proxmox.com \
    --to=d.csapak@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal