[pbs-devel] [PATCH proxmox-backup] client: catalog: improve error message for missing catalog

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue Jul 16 10:49:15 CEST 2024


> Christian Ebner <c.ebner at proxmox.com> hat am 15.07.2024 15:46 CEST geschrieben:
> 
>  
> Commit c0302805c "client: backup: conditionally write catalog for
> file level backups" drops encoding of the dedicated catalog when
> archives are encoded as split metadata/data archives with the
> `change-detection-mode` set to `data` or `metadata`.
> 
> Since the catalog is not present anymore, accessing these snapshots
> via the `proxmox-backup-client catalog` command is obsolete for these
> cases, one should opt for the `proxmox-backup-client mount` command
> to inspect these archives instead.
> 
> Improve the error message one gets when trying to access such
> snapshots by checking if the catalog is present in the manifest and if
> not, check if it contains a split pxar archive.
> 
> A caller now gets the following error message:
> 
> ```
> no catalog for split pxar archives, use `mount` instead to inspect content
> ```
> 
> instead of the rather generic
> 
> ```
> Unable to open dynamic index "/<snapshot-path>/catalog.pcat1.didx"
> - No such file or directory (os error 2)
> ```

alternatively, couldn't we adapt the CLI call like we did the API endpoint, and print a file listing using the metadata archive? mounting and then calling find seems a bit roundabout, if we can easily offer the information directly?

> Reported in the community forum:
> https://forum.proxmox.com/threads/150713/
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>  proxmox-backup-client/src/catalog.rs | 25 +++++++++++++++++++++++--
>  1 file changed, 23 insertions(+), 2 deletions(-)
> 
> diff --git a/proxmox-backup-client/src/catalog.rs b/proxmox-backup-client/src/catalog.rs
> index 276457c1d..7e3bdd4e9 100644
> --- a/proxmox-backup-client/src/catalog.rs
> +++ b/proxmox-backup-client/src/catalog.rs
> @@ -14,6 +14,7 @@ use pbs_client::tools::key_source::get_encryption_key_password;
>  use pbs_client::{BackupReader, RemoteChunkReader};
>  use pbs_tools::crypt_config::CryptConfig;
>  use pbs_tools::json::required_string_param;
> +use pbs_datastore::manifest::{BackupManifest, FileInfo};
>  
>  use crate::helper;
>  use crate::{
> @@ -24,6 +25,24 @@ use crate::{
>      IndexFile, Shell, CATALOG_NAME, KEYFD_SCHEMA, REPO_URL_SCHEMA,
>  };
>  
> +fn lookup_catalog_file_info(manifest: &BackupManifest) -> Result<&FileInfo, Error> {
> +    let file_info = match manifest.lookup_file_info(CATALOG_NAME) {
> +        Ok(file_info) => file_info,
> +        Err(err) => {
> +            for file_info in manifest.files() {
> +                if file_info.filename.ends_with(".mpxar.didx") {
> +                    bail!(
> +                        "no catalog for split pxar archives, use `mount` instead to inspect content"
> +                    );
> +                }
> +            }
> +            return Err(err);
> +        }
> +    };
> +
> +    Ok(file_info)
> +}
> +
>  #[api(
>     input: {
>          properties: {
> @@ -89,14 +108,14 @@ async fn dump_catalog(param: Value) -> Result<Value, Error> {
>      let (manifest, _) = client.download_manifest().await?;
>      manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?;
>  
> +    let file_info = lookup_catalog_file_info(&manifest)?;
> +
>      let index = client
>          .download_dynamic_index(&manifest, CATALOG_NAME)
>          .await?;
>  
>      let most_used = index.find_most_used_chunks(8);
>  
> -    let file_info = manifest.lookup_file_info(CATALOG_NAME)?;
> -
>      let chunk_reader = RemoteChunkReader::new(
>          client.clone(),
>          crypt_config,
> @@ -207,6 +226,8 @@ async fn catalog_shell(param: Value) -> Result<(), Error> {
>      let (manifest, _) = client.download_manifest().await?;
>      manifest.check_fingerprint(crypt_config.as_ref().map(Arc::as_ref))?;
>  
> +    lookup_catalog_file_info(&manifest)?;
> +
>      let decoder = helper::get_pxar_fuse_accessor(
>          &server_archive_name,
>          client.clone(),
> -- 
> 2.39.2
> 
> 
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel at lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel




More information about the pbs-devel mailing list