[pbs-devel] superseded: [PATCH proxmox-backup RFC 00/10] introduce typestate for datastore/chunkstore

Hannes Laimer h.laimer at proxmox.com
Mon May 26 16:18:34 CEST 2025


superseded by 
https://lore.proxmox.com/pbs-devel/20240903123401.91513-1-h.laimer@proxmox.com/

On 9/3/24 14:33, Hannes Laimer wrote:
> This patch series introduces two traits, CanRead and CanWrite, to define whether
> a datastore reference is readable, writable, or neither. Functions that read
> or write are now implemented in `impl<T: CanRead>` or `impl<T: CanWrite>` blocks, ensuring
> that they are only available to references that are supposed to read/write.
> 
> Motivation:
> Currently, we track the number of read/write references of a datastore but we don't
> track Lookup operations as they don't read or write, they still need a chunkstore, so
> eventhough they don't neccessarily directly do IO, they hold an open file handle.
> This is a problem for things like unmounting, currently lookup operations are only really
> short, so you'd need really unlucky timing to actually run into problems, but still,
> if a datastore is in "offline" maintenance mode, we shouldn't open filehandles on it.
> 
> By encoding state in the type:
> 1. We can assign non-readable/writable references for lookup operations.
> 2. The compiler ensures correct usage of references. Since it is easy to miss
>      what might happen a few function calls down the line, having the compiler
>      yell at you for easily missed things like this, is a really good thing
>      I think.
> 
> Changes:
> * Added CanRead and CanWrite traits.
> * Separated functions into impl<T: CanRead> or impl<T: CanWrite>.
> * Introduced three new datastore lookup functions that return concrete types implementing
>     CanRead, CanWrite, or neither.
> * Renamed lookup_datastore() to open_datastore() and made it private.
> 
> The main downside is needing separate datastore caches for read and write references due to
> concrete type requirements in the cache HashMap.
> 
> Almost all changes are either adding generics or moving functions into the appropriate
> trait implementations. The logic itself is only touched twice, once in datastore_lookup()
> and once check_privs_and_load_store() in /api/admin/datastore, this function now only checks
> the privs, the datastore opening happens in the endpoint function directly.
> 
>   
> 
> Hannes Laimer (10):
>    chunkstore: add CanRead and CanWrite trait
>    chunkstore: separate functions into impl block
>    datastore: add generics and new lookup functions
>    datastore: separate functions into impl block
>    backup_info: add generics and separate functions into impl blocks
>    pbs-datastore: add generics and separate functions into impl blocks
>    api: replace datastore_lookup with new, state-typed datastore
>      returning functions
>    server/bin: replace datastore_lookup with new, state-typed datastore
>      returning functions
>    api: add generics and separate functions into impl blocks
>    backup/server/tape: add generics and separate functions into impl
>      blocks
> 
>   pbs-datastore/src/backup_info.rs            |  179 +-
>   pbs-datastore/src/chunk_store.rs            |  228 ++-
>   pbs-datastore/src/datastore.rs              | 1688 ++++++++++---------
>   pbs-datastore/src/dynamic_index.rs          |   22 +-
>   pbs-datastore/src/fixed_index.rs            |   50 +-
>   pbs-datastore/src/hierarchy.rs              |   92 +-
>   pbs-datastore/src/local_chunk_reader.rs     |   13 +-
>   pbs-datastore/src/prune.rs                  |   19 +-
>   pbs-datastore/src/snapshot_reader.rs        |   30 +-
>   src/api2/admin/datastore.rs                 |  170 +-
>   src/api2/admin/namespace.rs                 |    8 +-
>   src/api2/backup/environment.rs              |  176 +-
>   src/api2/backup/mod.rs                      |   25 +-
>   src/api2/backup/upload_chunk.rs             |   19 +-
>   src/api2/reader/environment.rs              |   31 +-
>   src/api2/reader/mod.rs                      |    9 +-
>   src/api2/status.rs                          |    8 +-
>   src/api2/tape/backup.rs                     |   21 +-
>   src/api2/tape/drive.rs                      |    2 +-
>   src/api2/tape/restore.rs                    |   75 +-
>   src/backup/hierarchy.rs                     |   26 +-
>   src/backup/verify.rs                        |   53 +-
>   src/bin/proxmox-backup-proxy.rs             |    4 +-
>   src/server/gc_job.rs                        |    8 +-
>   src/server/prune_job.rs                     |    9 +-
>   src/server/pull.rs                          |   29 +-
>   src/server/verify_job.rs                    |    4 +-
>   src/tape/file_formats/snapshot_archive.rs   |    5 +-
>   src/tape/pool_writer/mod.rs                 |   11 +-
>   src/tape/pool_writer/new_chunks_iterator.rs |    7 +-
>   30 files changed, 1585 insertions(+), 1436 deletions(-)
> 





More information about the pbs-devel mailing list