From 8462cd75e2066c9f5aebbf0124c96e6b57e051f6 Mon Sep 17 00:00:00 2001 From: adelinowona Date: Tue, 8 Apr 2025 01:34:18 -0400 Subject: [PATCH 1/4] CSHARP-5204: Test Heartbeats don't gossip cluster time --- .../sessions/SessionsProseTests.cs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs index c41f1e28636..8e74728dcf7 100644 --- a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs +++ b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs @@ -21,6 +21,7 @@ using MongoDB.Bson; using MongoDB.Bson.TestHelpers; using MongoDB.Driver.Core; +using MongoDB.Driver.Core.Clusters; using MongoDB.Driver.Core.Events; using MongoDB.Driver.Core.Misc; using MongoDB.Driver.Core.TestHelpers.Logging; @@ -302,6 +303,54 @@ public async Task Ensure_server_session_are_allocated_only_on_connection_checkou await eventsTask.WithTimeout(1000); } + [Fact] + public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands() + { + RequireServer.Check().ClusterTypes(ClusterType.ReplicaSet, ClusterType.Sharded); + + var eventCapturer = new EventCapturer() + .Capture() + .Capture() + .Capture(); + + using var c1 = DriverTestConfiguration.CreateMongoClient( + settings => + { + settings.ClusterConfigurator = c => c.Subscribe(eventCapturer); + settings.DirectConnection = true; + settings.HeartbeatInterval = TimeSpan.FromSeconds(2000); + }); + + var pingCommand = new BsonDocument("ping", 1); + var pingResult = c1.GetDatabase("admin").RunCommand(pingCommand); + + var clusterTime = pingResult["$clusterTime"]; + + var c2 = DriverTestConfiguration.Client; + c2.GetDatabase("test").GetCollection("test").InsertOne(new BsonDocument("advance", "$clusterTime")); + + eventCapturer.Clear(); + + eventCapturer.WaitForOrThrowIfTimeout( + events => + { + var capturedEvents = events.ToArray(); + return capturedEvents.Count(e => e is ServerHeartbeatSucceededEvent) > 1 && + capturedEvents + .Where((e, i) => + e is ServerHeartbeatStartedEvent && + capturedEvents[i + 1] is ServerHeartbeatSucceededEvent) + .Any(); + }, TimeSpan.FromSeconds(1), "Didn't get any server heartbeat pairs"); + + c1.GetDatabase("admin").RunCommand(pingCommand); + + var commandStartedEvents = eventCapturer.Events.OfType().ToArray(); + commandStartedEvents.Length.Should().Be(1); + commandStartedEvents[0].CommandName.Should().Be("ping"); + commandStartedEvents[0].Command["$clusterTime"].Should().Be(clusterTime); + } + private sealed class MongocryptdContext : IDisposable { public IMongoClient MongoClient { get; } From 1a6dab4333271ba0d656755fdb799185e7192349 Mon Sep 17 00:00:00 2001 From: adelinowona Date: Thu, 10 Apr 2025 11:13:47 -0400 Subject: [PATCH 2/4] fix a commit error --- .../Specifications/sessions/SessionsProseTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs index 8e74728dcf7..a67f128b33d 100644 --- a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs +++ b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs @@ -318,7 +318,7 @@ public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands() { settings.ClusterConfigurator = c => c.Subscribe(eventCapturer); settings.DirectConnection = true; - settings.HeartbeatInterval = TimeSpan.FromSeconds(2000); + settings.HeartbeatInterval = TimeSpan.FromMilliseconds(10); }); var pingCommand = new BsonDocument("ping", 1); From a2afcb218d7ab54fd84fc7eeb3f5bf337e6b8e9b Mon Sep 17 00:00:00 2001 From: adelinowona Date: Thu, 10 Apr 2025 16:40:47 -0400 Subject: [PATCH 3/4] fix for EG errors --- .../Specifications/sessions/SessionsProseTests.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs index a67f128b33d..be46e6acb10 100644 --- a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs +++ b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs @@ -303,6 +303,7 @@ public async Task Ensure_server_session_are_allocated_only_on_connection_checkou await eventsTask.WithTimeout(1000); } + // https://specifications.readthedocs.io/en/latest/sessions/tests/#20-drivers-do-not-gossip-clustertime-on-sdam-commands [Fact] public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands() { @@ -319,6 +320,10 @@ public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands() settings.ClusterConfigurator = c => c.Subscribe(eventCapturer); settings.DirectConnection = true; settings.HeartbeatInterval = TimeSpan.FromMilliseconds(10); + if (settings.Servers.Count() > 1) + { + settings.Servers = settings.Servers.Take(1); + } }); var pingCommand = new BsonDocument("ping", 1); From fb827980ae29759c0f979879d90b195d8f78c5c5 Mon Sep 17 00:00:00 2001 From: adelinowona Date: Thu, 24 Apr 2025 15:42:01 -0400 Subject: [PATCH 4/4] simplify checking for heartbeat pairs --- .../Specifications/sessions/SessionsProseTests.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs index be46e6acb10..a576e48ab48 100644 --- a/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs +++ b/tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs @@ -337,15 +337,11 @@ public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands() eventCapturer.Clear(); eventCapturer.WaitForOrThrowIfTimeout( - events => + capturedEvents => { - var capturedEvents = events.ToArray(); - return capturedEvents.Count(e => e is ServerHeartbeatSucceededEvent) > 1 && - capturedEvents - .Where((e, i) => - e is ServerHeartbeatStartedEvent && - capturedEvents[i + 1] is ServerHeartbeatSucceededEvent) - .Any(); + return capturedEvents + .SkipWhile(e => e is not ServerHeartbeatStartedEvent) + .Any(e => e is ServerHeartbeatSucceededEvent); }, TimeSpan.FromSeconds(1), "Didn't get any server heartbeat pairs"); c1.GetDatabase("admin").RunCommand(pingCommand);