[pbs-devel] [PATCH v6 proxmox-backup 43/65] specs: add backup detection mode specification

Dominik Csapak d.csapak at proxmox.com
Wed May 22 15:07:38 CEST 2024


instead of using a string + regex + parsing, would it not be possible to
use the #[api] macro  + serialize/deserialize derive on the enum instead?

that way we could just use that type in the api
and the docs would be a bit nicer (instead of saying <string> it would
be telling us the enum variants)

then you also wouldn't need the regex + StringSchema etc. since the
serde serialization should take care of that

On 5/14/24 12:33, Christian Ebner wrote:
> Adds the specification for switching the detection mode used to
> identify regular files which changed since a reference backup run.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>   pbs-client/src/backup_specification.rs | 44 ++++++++++++++++++++++++++
>   1 file changed, 44 insertions(+)
> 
> diff --git a/pbs-client/src/backup_specification.rs b/pbs-client/src/backup_specification.rs
> index 619a3a9da..b6b0f5199 100644
> --- a/pbs-client/src/backup_specification.rs
> +++ b/pbs-client/src/backup_specification.rs
> @@ -4,6 +4,7 @@ use proxmox_schema::*;
>   
>   const_regex! {
>       BACKUPSPEC_REGEX = r"^([a-zA-Z0-9_-]+\.(pxar|img|conf|log)):(.+)$";
> +    DETECTION_MODE_REGEX = r"^(default|data|metadata)$";
>   }
>   
>   pub const BACKUP_SOURCE_SCHEMA: Schema =
> @@ -11,6 +12,11 @@ pub const BACKUP_SOURCE_SCHEMA: Schema =
>           .format(&ApiStringFormat::Pattern(&BACKUPSPEC_REGEX))
>           .schema();
>   
> +pub const BACKUP_DETECTION_MODE_SPEC: Schema =
> +    StringSchema::new("Backup detection mode specification (default|data|metadata).")
> +        .format(&ApiStringFormat::Pattern(&DETECTION_MODE_REGEX))
> +        .schema();
> +
>   pub enum BackupSpecificationType {
>       PXAR,
>       IMAGE,
> @@ -45,3 +51,41 @@ pub fn parse_backup_specification(value: &str) -> Result<BackupSpecification, Er
>   
>       bail!("unable to parse backup source specification '{}'", value);
>   }
> +
> +/// Mode to detect file changes since last backup run
> +pub enum BackupDetectionMode {
> +    /// Encode backup as self contained pxar archive
> +    Default,
> +    /// Split backup mode, re-encode payload data
> +    Data,
> +    /// Compare metadata, reuse payload chunks if metadata unchanged
> +    Metadata,
> +}
> +
> +impl BackupDetectionMode {
> +    /// Selected mode is data based file change detection with split meta/payload streams
> +    pub fn is_data(&self) -> bool {
> +        matches!(self, Self::Data)
> +    }
> +    /// Selected mode is metadata based file change detection
> +    pub fn is_metadata(&self) -> bool {
> +        matches!(self, Self::Metadata)
> +    }
> +}
> +
> +pub fn parse_backup_detection_mode_specification(
> +    value: &str,
> +) -> Result<BackupDetectionMode, Error> {
> +    match (DETECTION_MODE_REGEX.regex_obj)().captures(value) {
> +        Some(caps) => {
> +            let mode = match caps.get(1).unwrap().as_str() {
> +                "default" => BackupDetectionMode::Default,
> +                "data" => BackupDetectionMode::Data,
> +                "metadata" => BackupDetectionMode::Metadata,
> +                _ => bail!("invalid backup detection mode"),
> +            };
> +            Ok(mode)
> +        }
> +        None => bail!("unable to parse backup detection mode specification '{value}'"),
> +    }
> +}





More information about the pbs-devel mailing list