[pbs-devel] [PATCH proxmox-backup v5 3/4] partial fix #6049: datastore: use config fast-path in Drop
Samuel Rufinatscha
s.rufinatscha at proxmox.com
Fri Nov 28 12:10:03 CET 2025
On 11/28/25 11:46 AM, Fabian Grünbichler wrote:
> On November 28, 2025 10:03 am, Samuel Rufinatscha wrote:
>> On 11/26/25 4:15 PM, Fabian Grünbichler wrote:
>>> On November 24, 2025 6:04 pm, Samuel Rufinatscha wrote:
>>>> @@ -307,12 +332,12 @@ impl DatastoreThreadSettings {
>>>> /// - If the cached generation matches the current generation, the
>>>> /// cached config is returned.
>>>> /// - Otherwise the config is re-read from disk. If `update_cache` is
>>>> -/// `true`, the new config and current generation are stored in the
>>>> +/// `true`, the new config and bumped generation are stored in the
>>>> /// cache. Callers that set `update_cache = true` must hold the
>>>> /// datastore config lock to avoid racing with concurrent config
>>>> /// changes.
>>>> /// - If `update_cache` is `false`, the freshly read config is returned
>>>> -/// but the cache is left unchanged.
>>>> +/// but the cache and generation are left unchanged.
>>>> ///
>>>> /// If `ConfigVersionCache` is not available, the config is always read
>>>> /// from disk and `None` is returned as the generation.
>>>> @@ -333,14 +358,23 @@ fn datastore_section_config_cached(
>>>
>>> does this part here make any sense in this patch?
>>>
>>> we don't check the generation in the Drop handler anyway, so it will get
>>> the latest cached version, no matter what?
>>>
>>
>> we don't check the generation in the Drop handler, but the drop handler
>> depends on this to potentially get a most fresh cached version?
>
> datastore_section_config_cached will only reload the config if it was
> changed over our API and the generation in the cached entry does no
> longer match the current generation number. in that case there is no
> need to bump the generation number, since that was already done by
> whichever call saved the config and caused the generation number
> mismatch in the first place - this already invalidated all previously
> cached entries..
>
> bumping the generation number only makes sense once we introduce the
> force-reload mechanism in patch #4.
>
>>
>>> we'd only end up in this part of the code via lookup_datastore, and only
>>> if:
>>> - the previous cached entry and the current one have a different
>>> generation -> no need to bump again, the cache is already invalidated
>>> - there is no previous cached entry -> nothing to invalidate
>>>
>>> I think this part should move to the next patch..
>>
>> Shouldn't it be rather in PATCH 2 then, instead part of the TTL feature
>> Also I would adjust the comment below then, so that it doesn't
>> necessarily just benefit the drop handler that calls
>> datastore_section_config_cached(false) but would in general future uses
>> of datastore_section_config_cached(false)?
>
> it has no benefit at this point in the series (or after/at patch #2),
> see above. bumping only makes sense if we detect the generation number
> is not valid, which we can only do via the digest check from patch#4.
> and the digest check only makes sense with the TTL force-reload, because
> else we can never end up in the code path where we read the config
> without the cache already being invalid anyway.
>
Makes sense, I see. Thanks for clarifying Fabian!
Will add it to patch 4.
>>
>>>
>>>> let (config_raw, _digest) = pbs_config::datastore::config()?;
>>>> let config = Arc::new(config_raw);
>>>>
>>>> + let mut effective_gen = current_gen;
>>>> if update_cache {
>>>> + // Bump the generation. This ensures that Drop
>>>> + // handlers will detect that a newer config exists
>>>> + // and will not rely on a stale cached entry for
>>>> + // maintenance mandate.
>>>> + let prev_gen = version_cache.increase_datastore_generation();
>>>> + effective_gen = prev_gen + 1;
>>>> +
>>>> + // Persist
>>>> *config_cache = Some(DatastoreConfigCache {
>>>> config: config.clone(),
>>>> - last_generation: current_gen,
>>>> + last_generation: effective_gen,
>>>> });
>>>> }
>>>>
>>>> - Ok((config, Some(current_gen)))
>>>> + Ok((config, Some(effective_gen)))
>>>> } else {
>>>> // Fallback path, no config version cache: read datastore.cfg and return None as generation
>>>> *config_cache = None;
>>>> --
>>>> 2.47.3
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> 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