fix(r2-02): non-idempotent write arm — cache the no-retry snapshot (01/P-4) and record tracker in-flight accounting (S-8 residual)
This commit is contained in:
@@ -188,6 +188,53 @@ public sealed class CapabilityInvokerTests
|
||||
"ExecuteWriteAsync's non-idempotent branch must capture the options snapshot exactly once per call");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// S-8 residual: the non-idempotent write arm must record tracker in-flight accounting (start +
|
||||
/// complete) on the caller's host, exactly like the idempotent arms — the previous arm skipped it.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task NonIdempotentWrite_RecordsTrackerStartAndComplete()
|
||||
{
|
||||
var tracker = new DriverResilienceStatusTracker();
|
||||
var invoker = new CapabilityInvoker(
|
||||
new DriverResiliencePipelineBuilder(),
|
||||
"drv-test",
|
||||
() => new DriverResilienceOptions { Tier = DriverTier.A },
|
||||
statusTracker: tracker);
|
||||
|
||||
await invoker.ExecuteWriteAsync(
|
||||
"host-1",
|
||||
isIdempotent: false,
|
||||
_ => ValueTask.FromResult(0),
|
||||
CancellationToken.None);
|
||||
|
||||
var snap = tracker.TryGet("drv-test", "host-1");
|
||||
snap.ShouldNotBeNull("the non-idempotent write arm must record tracker accounting on the caller's host");
|
||||
snap!.CurrentInFlight.ShouldBe(0, "in-flight must return to 0 after the write completes");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 01/P-4: the non-idempotent write arm must build the no-retry options snapshot ONCE per invoker
|
||||
/// lifetime (not per call). Two writes to the same host reuse the cached snapshot — the options
|
||||
/// accessor is invoked at most once and only one pipeline is cached.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task NonIdempotentWrite_ReusesCachedNoRetryOptions()
|
||||
{
|
||||
var builder = new DriverResiliencePipelineBuilder();
|
||||
var accessorCalls = 0;
|
||||
var invoker = new CapabilityInvoker(
|
||||
builder,
|
||||
"drv-test",
|
||||
() => { Interlocked.Increment(ref accessorCalls); return new DriverResilienceOptions { Tier = DriverTier.A }; });
|
||||
|
||||
await invoker.ExecuteWriteAsync("host-1", isIdempotent: false, _ => ValueTask.FromResult(0), CancellationToken.None);
|
||||
await invoker.ExecuteWriteAsync("host-1", isIdempotent: false, _ => ValueTask.FromResult(0), CancellationToken.None);
|
||||
|
||||
accessorCalls.ShouldBeLessThanOrEqualTo(1, "the no-retry snapshot must be cached across calls");
|
||||
builder.CachedPipelineCount.ShouldBe(1, "two writes to the same host share one cached no-retry pipeline");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Core-009 regression — companion consistency assertion: the non-idempotent branch must
|
||||
/// not observe two different option snapshots even if the accessor's returned value changes
|
||||
|
||||
Reference in New Issue
Block a user