private IServer GetServer() { var serverSelector = new EndPointServerSelector(_endPoint); var server = _cluster.SelectServer(serverSelector, CancellationToken.None); return(server); }
/// <summary> /// Lets the server know that this thread is about to begin a series of related operations that must all occur /// on the same connection. The return value of this method implements IDisposable and can be placed in a /// using statement (in which case RequestDone will be called automatically when leaving the using statement). /// </summary> /// <param name="serverInstance">The server instance this request should be tied to.</param> /// <returns>A helper object that implements IDisposable and calls <see cref="RequestDone"/> from the Dispose method.</returns> internal virtual IDisposable RequestStart(MongoServerInstance serverInstance) { var endPoint = serverInstance.EndPoint; var serverSelector = new EndPointServerSelector(endPoint); var coreReadPreference = serverInstance.GetServerDescription().Type.IsWritable() ? ReadPreference.Primary : ReadPreference.Secondary; return(RequestStart(serverSelector, coreReadPreference)); }
/// <summary> /// Lets the server know that this thread is about to begin a series of related operations that must all occur /// on the same connection. The return value of this method implements IDisposable and can be placed in a /// using statement (in which case RequestDone will be called automatically when leaving the using statement). /// </summary> /// <param name="initialDatabase">One of the databases involved in the related operations.</param> /// <param name="serverInstance">The server instance this request should be tied to.</param> /// <returns>A helper object that implements IDisposable and calls <see cref="RequestDone"/> from the Dispose method.</returns> public virtual IDisposable RequestStart(MongoDatabase initialDatabase, MongoServerInstance serverInstance) { var address = serverInstance.Address; var endPoint = new DnsEndPoint(address.Host, address.Port); var serverSelector = new EndPointServerSelector(endPoint); var coreReadPreference = serverInstance.GetServerDescription().Type.IsWritable() ? ReadPreference.Primary : ReadPreference.Secondary; return(RequestStart(serverSelector, coreReadPreference)); }
protected FailPoint ConfigureFailPoint(BsonDocument test, IMongoClient client) { if (test.TryGetValue(FailPointKey, out var failPoint)) { Logger.Debug("Configuring failpoint"); ConfigureFailPointCommand(failPoint.AsBsonDocument); var cluster = client.Cluster; var settings = client.Settings.Clone(); ConfigureClientSettings(settings, test); #pragma warning disable CS0618 // Type or member is obsolete if (settings.ConnectionModeSwitch == ConnectionModeSwitch.UseDirectConnection && #pragma warning restore CS0618 // Type or member is obsolete settings.DirectConnection == true) { var serverAddress = EndPointHelper.Parse(settings.Server.ToString()); var selector = new EndPointServerSelector(serverAddress); _failPointServer = cluster.SelectServer(selector, CancellationToken.None); } else { _failPointServer = cluster.SelectServer(WritableServerSelector.Instance, CancellationToken.None); } var session = NoCoreSession.NewHandle(); var command = failPoint.AsBsonDocument; return(FailPoint.Configure(_failPointServer, session, command)); } return(null); }
public async Task PoolClearedError_write_retryablity_test([Values(false, true)] bool async) { RequireServer.Check() .Supports(Feature.FailPointsBlockConnection) .ClusterTypes(ClusterType.ReplicaSet, ClusterType.Sharded); var heartbeatInterval = TimeSpan.FromMilliseconds(50); var eventsWaitTimeout = TimeSpan.FromMilliseconds(5000); var failPointCommand = BsonDocument.Parse( $@"{{ configureFailPoint : 'failCommand', mode : {{ 'times' : 1 }}, data : {{ failCommands : [ 'insert' ], errorCode : 91, blockConnection: true, blockTimeMS: 1000, errorLabels: [""RetryableWriteError""] }} }}"); IServerSelector failPointSelector = WritableServerSelector.Instance; var settings = DriverTestConfiguration.GetClientSettings(); if (CoreTestConfiguration.Cluster.Description.Type == ClusterType.Sharded) { var serverAddress = settings.Servers.First(); settings.Servers = new[] { serverAddress }; // set settings.DirectConnection = true after removing obsolete ConnectionMode #pragma warning disable CS0618 // Type or member is obsolete settings.ConnectionMode = ConnectionMode.Direct; #pragma warning restore CS0618 // Type or member is obsolete failPointSelector = new EndPointServerSelector(new DnsEndPoint(serverAddress.Host, serverAddress.Port)); } settings.MaxConnectionPoolSize = 1; settings.RetryWrites = true; var eventCapturer = new EventCapturer() .Capture <ConnectionPoolClearedEvent>() .Capture <ConnectionPoolCheckedOutConnectionEvent>() .Capture <ConnectionPoolCheckingOutConnectionFailedEvent>() .CaptureCommandEvents("insert"); var failpointServer = DriverTestConfiguration.Client.Cluster.SelectServer(failPointSelector, default); using var failPoint = FailPoint.Configure(failpointServer, NoCoreSession.NewHandle(), failPointCommand); using var client = CreateClient(settings, eventCapturer, heartbeatInterval); var database = client.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName); var collection = database.GetCollection <BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName); eventCapturer.Clear(); if (async) { await ThreadingUtilities.ExecuteTasksOnNewThreads(2, async _ => { await collection.InsertOneAsync(new BsonDocument("x", 1)); }); } else { ThreadingUtilities.ExecuteOnNewThreads(2, _ => { collection.InsertOne(new BsonDocument("x", 1)); }); } // wait for 2 CommandSucceededEvent events, meaning that all other events should be received eventCapturer.WaitForOrThrowIfTimeout( events => events.OfType <CommandSucceededEvent>().Count() == 2, eventsWaitTimeout); eventCapturer.Events.OfType <CommandStartedEvent>().Count().Should().Be(3); eventCapturer.Events.OfType <CommandFailedEvent>().Count().Should().Be(1); eventCapturer.Events.OfType <CommandSucceededEvent>().Count().Should().Be(2); eventCapturer.Events.OfType <ConnectionPoolClearedEvent>().Count().Should().Be(1); eventCapturer.Events.OfType <ConnectionPoolCheckedOutConnectionEvent>().Count().Should().Be(3); eventCapturer.Events.OfType <ConnectionPoolCheckingOutConnectionFailedEvent>().Count().Should().Be(1); }