[pbs-devel] [RFC proxmox-backup] backup/backup_info: ignore vanished backup dirs during listing

Fabian Grünbichler f.gruenbichler at proxmox.com
Fri Jan 29 10:01:49 CET 2021


On January 28, 2021 1:26 pm, Dominik Csapak wrote:
> On 1/28/21 8:34 AM, Fabian Grünbichler wrote:
>> when looking at the call sites of list_backup_files, this seems wrong -
>> e.g. when listing a BackupGroup's backups, such a no-longer-existing
>> snapshot is now returned but has no files. when creating a new
>> BackupInfo from a BackupDir, or listing a BackupInfo's files, it returns
>> Ok but contains no files.
>> 
>> the decision whether to ignore such an error must be made at the call
>> sites of the call sites above, since in most cases I'd want to ignore
>> the snapshot and not just the file listing..
>> 
>> list_snapshot_files already throws an error if it can't read the
>> manifest, list_snapshots and list_groups seem to include it with no
>> files?
>> 
> 
> yeah you are right, we should probably catch this wider up in the call
> chain, but do we really want to downcast the anyhow errors wider up
> to nix errors? or do we want to have either an extra error type?
> or do we maybe want to make the return type an
> Result<Option<Vec<String>>, Error> to differentiate between
> 'no files' and 'vanished' ?

IMHO the correct thing would probably be a custom error or result type 
that we can match on directly higher up the stack - but that is a can of 
worms that we tried to avoid so far ;)

Result<Option<Vec<..>>> is not really readable without consulting the 
corresponding docs/code. we could have a 

ListFilesResult {
  Files(Vec<String>),
  Vanished,
  Err(...),
}

or (wrapped in a regular Result)

ListFilesResult {
  Files(Vec<String>),
  Vanished,
}

if we want to postpone thinking about custom error types even further ;) 
the latter would be kind of like your proposal but with more readable 
(and extensible) encoding of the "half-way" error state, and it could be 
re-used for other list files operations as well?

> 
>> On January 27, 2021 2:43 pm, Dominik Csapak wrote:
>>> this had the effect that that a snapshot listing errored out when called
>>> during a prune action
>>>
>>> we now ignore such errors and simply return no files
>>>
>>> also add some context for the error if one happens
>>>
>>> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
>>> ---
>>> maybe we also want to filter such snapshots out one level higher?
>>> so that we do not show 'empty' snapshots
>>>
>>>   src/backup/backup_info.rs | 28 ++++++++++++++++++++++------
>>>   1 file changed, 22 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/src/backup/backup_info.rs b/src/backup/backup_info.rs
>>> index 5ff1a6f8..dba3fea5 100644
>>> --- a/src/backup/backup_info.rs
>>> +++ b/src/backup/backup_info.rs
>>> @@ -1,4 +1,7 @@
>>> -use crate::tools;
>>> +use crate::tools::{
>>> +    self,
>>> +    fs::FileIterOps,
>>> +};
>>>   
>>>   use anyhow::{bail, format_err, Error};
>>>   use std::os::unix::io::RawFd;
>>> @@ -339,11 +342,24 @@ impl BackupInfo {
>>>   fn list_backup_files<P: ?Sized + nix::NixPath>(dirfd: RawFd, path: &P) -> Result<Vec<String>, Error> {
>>>       let mut files = vec![];
>>>   
>>> -    tools::scandir(dirfd, path, &BACKUP_FILE_REGEX, |_, filename, file_type| {
>>> -        if file_type != nix::dir::Type::File { return Ok(()); }
>>> -        files.push(filename.to_owned());
>>> -        Ok(())
>>> -    })?;
>>> +    match tools::fs::read_subdir(dirfd, path) {
>>> +        Ok(iter) => {
>>> +            for entry in iter.filter_file_name_regex(&BACKUP_FILE_REGEX) {
>>> +                let entry = entry?;
>>> +                let file_type = entry.file_type().ok_or_else(|| format_err!("unable to detect file type"))?;
>>> +                if file_type == nix::dir::Type::File {
>>> +                    // ok because we filtered with BACKUP_FILE_REGEX
>>> +                    let filename = unsafe { entry.file_name_utf8_unchecked() };
>>> +                    files.push(filename.to_owned());
>>> +                }
>>> +            }
>>> +        },
>>> +        Err(nix::Error::Sys(errno)) if errno == nix::errno::Errno::ENOENT => {
>>> +            // ignore vanished backup dirs
>>> +            eprintln!("backup dir vanished during listing");
>>> +        },
>>> +        Err(err) => bail!("error listing backup files: {}", err),
>>> +    }
>>>   
>>>       Ok(files)
>>>   }
>>> -- 
>>> 2.20.1
>>>
>>>
>>>
>>> _______________________________________________
>>> pbs-devel mailing list
>>> pbs-devel at lists.proxmox.com
>>> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
>>>
>>>
>>>
>> 
>> 
>> _______________________________________________
>> pbs-devel mailing list
>> pbs-devel at lists.proxmox.com
>> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
>> 
>> 
> 
> 
> 
> _______________________________________________
> 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