fix(r2-02): options-generation in the pipeline cache key — stale respawn re-cache unreachable (01/S-7, 03/S13)
This commit is contained in:
@@ -69,23 +69,35 @@ public sealed class DriverResiliencePipelineBuilder
|
||||
/// </param>
|
||||
/// <param name="capability">Which capability surface is being called.</param>
|
||||
/// <param name="options">Per-driver-instance options (tier + per-capability overrides).</param>
|
||||
/// <param name="optionsGeneration">
|
||||
/// Monotonic options epoch stamped by <see cref="DriverCapabilityInvokerFactory"/> per invoker
|
||||
/// (01/S-7). Part of the cache key so a lingering old child's post-invalidate re-cache lands under
|
||||
/// its OWN (old) generation — a key the new invoker's generation never reads. Defaults to 0 so
|
||||
/// every existing caller/test compiles unchanged.
|
||||
/// </param>
|
||||
/// <returns>The cached or newly built resilience pipeline for the key.</returns>
|
||||
public ResiliencePipeline GetOrCreate(
|
||||
string driverInstanceId,
|
||||
string hostName,
|
||||
DriverCapability capability,
|
||||
DriverResilienceOptions options)
|
||||
DriverResilienceOptions options,
|
||||
long optionsGeneration = 0)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(options);
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(hostName);
|
||||
|
||||
var key = new PipelineKey(driverInstanceId, hostName, capability);
|
||||
var key = new PipelineKey(driverInstanceId, hostName, capability, optionsGeneration);
|
||||
return _pipelines.GetOrAdd(key, static (k, state) => Build(
|
||||
k.DriverInstanceId, k.HostName, state.capability, state.options, state.timeProvider, state.tracker, state.logger),
|
||||
(capability, options, timeProvider: _timeProvider, tracker: _statusTracker, logger: _logger));
|
||||
}
|
||||
|
||||
/// <summary>Drop cached pipelines for one driver instance (e.g. on ResilienceConfig change). Test + Admin-reload use.</summary>
|
||||
/// <summary>
|
||||
/// Drop cached pipelines for one driver instance (e.g. on ResilienceConfig change), across ALL
|
||||
/// option generations. With generation-keyed entries (01/S-7) correctness no longer depends on this
|
||||
/// sweep — a stale-epoch re-cache is already unreachable by the new generation — but it bounds the
|
||||
/// cache by clearing lingering old-generation entries on the next respawn. Test + Admin-reload use.
|
||||
/// </summary>
|
||||
/// <param name="driverInstanceId">The driver instance ID whose pipelines should be invalidated.</param>
|
||||
/// <returns>The number of pipelines removed.</returns>
|
||||
public int Invalidate(string driverInstanceId)
|
||||
@@ -188,5 +200,5 @@ public sealed class DriverResiliencePipelineBuilder
|
||||
return builder.Build();
|
||||
}
|
||||
|
||||
private readonly record struct PipelineKey(string DriverInstanceId, string HostName, DriverCapability Capability);
|
||||
private readonly record struct PipelineKey(string DriverInstanceId, string HostName, DriverCapability Capability, long Generation);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user