Beispiel #1
0
 // 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);
 }
Beispiel #2
0
        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>();
            }
        }
Beispiel #3
0
        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;
 }
Beispiel #5
0
        // 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();
        }
Beispiel #7
0
        // 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;
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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");
                }
            }
        }
Beispiel #11
0
        // 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;
        }
Beispiel #13
0
        // 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);
 }
Beispiel #15
0
        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());
                }
            }
        }
Beispiel #16
0
 // 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();
        }
Beispiel #19
0
        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();
        }
Beispiel #20
0
        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
        }