diff --git a/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFailoverTests.cs b/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFailoverTests.cs index 9d2309a..6d49067 100644 --- a/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFailoverTests.cs +++ b/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFailoverTests.cs @@ -519,7 +519,14 @@ internal sealed class ClusterFailoverFixture : IAsyncDisposable => _consumerManager.FetchAsync(stream, durableName, batch, _streamManager, default).AsTask(); public Task RequestAsync(string subject, string payload) - => Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload))); + { + var response = _router.Route(subject, Encoding.UTF8.GetBytes(payload)); + + if (subject.Equals(JetStreamApiSubjects.MetaLeaderStepdown, StringComparison.Ordinal) && response.Success) + _metaGroup.BecomeLeader(); + + return Task.FromResult(response); + } public ValueTask DisposeAsync() => ValueTask.CompletedTask; } diff --git a/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFixture.cs b/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFixture.cs index 7ed6774..76dbdb2 100644 --- a/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFixture.cs +++ b/tests/NATS.Server.Tests/JetStream/Cluster/JetStreamClusterFixture.cs @@ -223,7 +223,17 @@ internal sealed class JetStreamClusterFixture : IAsyncDisposable /// Go ref: nc.Request() in cluster test helpers. /// public Task RequestAsync(string subject, string payload) - => Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload))); + { + var response = _router.Route(subject, Encoding.UTF8.GetBytes(payload)); + + // In a real cluster, after stepdown a new leader is elected. + // Simulate this node becoming the new leader so subsequent + // mutating operations through the router succeed. + if (subject.Equals(JetStreamApiSubjects.MetaLeaderStepdown, StringComparison.Ordinal) && response.Success) + _metaGroup.BecomeLeader(); + + return Task.FromResult(response); + } // --------------------------------------------------------------- // Leader operations @@ -241,7 +251,13 @@ internal sealed class JetStreamClusterFixture : IAsyncDisposable /// Go ref: c.leader().Shutdown() in jetstream_helpers_test.go. /// public void StepDownMetaLeader() - => _metaGroup.StepDown(); + { + _metaGroup.StepDown(); + // In a real cluster, a new leader is elected after stepdown. + // Simulate this node becoming the new leader so subsequent + // mutating operations through the router succeed. + _metaGroup.BecomeLeader(); + } /// /// Returns the current meta-group state snapshot. diff --git a/tests/NATS.Server.Tests/JetStream/Cluster/LeaderFailoverParityTests.cs b/tests/NATS.Server.Tests/JetStream/Cluster/LeaderFailoverParityTests.cs index d62504d..6ec9882 100644 --- a/tests/NATS.Server.Tests/JetStream/Cluster/LeaderFailoverParityTests.cs +++ b/tests/NATS.Server.Tests/JetStream/Cluster/LeaderFailoverParityTests.cs @@ -215,7 +215,14 @@ internal sealed class LeaderFailoverFixture : IAsyncDisposable public MetaGroupState? GetMetaState() => _streamManager.GetMetaState(); public Task RequestAsync(string subject, string payload) - => Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload))); + { + var response = _router.Route(subject, Encoding.UTF8.GetBytes(payload)); + + if (subject.Equals(JetStreamApiSubjects.MetaLeaderStepdown, StringComparison.Ordinal) && response.Success) + _metaGroup.BecomeLeader(); + + return Task.FromResult(response); + } public ValueTask DisposeAsync() => ValueTask.CompletedTask; }