// constructors /// <summary> /// Initializes a new instance of the <see cref="ClusterSettings"/> class. /// </summary> /// <param name="connectionMode">The connection mode.</param> /// <param name="endPoints">The end points.</param> /// <param name="kmsProviders">The kms providers.</param> /// <param name="localThreshold">The local threshold.</param> /// <param name="maxServerSelectionWaitQueueSize">Maximum size of the server selection wait queue.</param> /// <param name="replicaSetName">Name of the replica set.</param> /// <param name="serverSelectionTimeout">The server selection timeout.</param> /// <param name="preServerSelector">The pre server selector.</param> /// <param name="postServerSelector">The post server selector.</param> /// <param name="schemaMap">The schema map.</param> /// <param name="scheme">The connection string scheme.</param> public ClusterSettings( Optional <ClusterConnectionMode> connectionMode = default(Optional <ClusterConnectionMode>), Optional <IEnumerable <EndPoint> > endPoints = default(Optional <IEnumerable <EndPoint> >), Optional <IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > > kmsProviders = default(Optional <IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > >), Optional <TimeSpan> localThreshold = default, Optional <int> maxServerSelectionWaitQueueSize = default(Optional <int>), Optional <string> replicaSetName = default(Optional <string>), Optional <TimeSpan> serverSelectionTimeout = default(Optional <TimeSpan>), Optional <IServerSelector> preServerSelector = default(Optional <IServerSelector>), Optional <IServerSelector> postServerSelector = default(Optional <IServerSelector>), Optional <IReadOnlyDictionary <string, BsonDocument> > schemaMap = default(Optional <IReadOnlyDictionary <string, BsonDocument> >), Optional <ConnectionStringScheme> scheme = default(Optional <ConnectionStringScheme>)) { _connectionMode = connectionMode.WithDefault(ClusterConnectionMode.Automatic); _endPoints = Ensure.IsNotNull(endPoints.WithDefault(__defaultEndPoints), "endPoints").ToList(); _kmsProviders = kmsProviders.WithDefault(null); _localThreshold = Ensure.IsGreaterThanOrEqualToZero(localThreshold.WithDefault(TimeSpan.FromMilliseconds(15)), "localThreshold"); _maxServerSelectionWaitQueueSize = Ensure.IsGreaterThanOrEqualToZero(maxServerSelectionWaitQueueSize.WithDefault(500), "maxServerSelectionWaitQueueSize"); _replicaSetName = replicaSetName.WithDefault(null); _serverSelectionTimeout = Ensure.IsGreaterThanOrEqualToZero(serverSelectionTimeout.WithDefault(TimeSpan.FromSeconds(30)), "serverSelectionTimeout"); _preServerSelector = preServerSelector.WithDefault(null); _postServerSelector = postServerSelector.WithDefault(null); _scheme = scheme.WithDefault(ConnectionStringScheme.MongoDB); _schemaMap = schemaMap.WithDefault(null); }
public void SelectServer_should_be_cancelled_by_cancellationToken( [Values(ConnectionStringScheme.MongoDB, ConnectionStringScheme.MongoDBPlusSrv)] ConnectionStringScheme connectionStringScheme, [Values(false, true)] bool async) { var settings = _settings.With(scheme: connectionStringScheme); var mockDnsMonitorFactory = CreateMockDnsMonitorFactory(); using (var subject = CreateSubject(settings: settings, dnsMonitorFactory: mockDnsMonitorFactory.Object)) { subject.Initialize(); Exception exception; using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(100))) { if (async) { exception = Record.Exception(() => subject.SelectServerAsync(Mock.Of <IServerSelector>(), cancellationTokenSource.Token).GetAwaiter().GetResult()); } else { exception = Record.Exception(() => subject.SelectServer(Mock.Of <IServerSelector>(), cancellationTokenSource.Token)); } } exception.Should().BeOfType <OperationCanceledException>(); } }
public void SelectServer_should_return_expected_server( [Values(ConnectionStringScheme.MongoDB, ConnectionStringScheme.MongoDBPlusSrv)] ConnectionStringScheme connectionStringScheme, [Values(false, true)] bool async) { var settings = _settings.With(scheme: connectionStringScheme); var mockDnsMonitorFactory = CreateMockDnsMonitorFactory(); using (var subject = CreateSubject(settings: settings, dnsMonitorFactory: mockDnsMonitorFactory.Object)) { subject.Initialize(); if (connectionStringScheme == ConnectionStringScheme.MongoDBPlusSrv) { PublishDnsResults(subject, _endPoint); } PublishDescription(_endPoint); IServer result; if (async) { result = subject.SelectServerAsync(Mock.Of <IServerSelector>(), CancellationToken.None).GetAwaiter().GetResult(); } else { result = subject.SelectServer(Mock.Of <IServerSelector>(), CancellationToken.None); } result.EndPoint.Should().Be(_endPoint); } }
// constructors /// <summary> /// Creates a new instance of MongoClientSettings. Usually you would use a connection string instead. /// </summary> public MongoClientSettings() { _applicationName = null; _connectionMode = ConnectionMode.Automatic; _connectTimeout = MongoDefaults.ConnectTimeout; _credentials = new MongoCredentialStore(new MongoCredential[0]); _guidRepresentation = MongoDefaults.GuidRepresentation; _heartbeatInterval = ServerSettings.DefaultHeartbeatInterval; _heartbeatTimeout = ServerSettings.DefaultHeartbeatTimeout; _ipv6 = false; _localThreshold = MongoDefaults.LocalThreshold; _maxConnectionIdleTime = MongoDefaults.MaxConnectionIdleTime; _maxConnectionLifeTime = MongoDefaults.MaxConnectionLifeTime; _maxConnectionPoolSize = MongoDefaults.MaxConnectionPoolSize; _minConnectionPoolSize = MongoDefaults.MinConnectionPoolSize; _readConcern = ReadConcern.Default; _readEncoding = null; _readPreference = ReadPreference.Primary; _replicaSetName = null; _retryWrites = false; _scheme = ConnectionStringScheme.MongoDB; _sdamLogFilename = null; _servers = new List <MongoServerAddress> { new MongoServerAddress("localhost") }; _serverSelectionTimeout = MongoDefaults.ServerSelectionTimeout; _socketTimeout = MongoDefaults.SocketTimeout; _sslSettings = null; _useSsl = false; _verifySslCertificate = true; _waitQueueSize = MongoDefaults.ComputedWaitQueueSize; _waitQueueTimeout = MongoDefaults.WaitQueueTimeout; _writeConcern = WriteConcern.Acknowledged; _writeEncoding = null; }
// constructors /// <summary> /// Initializes a new instance of the <see cref="ClusterSettings"/> class. /// </summary> /// <param name="connectionMode">The connection mode.</param> /// <param name="connectionModeSwitch">The connection mode switch.</param> /// <param name="directConnection">The directConnection.</param> /// <param name="endPoints">The end points.</param> /// <param name="kmsProviders">The kms providers.</param> /// <param name="localThreshold">The local threshold.</param> /// <param name="maxServerSelectionWaitQueueSize">Maximum size of the server selection wait queue.</param> /// <param name="replicaSetName">Name of the replica set.</param> /// <param name="serverSelectionTimeout">The server selection timeout.</param> /// <param name="preServerSelector">The pre server selector.</param> /// <param name="postServerSelector">The post server selector.</param> /// <param name="schemaMap">The schema map.</param> /// <param name="scheme">The connection string scheme.</param> public ClusterSettings( #pragma warning disable CS0618 // Type or member is obsolete Optional <ClusterConnectionMode> connectionMode = default(Optional <ClusterConnectionMode>), Optional <ConnectionModeSwitch> connectionModeSwitch = default, #pragma warning restore CS0618 // Type or member is obsolete Optional <bool?> directConnection = default, Optional <IEnumerable <EndPoint> > endPoints = default(Optional <IEnumerable <EndPoint> >), Optional <IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > > kmsProviders = default(Optional <IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > >), Optional <TimeSpan> localThreshold = default, Optional <int> maxServerSelectionWaitQueueSize = default(Optional <int>), Optional <string> replicaSetName = default(Optional <string>), Optional <TimeSpan> serverSelectionTimeout = default(Optional <TimeSpan>), Optional <IServerSelector> preServerSelector = default(Optional <IServerSelector>), Optional <IServerSelector> postServerSelector = default(Optional <IServerSelector>), Optional <IReadOnlyDictionary <string, BsonDocument> > schemaMap = default(Optional <IReadOnlyDictionary <string, BsonDocument> >), Optional <ConnectionStringScheme> scheme = default(Optional <ConnectionStringScheme>)) { #pragma warning disable CS0618 // Type or member is obsolete _connectionMode = connectionMode.WithDefault(ClusterConnectionMode.Automatic); _connectionModeSwitch = connectionModeSwitch.WithDefault(ConnectionModeSwitch.NotSet); #pragma warning restore CS0618 // Type or member is obsolete _directConnection = directConnection.WithDefault(null); _endPoints = Ensure.IsNotNull(endPoints.WithDefault(__defaultEndPoints), "endPoints").ToList(); _kmsProviders = kmsProviders.WithDefault(null); _localThreshold = Ensure.IsGreaterThanOrEqualToZero(localThreshold.WithDefault(TimeSpan.FromMilliseconds(15)), "localThreshold"); _maxServerSelectionWaitQueueSize = Ensure.IsGreaterThanOrEqualToZero(maxServerSelectionWaitQueueSize.WithDefault(500), "maxServerSelectionWaitQueueSize"); _replicaSetName = replicaSetName.WithDefault(null); _serverSelectionTimeout = Ensure.IsGreaterThanOrEqualToZero(serverSelectionTimeout.WithDefault(TimeSpan.FromSeconds(30)), "serverSelectionTimeout"); _preServerSelector = preServerSelector.WithDefault(null); _postServerSelector = postServerSelector.WithDefault(null); _scheme = scheme.WithDefault(ConnectionStringScheme.MongoDB); _schemaMap = schemaMap.WithDefault(null); ClusterConnectionModeHelper.EnsureConnectionModeValuesAreValid(_connectionMode, _connectionModeSwitch, _directConnection); }
// constructors public ClusterKey( bool allowInsecureTls, string applicationName, Action <ClusterBuilder> clusterConfigurator, IReadOnlyList <CompressorConfiguration> compressors, ConnectionMode connectionMode, TimeSpan connectTimeout, IReadOnlyList <MongoCredential> credentials, TimeSpan heartbeatInterval, TimeSpan heartbeatTimeout, bool ipv6, TimeSpan localThreshold, TimeSpan maxConnectionIdleTime, TimeSpan maxConnectionLifeTime, int maxConnectionPoolSize, int minConnectionPoolSize, int receiveBufferSize, string replicaSetName, ConnectionStringScheme scheme, string sdamLogFilename, int sendBufferSize, IReadOnlyList <MongoServerAddress> servers, TimeSpan serverSelectionTimeout, TimeSpan socketTimeout, SslSettings sslSettings, bool useTls, int waitQueueSize, TimeSpan waitQueueTimeout) { _allowInsecureTls = allowInsecureTls; _applicationName = applicationName; _clusterConfigurator = clusterConfigurator; _compressors = compressors; _connectionMode = connectionMode; _connectTimeout = connectTimeout; _credentials = credentials; _heartbeatInterval = heartbeatInterval; _heartbeatTimeout = heartbeatTimeout; _ipv6 = ipv6; _localThreshold = localThreshold; _maxConnectionIdleTime = maxConnectionIdleTime; _maxConnectionLifeTime = maxConnectionLifeTime; _maxConnectionPoolSize = maxConnectionPoolSize; _minConnectionPoolSize = minConnectionPoolSize; _receiveBufferSize = receiveBufferSize; _replicaSetName = replicaSetName; _scheme = scheme; _sdamLogFilename = sdamLogFilename; _sendBufferSize = sendBufferSize; _servers = servers; _serverSelectionTimeout = serverSelectionTimeout; _socketTimeout = socketTimeout; _sslSettings = sslSettings; _useTls = useTls; _waitQueueSize = waitQueueSize; _waitQueueTimeout = waitQueueTimeout; _hashCode = CalculateHashCode(); }
// constructors /// <summary> /// Creates a new instance of MongoUrl. /// </summary> /// <param name="url">The URL containing the settings.</param> public MongoUrl(string url) { _originalUrl = url; var builder = new MongoUrlBuilder(url); // parses url _allowInsecureTls = builder.AllowInsecureTls; _applicationName = builder.ApplicationName; _authenticationMechanism = builder.AuthenticationMechanism; _authenticationMechanismProperties = builder.AuthenticationMechanismProperties; _authenticationSource = builder.AuthenticationSource; _compressors = builder.Compressors; _connectionMode = builder.ConnectionMode; _connectTimeout = builder.ConnectTimeout; _databaseName = builder.DatabaseName; _fsync = builder.FSync; #pragma warning disable 618 if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2) { _guidRepresentation = builder.GuidRepresentation; } #pragma warning restore 618 _heartbeatInterval = builder.HeartbeatInterval; _heartbeatTimeout = builder.HeartbeatTimeout; _ipv6 = builder.IPv6; _isResolved = builder.Scheme != ConnectionStringScheme.MongoDBPlusSrv; _journal = builder.Journal; _localThreshold = builder.LocalThreshold; _maxConnectionIdleTime = builder.MaxConnectionIdleTime; _maxConnectionLifeTime = builder.MaxConnectionLifeTime; _maxConnectionPoolSize = builder.MaxConnectionPoolSize; _minConnectionPoolSize = builder.MinConnectionPoolSize; _password = builder.Password; _readConcernLevel = builder.ReadConcernLevel; _readPreference = builder.ReadPreference; _replicaSetName = builder.ReplicaSetName; _retryReads = builder.RetryReads; _retryWrites = builder.RetryWrites; _scheme = builder.Scheme; _servers = builder.Servers; _serverSelectionTimeout = builder.ServerSelectionTimeout; _socketTimeout = builder.SocketTimeout; _tlsDisableCertificateRevocationCheck = builder.TlsDisableCertificateRevocationCheck; _username = builder.Username; _useTls = builder.UseTls; _w = builder.W; #pragma warning disable 618 _waitQueueMultiple = builder.WaitQueueMultiple; _waitQueueSize = builder.WaitQueueSize; #pragma warning restore 618 _waitQueueTimeout = builder.WaitQueueTimeout; _wTimeout = builder.WTimeout; _url = builder.ToString(); // keep canonical form }
// constructors /// <summary> /// Creates a new instance of MongoUrlBuilder. /// </summary> public MongoUrlBuilder() { _allowInsecureTls = false; _applicationName = null; _authenticationMechanism = MongoDefaults.AuthenticationMechanism; _authenticationMechanismProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); _authenticationSource = null; _compressors = new CompressorConfiguration[0]; _connectionMode = ConnectionMode.Automatic; #pragma warning disable CS0618 // Type or member is obsolete _connectionModeSwitch = ConnectionModeSwitch.NotSet; #pragma warning restore CS0618 // Type or member is obsolete _connectTimeout = MongoDefaults.ConnectTimeout; _databaseName = null; _directConnection = null; _fsync = null; #pragma warning disable 618 if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2) { _guidRepresentation = MongoDefaults.GuidRepresentation; } #pragma warning restore 618 _heartbeatInterval = ServerSettings.DefaultHeartbeatInterval; _heartbeatTimeout = ServerSettings.DefaultHeartbeatTimeout; _ipv6 = false; _journal = null; _loadBalanced = false; _localThreshold = MongoDefaults.LocalThreshold; _maxConnecting = MongoInternalDefaults.ConnectionPool.MaxConnecting; _maxConnectionIdleTime = MongoDefaults.MaxConnectionIdleTime; _maxConnectionLifeTime = MongoDefaults.MaxConnectionLifeTime; _maxConnectionPoolSize = MongoDefaults.MaxConnectionPoolSize; _minConnectionPoolSize = MongoDefaults.MinConnectionPoolSize; _password = null; _readConcernLevel = null; _readPreference = null; _replicaSetName = null; _retryReads = null; _retryWrites = null; _scheme = ConnectionStringScheme.MongoDB; _servers = new[] { new MongoServerAddress("localhost", 27017) }; _serverSelectionTimeout = MongoDefaults.ServerSelectionTimeout; _socketTimeout = MongoDefaults.SocketTimeout; _srvMaxHosts = null; _username = null; _useTls = false; _w = null; #pragma warning disable 618 _waitQueueMultiple = MongoDefaults.WaitQueueMultiple; _waitQueueSize = MongoDefaults.WaitQueueSize; #pragma warning restore 618 _waitQueueTimeout = MongoDefaults.WaitQueueTimeout; _wTimeout = null; }
public void TestFromUrlResolving(string connectionString, ConnectionStringScheme expectedScheme, string expectedEndPoint) { var url = new MongoUrl(connectionString); var result = MongoClientSettings.FromUrl(url); var expectedServers = new[] { MongoServerAddress.Parse(expectedEndPoint) }; result.Servers.Should().Equal(expectedServers); result.Scheme.Should().Be(expectedScheme); }
private void ExtractScheme(Match match) { var schemeGroup = match.Groups["scheme"]; if (schemeGroup.Success) { if (schemeGroup.Value == "mongodb+srv") { _scheme = ConnectionStringScheme.MongoDBPlusSrv; _ssl = true; _allOptions.Add("ssl", "true"); } } }
// private methods private ConnectionString BuildResolvedConnectionString(ConnectionStringScheme resolvedScheme, List <string> resolvedHosts, NameValueCollection resolvedOptions) { var connectionString = resolvedScheme == ConnectionStringScheme.MongoDBPlusSrv ? "mongodb+srv://" : "mongodb://"; if (_username != null) { connectionString += Uri.EscapeDataString(_username); if (_password != null) { connectionString += ":" + Uri.EscapeDataString(_password); } connectionString += "@"; } connectionString += string.Join(",", resolvedHosts) + "/"; if (_databaseName != null) { connectionString += Uri.EscapeDataString(_databaseName) + "/"; } // remove any option from the resolved options that was specified locally foreach (var key in _allOptions.AllKeys) { if (resolvedOptions.Get(key) != null) { resolvedOptions.Remove(key); } } resolvedOptions.Add(_allOptions); var mergedOptions = new List <string>(); mergedOptions.AddRange( resolvedOptions .AllKeys .SelectMany(x => resolvedOptions .GetValues(x) .Select(y => $"{x}={Uri.EscapeDataString(y)}"))); if (mergedOptions.Count > 0) { connectionString += "?" + string.Join("&", mergedOptions); } return(new ConnectionString(connectionString, isResolved: true)); }
// constructors /// <summary> /// Creates a new instance of MongoClientSettings. Usually you would use a connection string instead. /// </summary> public MongoClientSettings() { _allowInsecureTls = false; _applicationName = null; _autoEncryptionOptions = null; _compressors = new CompressorConfiguration[0]; #pragma warning disable CS0618 // Type or member is obsolete _connectionMode = ConnectionMode.Automatic; _connectionModeSwitch = ConnectionModeSwitch.NotSet; #pragma warning restore CS0618 // Type or member is obsolete _connectTimeout = MongoDefaults.ConnectTimeout; _credentials = new MongoCredentialStore(new MongoCredential[0]); _directConnection = null; #pragma warning disable 618 if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2) { _guidRepresentation = MongoDefaults.GuidRepresentation; } #pragma warning restore 618 _heartbeatInterval = ServerSettings.DefaultHeartbeatInterval; _heartbeatTimeout = ServerSettings.DefaultHeartbeatTimeout; _ipv6 = false; _localThreshold = MongoDefaults.LocalThreshold; _maxConnectionIdleTime = MongoDefaults.MaxConnectionIdleTime; _maxConnectionLifeTime = MongoDefaults.MaxConnectionLifeTime; _maxConnectionPoolSize = MongoDefaults.MaxConnectionPoolSize; _minConnectionPoolSize = MongoDefaults.MinConnectionPoolSize; _readConcern = ReadConcern.Default; _readEncoding = null; _readPreference = ReadPreference.Primary; _replicaSetName = null; _retryReads = true; _retryWrites = true; _scheme = ConnectionStringScheme.MongoDB; _sdamLogFilename = null; _servers = new List<MongoServerAddress> { new MongoServerAddress("localhost") }; _serverSelectionTimeout = MongoDefaults.ServerSelectionTimeout; _socketTimeout = MongoDefaults.SocketTimeout; _sslSettings = null; _useTls = false; #pragma warning disable 618 _waitQueueSize = MongoDefaults.ComputedWaitQueueSize; #pragma warning restore 618 _waitQueueTimeout = MongoDefaults.WaitQueueTimeout; _writeConcern = WriteConcern.Acknowledged; _writeEncoding = null; }
// constructors /// <summary> /// Creates a new instance of MongoUrl. /// </summary> /// <param name="url">The URL containing the settings.</param> public MongoUrl(string url) { _originalUrl = url; var builder = new MongoUrlBuilder(url); // parses url _applicationName = builder.ApplicationName; _authenticationMechanism = builder.AuthenticationMechanism; _authenticationMechanismProperties = builder.AuthenticationMechanismProperties; _authenticationSource = builder.AuthenticationSource; _connectionMode = builder.ConnectionMode; _connectTimeout = builder.ConnectTimeout; _databaseName = builder.DatabaseName; _fsync = builder.FSync; _guidRepresentation = builder.GuidRepresentation; _heartbeatInterval = builder.HeartbeatInterval; _heartbeatTimeout = builder.HeartbeatTimeout; _ipv6 = builder.IPv6; _isResolved = builder.Scheme != ConnectionStringScheme.MongoDBPlusSrv; _journal = builder.Journal; _localThreshold = builder.LocalThreshold; _maxConnectionIdleTime = builder.MaxConnectionIdleTime; _maxConnectionLifeTime = builder.MaxConnectionLifeTime; _maxConnectionPoolSize = builder.MaxConnectionPoolSize; _minConnectionPoolSize = builder.MinConnectionPoolSize; _password = builder.Password; _readConcernLevel = builder.ReadConcernLevel; _readPreference = builder.ReadPreference; _replicaSetName = builder.ReplicaSetName; _retryReads = builder.RetryReads; _retryWrites = builder.RetryWrites; _scheme = builder.Scheme; _servers = builder.Servers; _serverSelectionTimeout = builder.ServerSelectionTimeout; _socketTimeout = builder.SocketTimeout; _username = builder.Username; _useSsl = builder.UseSsl; _verifySslCertificate = builder.VerifySslCertificate; _w = builder.W; _waitQueueMultiple = builder.WaitQueueMultiple; _waitQueueSize = builder.WaitQueueSize; _waitQueueTimeout = builder.WaitQueueTimeout; _wTimeout = builder.WTimeout; _url = builder.ToString(); // keep canonical form }
// constructors /// <summary> /// Initializes a new instance of the <see cref="ClusterSettings"/> class. /// </summary> /// <param name="connectionMode">The connection mode.</param> /// <param name="endPoints">The end points.</param> /// <param name="maxServerSelectionWaitQueueSize">Maximum size of the server selection wait queue.</param> /// <param name="replicaSetName">Name of the replica set.</param> /// <param name="serverSelectionTimeout">The server selection timeout.</param> /// <param name="preServerSelector">The pre server selector.</param> /// <param name="postServerSelector">The post server selector.</param> /// <param name="scheme">The connection string scheme.</param> public ClusterSettings( Optional <ClusterConnectionMode> connectionMode = default(Optional <ClusterConnectionMode>), Optional <IEnumerable <EndPoint> > endPoints = default(Optional <IEnumerable <EndPoint> >), Optional <int> maxServerSelectionWaitQueueSize = default(Optional <int>), Optional <string> replicaSetName = default(Optional <string>), Optional <TimeSpan> serverSelectionTimeout = default(Optional <TimeSpan>), Optional <IServerSelector> preServerSelector = default(Optional <IServerSelector>), Optional <IServerSelector> postServerSelector = default(Optional <IServerSelector>), Optional <ConnectionStringScheme> scheme = default(Optional <ConnectionStringScheme>)) { _connectionMode = connectionMode.WithDefault(ClusterConnectionMode.Automatic); _endPoints = Ensure.IsNotNull(endPoints.WithDefault(__defaultEndPoints), "endPoints").ToList(); _maxServerSelectionWaitQueueSize = Ensure.IsGreaterThanOrEqualToZero(maxServerSelectionWaitQueueSize.WithDefault(500), "maxServerSelectionWaitQueueSize"); _replicaSetName = replicaSetName.WithDefault(null); _serverSelectionTimeout = Ensure.IsGreaterThanOrEqualToZero(serverSelectionTimeout.WithDefault(TimeSpan.FromSeconds(30)), "serverSelectionTimeout"); _preServerSelector = preServerSelector.WithDefault(null); _postServerSelector = postServerSelector.WithDefault(null); _scheme = scheme.WithDefault(ConnectionStringScheme.MongoDB); }
public void SelectServer_should_throw_server_selection_timeout_if_server_has_not_been_created_in_time( [Values(ConnectionStringScheme.MongoDB, ConnectionStringScheme.MongoDBPlusSrv)] ConnectionStringScheme connectionStringScheme, [Values(false, true)] bool async) { var serverSelectionTimeout = TimeSpan.FromMilliseconds(500); var settings = _settings.With(scheme: connectionStringScheme, serverSelectionTimeout: serverSelectionTimeout); var mockDnsMonitorFactory = CreateMockDnsMonitorFactory(); using (var subject = CreateSubject(settings: settings, dnsMonitorFactory: mockDnsMonitorFactory.Object)) { subject.Initialize(); var dnsException = new Exception("Dns exception"); if (connectionStringScheme == ConnectionStringScheme.MongoDBPlusSrv) { // it has affect only on srv mode PublishDnsException(subject, dnsException); } Exception exception; if (async) { exception = Record.Exception(() => subject.SelectServerAsync(Mock.Of <IServerSelector>(), CancellationToken.None).GetAwaiter().GetResult()); } else { exception = Record.Exception(() => subject.SelectServer(Mock.Of <IServerSelector>(), CancellationToken.None)); } var ex = exception.Should().BeOfType <TimeoutException>().Subject; ex.Message.Should().StartWith($"A timeout occurred after {serverSelectionTimeout.TotalMilliseconds}ms selecting a server. Client view of cluster state is "); if (connectionStringScheme == ConnectionStringScheme.MongoDBPlusSrv) { ex.Message.Contains(dnsException.ToString()); } else { ex.Message.Should().NotContain(dnsException.ToString()); } } }
// constructors /// <summary> /// Creates a new instance of MongoUrlBuilder. /// </summary> public MongoUrlBuilder() { _applicationName = null; _authenticationMechanism = MongoDefaults.AuthenticationMechanism; _authenticationMechanismProperties = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); _authenticationSource = null; _compressors = new CompressorConfiguration[0]; _connectionMode = ConnectionMode.Automatic; _connectTimeout = MongoDefaults.ConnectTimeout; _databaseName = null; _fsync = null; _guidRepresentation = MongoDefaults.GuidRepresentation; _heartbeatInterval = ServerSettings.DefaultHeartbeatInterval; _heartbeatTimeout = ServerSettings.DefaultHeartbeatTimeout; _ipv6 = false; _journal = null; _maxConnectionIdleTime = MongoDefaults.MaxConnectionIdleTime; _maxConnectionLifeTime = MongoDefaults.MaxConnectionLifeTime; _maxConnectionPoolSize = MongoDefaults.MaxConnectionPoolSize; _minConnectionPoolSize = MongoDefaults.MinConnectionPoolSize; _password = null; _readConcernLevel = null; _readPreference = null; _replicaSetName = null; _retryReads = null; _retryWrites = null; _localThreshold = MongoDefaults.LocalThreshold; _scheme = ConnectionStringScheme.MongoDB; _servers = new[] { new MongoServerAddress("localhost", 27017) }; _serverSelectionTimeout = MongoDefaults.ServerSelectionTimeout; _socketTimeout = MongoDefaults.SocketTimeout; _username = null; _useSsl = false; _verifySslCertificate = true; _w = null; _waitQueueMultiple = MongoDefaults.WaitQueueMultiple; _waitQueueSize = MongoDefaults.WaitQueueSize; _waitQueueTimeout = MongoDefaults.WaitQueueTimeout; _wTimeout = null; }
/// <summary> /// Parses a URL and sets all settings to match the URL. /// </summary> /// <param name="url">The URL.</param> public void Parse(string url) { var connectionString = new ConnectionString(url); _applicationName = connectionString.ApplicationName; _authenticationMechanism = connectionString.AuthMechanism; _authenticationMechanismProperties = connectionString.AuthMechanismProperties.ToDictionary(x => x.Key, x => x.Value, StringComparer.OrdinalIgnoreCase); _authenticationSource = connectionString.AuthSource; switch (connectionString.Connect) { case ClusterConnectionMode.Direct: _connectionMode = Driver.ConnectionMode.Direct; break; case ClusterConnectionMode.ReplicaSet: _connectionMode = Driver.ConnectionMode.ReplicaSet; break; case ClusterConnectionMode.Sharded: _connectionMode = Driver.ConnectionMode.ShardRouter; break; case ClusterConnectionMode.Standalone: _connectionMode = Driver.ConnectionMode.Standalone; break; default: _connectionMode = Driver.ConnectionMode.Automatic; break; } _connectTimeout = connectionString.ConnectTimeout.GetValueOrDefault(MongoDefaults.ConnectTimeout); _databaseName = connectionString.DatabaseName; _fsync = connectionString.FSync; _guidRepresentation = connectionString.UuidRepresentation.GetValueOrDefault(MongoDefaults.GuidRepresentation); _heartbeatInterval = connectionString.HeartbeatInterval ?? ServerSettings.DefaultHeartbeatInterval; _heartbeatTimeout = connectionString.HeartbeatTimeout ?? ServerSettings.DefaultHeartbeatTimeout; _ipv6 = connectionString.Ipv6.GetValueOrDefault(false); _journal = connectionString.Journal; _maxConnectionIdleTime = connectionString.MaxIdleTime.GetValueOrDefault(MongoDefaults.MaxConnectionIdleTime); _maxConnectionLifeTime = connectionString.MaxLifeTime.GetValueOrDefault(MongoDefaults.MaxConnectionLifeTime); _maxConnectionPoolSize = connectionString.MaxPoolSize.GetValueOrDefault(MongoDefaults.MaxConnectionPoolSize); _minConnectionPoolSize = connectionString.MinPoolSize.GetValueOrDefault(MongoDefaults.MinConnectionPoolSize); _password = connectionString.Password; _readConcernLevel = connectionString.ReadConcernLevel; if (connectionString.ReadPreference.HasValue || connectionString.ReadPreferenceTags != null || connectionString.MaxStaleness.HasValue) { if (!connectionString.ReadPreference.HasValue) { throw new MongoConfigurationException("readPreference mode is required when using tag sets or max staleness."); } _readPreference = new ReadPreference(connectionString.ReadPreference.Value, connectionString.ReadPreferenceTags, connectionString.MaxStaleness); } _replicaSetName = connectionString.ReplicaSet; _retryWrites = connectionString.RetryWrites; _localThreshold = connectionString.LocalThreshold.GetValueOrDefault(MongoDefaults.LocalThreshold); _scheme = connectionString.Scheme; _servers = connectionString.Hosts.Select(endPoint => { DnsEndPoint dnsEndPoint; IPEndPoint ipEndPoint; if ((dnsEndPoint = endPoint as DnsEndPoint) != null) { return(new MongoServerAddress(dnsEndPoint.Host, dnsEndPoint.Port)); } else if ((ipEndPoint = endPoint as IPEndPoint) != null) { var address = ipEndPoint.Address.ToString(); if (ipEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { address = "[" + address + "]"; } return(new MongoServerAddress(address, ipEndPoint.Port)); } else { throw new NotSupportedException("Only DnsEndPoint and IPEndPoints are supported in the connection string."); } }); _serverSelectionTimeout = connectionString.ServerSelectionTimeout.GetValueOrDefault(MongoDefaults.ServerSelectionTimeout); _socketTimeout = connectionString.SocketTimeout.GetValueOrDefault(MongoDefaults.SocketTimeout); _username = connectionString.Username; _useSsl = connectionString.Ssl.GetValueOrDefault(false); _verifySslCertificate = connectionString.SslVerifyCertificate.GetValueOrDefault(true); _w = connectionString.W; if (connectionString.WaitQueueSize != null) { _waitQueueSize = connectionString.WaitQueueSize.Value; _waitQueueMultiple = 0.0; } else if (connectionString.WaitQueueMultiple != null) { _waitQueueMultiple = connectionString.WaitQueueMultiple.Value; _waitQueueSize = 0; } _waitQueueTimeout = connectionString.WaitQueueTimeout.GetValueOrDefault(MongoDefaults.WaitQueueTimeout); _wTimeout = connectionString.WTimeout; }
// constructors public ClusterKey( bool allowInsecureTls, string applicationName, Action <ClusterBuilder> clusterConfigurator, IReadOnlyList <CompressorConfiguration> compressors, #pragma warning disable CS0618 // Type or member is obsolete ConnectionMode connectionMode, ConnectionModeSwitch connectionModeSwitch, #pragma warning restore CS0618 // Type or member is obsolete TimeSpan connectTimeout, IReadOnlyList <MongoCredential> credentials, bool?directConnection, TimeSpan heartbeatInterval, TimeSpan heartbeatTimeout, bool ipv6, IReadOnlyDictionary <string, IReadOnlyDictionary <string, object> > kmsProviders, TimeSpan localThreshold, TimeSpan maxConnectionIdleTime, TimeSpan maxConnectionLifeTime, int maxConnectionPoolSize, int minConnectionPoolSize, int receiveBufferSize, string replicaSetName, IReadOnlyDictionary <string, BsonDocument> schemaMap, ConnectionStringScheme scheme, string sdamLogFilename, int sendBufferSize, ServerApi serverApi, IReadOnlyList <MongoServerAddress> servers, TimeSpan serverSelectionTimeout, TimeSpan socketTimeout, SslSettings sslSettings, bool useTls, int waitQueueSize, TimeSpan waitQueueTimeout) { ConnectionModeHelper.EnsureConnectionModeValuesAreValid(connectionMode, connectionModeSwitch, directConnection); _allowInsecureTls = allowInsecureTls; _applicationName = applicationName; _clusterConfigurator = clusterConfigurator; _compressors = compressors; _connectionMode = connectionMode; _connectionModeSwitch = connectionModeSwitch; _connectTimeout = connectTimeout; _credentials = credentials; _directConnection = directConnection; _heartbeatInterval = heartbeatInterval; _heartbeatTimeout = heartbeatTimeout; _ipv6 = ipv6; _kmsProviders = kmsProviders; _localThreshold = localThreshold; _maxConnectionIdleTime = maxConnectionIdleTime; _maxConnectionLifeTime = maxConnectionLifeTime; _maxConnectionPoolSize = maxConnectionPoolSize; _minConnectionPoolSize = minConnectionPoolSize; _receiveBufferSize = receiveBufferSize; _replicaSetName = replicaSetName; _schemaMap = schemaMap; _scheme = scheme; _sdamLogFilename = sdamLogFilename; _sendBufferSize = sendBufferSize; _serverApi = serverApi; _servers = servers; _serverSelectionTimeout = serverSelectionTimeout; _socketTimeout = socketTimeout; _sslSettings = sslSettings; _useTls = useTls; _waitQueueSize = waitQueueSize; _waitQueueTimeout = waitQueueTimeout; _hashCode = CalculateHashCode(); }
public void Initialize_should_not_start_dns_monitor_thread_when_scheme_is_MongoDB(ConnectionStringScheme connectionStringScheme, bool shouldStartDnsResolving) { var settings = _settings.With(scheme: connectionStringScheme, endPoints: new[] { new DnsEndPoint("a.b.com", 53) }); using (var subject = CreateSubject(settings)) { subject.Initialize(); if (connectionStringScheme == ConnectionStringScheme.MongoDBPlusSrv) { PublishDnsResults(subject, _endPoint); } if (shouldStartDnsResolving) { subject._dnsMonitorThread().Should().NotBeNull(); } else { subject._dnsMonitorThread().Should().BeNull(); } } _capturedEvents.Next().Should().BeOfType <ClusterOpeningEvent>(); if (connectionStringScheme == ConnectionStringScheme.MongoDB) { _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterOpenedEvent>(); } else { // the events are in reverse order because async mode for srv resolving _capturedEvents.Next().Should().BeOfType <ClusterOpenedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); } _capturedEvents.Next().Should().BeOfType <ClusterClosingEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterClosedEvent>(); _capturedEvents.Any().Should().BeFalse(); }
internal MongoUrl(MongoUrlBuilder builder) { _allowInsecureTls = builder.AllowInsecureTls; _applicationName = builder.ApplicationName; _authenticationMechanism = builder.AuthenticationMechanism; _authenticationMechanismProperties = builder.AuthenticationMechanismProperties; _authenticationSource = builder.AuthenticationSource; _compressors = builder.Compressors; #pragma warning disable CS0618 // Type or member is obsolete if (builder.ConnectionModeSwitch == ConnectionModeSwitch.UseConnectionMode) { _connectionMode = builder.ConnectionMode; } _connectionModeSwitch = builder.ConnectionModeSwitch; #pragma warning restore CS0618 // Type or member is obsolete _connectTimeout = builder.ConnectTimeout; _databaseName = builder.DatabaseName; #pragma warning disable CS0618 // Type or member is obsolete if (builder.ConnectionModeSwitch == ConnectionModeSwitch.UseDirectConnection) { _directConnection = builder.DirectConnection; } #pragma warning restore CS0618 // Type or member is obsolete _fsync = builder.FSync; #pragma warning disable 618 if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2) { _guidRepresentation = builder.GuidRepresentation; } #pragma warning restore 618 _heartbeatInterval = builder.HeartbeatInterval; _heartbeatTimeout = builder.HeartbeatTimeout; _ipv6 = builder.IPv6; _isResolved = builder.Scheme != ConnectionStringScheme.MongoDBPlusSrv; _journal = builder.Journal; _loadBalanced = builder.LoadBalanced; _localThreshold = builder.LocalThreshold; _maxConnecting = builder.MaxConnecting; _maxConnectionIdleTime = builder.MaxConnectionIdleTime; _maxConnectionLifeTime = builder.MaxConnectionLifeTime; _maxConnectionPoolSize = builder.MaxConnectionPoolSize; _minConnectionPoolSize = builder.MinConnectionPoolSize; _password = builder.Password; _readConcernLevel = builder.ReadConcernLevel; _readPreference = builder.ReadPreference; _replicaSetName = builder.ReplicaSetName; _retryReads = builder.RetryReads; _retryWrites = builder.RetryWrites; _scheme = builder.Scheme; _servers = builder.Servers; _serverSelectionTimeout = builder.ServerSelectionTimeout; _socketTimeout = builder.SocketTimeout; _srvMaxHosts = builder.SrvMaxHosts; _tlsDisableCertificateRevocationCheck = builder.TlsDisableCertificateRevocationCheck; _username = builder.Username; _useTls = builder.UseTls; _w = builder.W; #pragma warning disable 618 _waitQueueMultiple = builder.WaitQueueMultiple; _waitQueueSize = builder.WaitQueueSize; #pragma warning restore 618 _waitQueueTimeout = builder.WaitQueueTimeout; _wTimeout = builder.WTimeout; _url = builder.ToString(); // keep canonical form }