[pbs-devel] [PATCH proxmox-backup v2 1/2] fix #5439: allow to reuse existing datastore

Gabriel Goller g.goller at proxmox.com
Thu Jul 18 11:27:32 CEST 2024


On 15.07.2024 13:23, Fabian Grünbichler wrote:
>On July 12, 2024 1:57 pm, Gabriel Goller wrote:
>> On 10.07.2024 15:28, Fabian Grünbichler wrote:
>>>On June 12, 2024 3:22 pm, Gabriel Goller wrote:
>>>> Disallow creating datastores in non-empty directories. Allow adding
>>>> existing datastores via a 'reuse-datastore' checkmark. This only checks
>>>> if all the necessary directories (.chunks + subdirectories and .lock)
>>>> are existing and have the correct permissions, then opens the
>>>> datastore.
>>>>
>>>> Signed-off-by: Gabriel Goller <g.goller at proxmox.com>
>>>> ---
>>>>
>>>> v2, thanks @Fabian:
>>>>  - also check on frontend for root
>>>>  - forbid datastore creation if dir not empty
>>>>  - add reuse-datastore option
>>>>  - verify chunkstore directories permissions and owners
>>>>
>>>>  pbs-datastore/src/chunk_store.rs | 49 ++++++++++++++++++++++++++++-
>>>>  src/api2/config/datastore.rs     | 54 +++++++++++++++++++++++++-------
>>>>  src/api2/node/disks/directory.rs |  1 +
>>>>  src/api2/node/disks/zfs.rs       |  1 +
>>>>  4 files changed, 93 insertions(+), 12 deletions(-)
>>>>
>>>> diff --git a/pbs-datastore/src/chunk_store.rs b/pbs-datastore/src/chunk_store.rs
>>>> index 9f6289c9..077bc316 100644
>>>> --- a/pbs-datastore/src/chunk_store.rs
>>>> +++ b/pbs-datastore/src/chunk_store.rs
>>>> @@ -164,7 +164,7 @@ impl ChunkStore {
>>>>      /// Note that this must be used with care, as it's dangerous to create two instances on the
>>>>      /// same base path, as closing the underlying ProcessLocker drops all locks from this process
>>>>      /// on the lockfile (even if separate FDs)
>>>
>>>given this ^
>
>this part here was important ;)
>
>>>
>>>> -    pub(crate) fn open<P: Into<PathBuf>>(
>>>> +    pub fn open<P: Into<PathBuf>>(
>>>
>>>wouldn't it make more sense to split out the path checks and call them
>>>both in open and in verify_chunkstore below
>>
>> Why call them both in open and verify_chunkstore? create_datastore
>> always calls the verify method before open, so we could move this to
>> the verify function? I think I don't understand this correctly...
>
>see below..
>
>>>>          name: &str,
>>>>          base: P,
>>>>          sync_level: DatastoreFSyncLevel,
>>>> @@ -563,6 +563,53 @@ impl ChunkStore {
>>>>          // unwrap: only `None` in unit tests
>>>>          ProcessLocker::try_exclusive_lock(self.locker.clone().unwrap())
>>>>      }
>>
>>>> +
>>>>      let tuning: DatastoreTuning = serde_json::from_value(
>>>>          DatastoreTuning::API_SCHEMA
>>>>              .parse_property_string(datastore.tuning.as_deref().unwrap_or(""))?,
>>>>      )?;
>>>> -    let backup_user = pbs_config::backup_user()?;
>>>> -    let _store = ChunkStore::create(
>>>> -        &datastore.name,
>>>> -        path,
>>>> -        backup_user.uid,
>>>> -        backup_user.gid,
>>>> -        worker,
>>>> -        tuning.sync_level.unwrap_or_default(),
>>>> -    )?;
>>>> +
>>>> +    if !datastore_empty && !reuse_datastore {
>>>> +        bail!("Directory is not empty!");
>>>> +    } else if !datastore_empty && reuse_datastore {
>>>> +        ChunkStore::verify_chunkstore(&path)?;
>>>> +
>>>> +        let _store =
>>>> +            ChunkStore::open(&datastore.name, path, tuning.sync_level.unwrap_or_default())?;
>>>
>>>(continued from first comment above) and leave out this call here?
>
>this was the continuation ;) if we drop the open call here (to avoid
>side-effects via the process locker), then we need the path checks in
>verify *and* open. hope that makes sense now :)
>

Ooh, I think I got it...
So basically we could just call `ChunkStore::verify_chunkstore` in
`ChunkStore::open` and drop the `open` call above, right?

>>>
>>>> +    } else {
>>>> +        let backup_user = pbs_config::backup_user()?;
>>>> +        let _store = ChunkStore::create(
>>>> +            &datastore.name,
>>>> +            path,
>>>> +            backup_user.uid,
>>>> +            backup_user.gid,
>>>> +            worker,
>>>> +            tuning.sync_level.unwrap_or_default(),
>>>> +        )?;
>>>> +    }
>
>
>_______________________________________________
>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