fix(#654): review fixes - non-vacuous stop-on-publish test, Error only when retry budget refuses
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
+20
-8
@@ -747,20 +747,32 @@ public class CentralCommunicationActorTests : ControlPlaneActorTestBase
|
||||
[Fact]
|
||||
public void Bootstrap_retries_stop_once_the_gate_is_published()
|
||||
{
|
||||
// The provider throws on PreStart (call 1) and on the first load's resolve (call 2), which
|
||||
// schedules a 1 s retry. A manual refresh then publishes while that retry is still PENDING;
|
||||
// stop-on-publish must cancel it. Without the cancel the timer fires, loads again and
|
||||
// republishes (loads == 3, publications == 2).
|
||||
var inner = NewInMemoryDbFactory();
|
||||
SeedGrpcCluster(inner, "C1", ("host-a:4053", "host-a", 4056, true, false));
|
||||
var factory = new CountingDbFactory(inner);
|
||||
var psk = new RecordingPskProvider();
|
||||
Sys.ActorOf(CentralCommunicationActor.Props(
|
||||
factory, GrpcMode(), () => null, () => new RecordingDialer(), () => psk,
|
||||
bootstrapRetryInterval: TimeSpan.FromMilliseconds(100)));
|
||||
var calls = 0;
|
||||
|
||||
// Positive control: the gate did publish before we assert anything about "afterwards".
|
||||
AwaitCondition(() => psk.KnownClusterPublications.Count >= 1, TimeSpan.FromSeconds(10));
|
||||
Thread.Sleep(1000);
|
||||
IMeshPskProvider? PskFactory() =>
|
||||
Interlocked.Increment(ref calls) <= 2 ? throw new InvalidOperationException("race") : psk;
|
||||
|
||||
// Ten retry intervals elapsed with a 60 s periodic cadence: no extra loads, no republish.
|
||||
factory.Calls.ShouldBe(1);
|
||||
var actor = Sys.ActorOf(CentralCommunicationActor.Props(
|
||||
factory, GrpcMode(), () => null, () => new RecordingDialer(), PskFactory,
|
||||
bootstrapRetryInterval: TimeSpan.FromSeconds(1)));
|
||||
|
||||
// Positive control: the failed first resolve happened, so a retry is pending.
|
||||
AwaitCondition(() => Volatile.Read(ref calls) >= 2, TimeSpan.FromSeconds(5));
|
||||
Thread.Sleep(100);
|
||||
actor.Tell(new CentralCommunicationActor.RefreshContacts());
|
||||
AwaitCondition(() => psk.KnownClusterPublications.Count >= 1, TimeSpan.FromSeconds(5));
|
||||
|
||||
Thread.Sleep(2500);
|
||||
|
||||
factory.Calls.ShouldBe(2);
|
||||
psk.KnownClusterPublications.Count.ShouldBe(1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user