test(historian): bounded-wait durability read; honest nondeterminism notes on the #491 controls

This commit is contained in:
Joseph Doherty
2026-08-17 04:07:08 -04:00
parent 20022083df
commit 6b46c485ef
2 changed files with 56 additions and 1 deletions
@@ -353,6 +353,18 @@ public sealed class ContinuousHistorizationRecorderTests : TestKit
/// The yield is the whole point: every other test here uses an outbox that returns
/// <c>ValueTask.CompletedTask</c>, so the continuation runs inline with the context still
/// installed and the defect is invisible. The production FasterLog outbox fsyncs per entry.
/// The outbox double must therefore complete on a POOL thread
/// (<c>Task.Delay(1).ConfigureAwait(false)</c>); a bare <c>Task.Yield()</c> posts back to the
/// CAPTURED ActorTaskScheduler context and is just as vacuous as completing synchronously.
/// </para>
/// <para>
/// ⚠️ The falsification control is NONDETERMINISTIC UNDER LOAD. Re-introducing the defect is
/// only observable when the thread that resumes the continuation happens to carry no Akka
/// actor cell in its ThreadStatic slot; on a loaded parallel test sweep the resuming pool
/// thread can already be servicing this ActorSystem, the <c>Self</c> read succeeds, and the
/// mutation passes. So a SINGLE green run of the intended-red mutation is not proof this
/// regression is caught — re-run the mutation several times, ideally on an otherwise idle
/// machine, before concluding the test is falsifiable.
/// </para>
/// </summary>
[Fact]
@@ -931,6 +943,15 @@ public sealed class ContinuousHistorizationRecorderTests : TestKit
/// <c>Task.Yield()</c>, which posts back to the CAPTURED ActorTaskScheduler context — leaves the
/// context installed and the defect invisible.
/// </para>
/// <para>
/// ⚠️ The falsification control is NONDETERMINISTIC UNDER LOAD. Re-introducing the defect is
/// only observable when the thread that resumes the continuation happens to carry no Akka
/// actor cell in its ThreadStatic slot; on a loaded parallel test sweep the resuming pool
/// thread can already be servicing this ActorSystem, the <c>Self</c> read succeeds, and the
/// mutation passes. So a SINGLE green run of the intended-red mutation is not proof this
/// regression is caught — re-run the mutation several times, ideally on an otherwise idle
/// machine, before concluding the test is falsifiable.
/// </para>
/// </remarks>
[Fact]
public async Task A_yielding_batch_append_neither_faults_the_actor_nor_loses_values()