Пример #1
0
        internal static IDriver CreateDriver(Uri uri, Config config, IPooledConnectionFactory connectionFactory)
        {
            var logger = config.Logger;

            var parsedUri       = uri.ParseBoltUri(DefaultBoltPort);
            var routingContext  = uri.ParseRoutingContext();
            var routingSettings = new RoutingSettings(parsedUri, routingContext, config);

            var metrics = config.MetricsEnabled ? new DefaultMetrics() : null;
            var connectionPoolSettings = new ConnectionPoolSettings(config, metrics);

            var retryLogic = new AsyncRetryLogic(config.MaxTransactionRetryTime, logger);

            IConnectionProvider connectionProvider = null;

            if (parsedUri.IsRoutingUri())
            {
                connectionProvider =
                    new LoadBalancer(connectionFactory, routingSettings, connectionPoolSettings, logger);
            }
            else
            {
                EnsureNoRoutingContext(uri, routingContext);
                connectionProvider =
                    new ConnectionPool(parsedUri, connectionFactory, connectionPoolSettings, logger);
            }

            return(new Internal.Driver(parsedUri, connectionProvider, retryLogic, logger, metrics, config));
        }
Пример #2
0
        internal static IDriver CreateDriver(Uri uri, Config config, IPooledConnectionFactory connectionFactory)
        {
            var logger = config.Logger;

            var parsedUri       = uri.ParseBoltUri(DefaultBoltPort);
            var routingContext  = uri.ParseRoutingContext();
            var routingSettings = new RoutingSettings(parsedUri, routingContext, config);

            var metrics = config.MetricsFactory?.CreateMetrics(config);
            var connectionPoolSettings = new ConnectionPoolSettings(config, metrics);

            var retryLogic = new ExponentialBackoffRetryLogic(config.MaxTransactionRetryTime, logger);

            IConnectionProvider connectionProvider = null;

            switch (parsedUri.Scheme.ToLower())
            {
            case "bolt":
                EnsureNoRoutingContext(uri, routingContext);
                connectionProvider = new ConnectionPool(parsedUri, connectionFactory, connectionPoolSettings, logger);
                break;

            case "bolt+routing":
                connectionProvider = new LoadBalancer(connectionFactory, routingSettings, connectionPoolSettings, logger);
                break;

            default:
                throw new NotSupportedException($"Unsupported URI scheme: {parsedUri.Scheme}");
            }

            return(new Internal.Driver(parsedUri, connectionProvider, retryLogic, logger, metrics));
        }
Пример #3
0
 public SharedConnectionPoolFactory(
     IConnectionFactory connectionFactory,
     ConnectionPoolSettings connectionPoolSettings)
 {
     _connectionFactory      = Ensure.IsNotNull(connectionFactory, "connectionFactory");
     _connectionPoolSettings = Ensure.IsNotNull(connectionPoolSettings, "connectionPoolSettings");
 }
Пример #4
0
        public void GetChannel_should_update_topology_and_clear_connection_pool_on_network_error_or_timeout(
            [Values("TimedOutSocketException", "NetworkUnreachableSocketException")] string errorType,
            [Values(false, true)] bool async)
        {
            var serverId           = new ServerId(_clusterId, _endPoint);
            var connectionId       = new ConnectionId(serverId);
            var innerMostException = CoreExceptionHelper.CreateException(errorType);

            var openConnectionException = new MongoConnectionException(connectionId, "Oops", new IOException("Cry", innerMostException));
            var mockConnection          = new Mock <IConnectionHandle>();

            mockConnection.Setup(c => c.Open(It.IsAny <CancellationToken>())).Throws(openConnectionException);
            mockConnection.Setup(c => c.OpenAsync(It.IsAny <CancellationToken>())).ThrowsAsync(openConnectionException);

            var connectionFactory = new Mock <IConnectionFactory>();

            connectionFactory.Setup(cf => cf.CreateConnection(serverId, _endPoint)).Returns(mockConnection.Object);

            var mockExceptionHandler   = new Mock <IConnectionExceptionHandler>();
            var connectionPoolSettings = new ConnectionPoolSettings();
            var connectionPool         = new ExclusiveConnectionPool(serverId, _endPoint, connectionPoolSettings, connectionFactory.Object, new EventAggregator(), mockExceptionHandler.Object);

            var mockConnectionPoolFactory = new Mock <IConnectionPoolFactory>();

            mockConnectionPoolFactory
            .Setup(f => f.CreateConnectionPool(It.IsAny <ServerId>(), _endPoint, It.IsAny <IConnectionExceptionHandler>()))
            .Returns(connectionPool);
            var mockMonitorServerDescription = new ServerDescription(serverId, _endPoint);
            var mockServerMonitor            = new Mock <IServerMonitor>();

            mockServerMonitor.SetupGet(m => m.Description).Returns(mockMonitorServerDescription);
            mockServerMonitor.SetupGet(m => m.Lock).Returns(new object());
            var mockServerMonitorFactory = new Mock <IServerMonitorFactory>();

            mockServerMonitorFactory.Setup(f => f.Create(It.IsAny <ServerId>(), _endPoint)).Returns(mockServerMonitor.Object);

            var subject = new DefaultServer(_clusterId, _clusterClock, _clusterConnectionMode, _connectionModeSwitch, _directConnection, _settings, _endPoint, mockConnectionPoolFactory.Object, mockServerMonitorFactory.Object, _capturedEvents, _serverApi);

            connectionPool._connectionExceptionHandler(subject);
            subject.Initialize();
            connectionPool.SetReady();

            IChannelHandle channel = null;
            Exception      exception;

            if (async)
            {
                exception = Record.Exception(() => channel = subject.GetChannelAsync(CancellationToken.None).GetAwaiter().GetResult());
            }
            else
            {
                exception = Record.Exception(() => channel = subject.GetChannel(CancellationToken.None));
            }

            channel.Should().BeNull();
            exception.Should().Be(openConnectionException);
            subject.Description.Type.Should().Be(ServerType.Unknown);
            subject.Description.ReasonChanged.Should().Contain("ChannelException during handshake");
        }
 public ClusterConnectionPool(
     IEnumerable <Uri> initUris,
     IPooledConnectionFactory connectionFactory,
     ConnectionPoolSettings poolSettings,
     ILogger logger
     ) : this(initUris, new ConnectionPoolFactory(connectionFactory, poolSettings, logger), logger)
 {
 }
Пример #6
0
        /// <summary>
        ///     Returns a driver for a Neo4j instance with custom configuration.
        /// </summary>
        /// <param name="uri">
        ///     The URI to the Neo4j instance. Should be in the form
        ///     <c>bolt://&lt;server location&gt;:&lt;port&gt;</c>. If <c>port</c> is not supplied the default of <c>7687</c> will
        ///     be used.</param>
        /// <param name="authToken">Authentication to use, <see cref="AuthTokens" />.</param>
        /// <param name="config">
        ///     Configuration for the driver instance to use, if <c>null</c> <see cref="Config.DefaultConfig" />
        ///     is used.
        /// </param>
        /// <returns>A new driver to the database instance specified by the <paramref name="uri"/>.</returns>
        public static IDriver Driver(Uri uri, IAuthToken authToken, Config config = null)
        {
            config = config ?? Config.DefaultConfig;
            var encryptionManager      = new EncryptionManager(config.EncryptionLevel, config.TrustStrategy, config.Logger);
            var connectionPoolSettings = new ConnectionPoolSettings(config.MaxIdleSessionPoolSize);

            return(new Internal.Driver(uri, authToken, encryptionManager, connectionPoolSettings, config.Logger));
        }
 public ConnectionPoolFactory(IPooledConnectionFactory connectionFactory, ConnectionPoolSettings poolSettings,
                              ILogger logger)
 {
     Throw.ArgumentNullException.IfNull(connectionFactory, nameof(connectionFactory));
     Throw.ArgumentNullException.IfNull(poolSettings, nameof(poolSettings));
     _connectionFactory = connectionFactory;
     _poolSettings      = poolSettings;
     _logger            = logger;
 }
 // private methods
 private ExclusiveConnectionPool CreateSubject(ConnectionPoolSettings connectionPoolSettings = null)
 {
     return(new ExclusiveConnectionPool(
                _serverId,
                _endPoint,
                connectionPoolSettings ?? _settings,
                _mockConnectionFactory.Object,
                _capturedEvents));
 }
Пример #9
0
 internal ClusterConnectionPool(IConnectionPool connectionPool,
                                ConcurrentDictionary <Uri, IConnectionPool> clusterPool = null,
                                ConnectionPoolSettings poolSettings = null,
                                ILogger logger = null) :
     this(null, null, null, poolSettings, logger, null)
 {
     _fakeConnectionPool = connectionPool;
     _pools = clusterPool;
 }
Пример #10
0
 private ConnectionPoolSettings ConfigureConnectionPool(ConnectionPoolSettings settings, ClusterKey clusterKey)
 {
     return(settings.With(
                // maintenanceInterval: TODO: should this be configurable?
                maxConnections: clusterKey.MaxConnectionPoolSize,
                minConnections: clusterKey.MinConnectionPoolSize,
                waitQueueSize: clusterKey.WaitQueueSize,
                waitQueueTimeout: clusterKey.WaitQueueTimeout));
 }
Пример #11
0
 public ClusterConnectionPool(
     ConnectionSettings connectionSettings,
     ConnectionPoolSettings poolSettings,
     ILogger logger
     )
     : base(logger)
 {
     _connectionSettings = connectionSettings;
     _poolSettings       = poolSettings;
 }
 public ConnectionPoolFactory(IPooledConnectionFactory connectionFactory, ConnectionPoolSettings poolSettings,
                              IDictionary <string, string> routingContext, ILogger logger)
 {
     Throw.ArgumentNullException.IfNull(connectionFactory, nameof(connectionFactory));
     Throw.ArgumentNullException.IfNull(poolSettings, nameof(poolSettings));
     _connectionFactory = connectionFactory;
     _poolSettings      = poolSettings;
     _logger            = logger;
     _routingContext    = routingContext;
 }
        public void ConnectionPoolAfterOpening(ServerId serverId, ConnectionPoolSettings settings)
        {
            var serverPackage = GetServerPackage(serverId.EndPoint);
            ConnectionPoolPerformanceRecorder recorder = new ConnectionPoolPerformanceRecorder(settings.MaxConnections, _appPackage, serverPackage);

            if (_connectionPoolRecorders.TryAdd(serverId, recorder))
            {
                recorder.Opened();
            }
        }
 public void Setup()
 {
     _connectionFactory = Substitute.For <IConnectionFactory>();
     _endPoint          = new DnsEndPoint("localhost", 27017);
     _serverId          = new ServerId(new ClusterId(), _endPoint);
     _settings          = new ConnectionPoolSettings()
                          .WithMaintenanceInterval(Timeout.InfiniteTimeSpan)
                          .WithMaxConnections(4)
                          .WithMinConnections(2)
                          .WithWaitQueueSize(1);
 }
 public void Setup()
 {
     _connectionFactory = Substitute.For <IConnectionFactory>();
     _endPoint          = new DnsEndPoint("localhost", 27017);
     _serverId          = new ServerId(new ClusterId(), _endPoint);
     _settings          = new ConnectionPoolSettings(
         maintenanceInterval: Timeout.InfiniteTimeSpan,
         maxConnections: 4,
         minConnections: 2,
         waitQueueSize: 1);
 }
 // constructors
 public SharedConnectionPool(
     ServerId serverId,
     EndPoint endPoint,
     ConnectionPoolSettings settings,
     IConnectionFactory connectionFactory)
 {
     _serverId          = Ensure.IsNotNull(serverId, "serverId");
     _endPoint          = Ensure.IsNotNull(endPoint, "endPoint");
     _settings          = Ensure.IsNotNull(settings, "settings");
     _connectionFactory = Ensure.IsNotNull(connectionFactory, "connectionFactory");
 }
 public ExclusiveConnectionPoolFactoryTests()
 {
     _connectionFactory = new Mock <IConnectionFactory>().Object;
     _endPoint          = new DnsEndPoint("localhost", 27017);
     _serverId          = new ServerId(new ClusterId(), _endPoint);
     _eventSubscriber   = new Mock <IEventSubscriber>().Object;
     _settings          = new ConnectionPoolSettings(
         maintenanceInterval: Timeout.InfiniteTimeSpan,
         maxConnections: 4,
         minConnections: 2,
         waitQueueSize: 1);
 }
            public void ShouldEnsureInitialRouter()
            {
                var uris = new HashSet <Uri> {
                    new Uri("bolt://123:456")
                };
                var connFactory  = new Mock <IPooledConnectionFactory>().Object;
                var poolSettings = new ConnectionPoolSettings(Config.DefaultConfig);
                var pool         = new ClusterConnectionPool(uris, connFactory, poolSettings, null);

                pool.ToString().Should().Be(
                    "[{bolt://123:456/ : _idleConnections: {[]}, _inUseConnections: {[]}}]");
            }
Пример #19
0
        public LoadBalancer(
            IPooledConnectionFactory connectionFactory,
            RoutingSettings routingSettings,
            ConnectionPoolSettings poolSettings,
            IDriverLogger logger)
        {
            _logger = logger;

            _clusterConnectionPool = new ClusterConnectionPool(Enumerable.Empty <Uri>(), connectionFactory, poolSettings, logger);
            _routingTableManager   = new RoutingTableManager(routingSettings, this, logger);
            _loadBalancingStrategy = CreateLoadBalancingStrategy(routingSettings.Strategy, _clusterConnectionPool, _logger);
        }
        public void GetChannel_should_not_update_topology_and_clear_connection_pool_on_MongoConnectionException(
            [Values("TimedOutSocketException", "NetworkUnreachableSocketException")] string errorType,
            [Values(false, true)] bool async)
        {
            var serverId                       = new ServerId(_clusterId, _endPoint);
            var connectionId                   = new ConnectionId(serverId);
            var innerMostException             = CoreExceptionHelper.CreateException(errorType);
            var mockConnectionExceptionHandler = new Mock <IConnectionExceptionHandler>();

            var openConnectionException = new MongoConnectionException(connectionId, "Oops", new IOException("Cry", innerMostException));
            var mockConnection          = new Mock <IConnectionHandle>();

            mockConnection.Setup(c => c.Open(It.IsAny <CancellationToken>())).Throws(openConnectionException);
            mockConnection.Setup(c => c.OpenAsync(It.IsAny <CancellationToken>())).ThrowsAsync(openConnectionException);

            var connectionFactory = new Mock <IConnectionFactory>();

            connectionFactory.Setup(cf => cf.CreateConnection(serverId, _endPoint)).Returns(mockConnection.Object);

            var connectionPoolSettings = new ConnectionPoolSettings();
            var connectionPool         = new ExclusiveConnectionPool(serverId, _endPoint, connectionPoolSettings, connectionFactory.Object, new EventAggregator(), mockConnectionExceptionHandler.Object);

            var mockConnectionPoolFactory = new Mock <IConnectionPoolFactory>();

            mockConnectionPoolFactory
            .Setup(f => f.CreateConnectionPool(It.IsAny <ServerId>(), _endPoint, It.IsAny <IConnectionExceptionHandler>()))
            .Returns(connectionPool);

            var subject = new LoadBalancedServer(_clusterId, _clusterClock, _settings, _endPoint, mockConnectionPoolFactory.Object, _capturedEvents, _serverApi);

            subject.Initialize();

            IChannelHandle channel = null;
            Exception      exception;

            if (async)
            {
                exception = Record.Exception(() => channel = subject.GetChannelAsync(CancellationToken.None).GetAwaiter().GetResult());
            }
            else
            {
                exception = Record.Exception(() => channel = subject.GetChannel(CancellationToken.None));
            }

            channel.Should().BeNull();
            exception.Should().Be(openConnectionException);
            subject.Description.Type.Should().Be(ServerType.LoadBalanced);
            subject.Description.ReasonChanged.Should().Be("Initialized");
            subject.Description.State.Should().Be(ServerState.Connected);

            _mockConnectionPool.Verify(c => c.Clear(It.IsAny <bool>()), Times.Never);
        }
Пример #21
0
        public LoadBalancer(
            IPooledConnectionFactory connectionFactory,
            RoutingSettings routingSettings,
            ConnectionPoolSettings poolSettings,
            ILogger logger)
        {
            _logger = logger;

            _clusterConnectionPool =
                new ClusterConnectionPool(Enumerable.Empty <Uri>(), connectionFactory, poolSettings, logger);
            _routingTableManager          = new RoutingTableManager(routingSettings, this, logger);
            _loadBalancingStrategy        = CreateLoadBalancingStrategy(_clusterConnectionPool, _logger);
            _initialServerAddressProvider = routingSettings.InitialServerAddressProvider;
        }
            public void ShouldEnsureInitialRouter()
            {
                var uri             = new Uri("bolt://123:456");
                var config          = Config.DefaultConfig;
                var routingSettings = new RoutingSettings(new Dictionary <string, string>());
                var connSettings    = new ConnectionSettings(uri, new Mock <IAuthToken>().Object, config);
                var poolSettings    = new ConnectionPoolSettings(config);

                var loadbalancer = new LoadBalancer(routingSettings, connSettings, poolSettings, null);

                loadbalancer.ToString().Should().Be(
                    "_routingTable: {[_routers: bolt://123:456/], [_detachedRouters: ], [_readers: ], [_writers: ]}, " +
                    "_clusterConnectionPool: {[{bolt://123:456/ : _availableConnections: {[]}, _inUseConnections: {[]}}]}");
            }
Пример #23
0
        public LoadBalancer(
            IPooledConnectionFactory connectionFactory,
            RoutingSettings routingSettings,
            ConnectionPoolSettings poolSettings,
            ILogger logger)
        {
            _logger = logger;
            var uris = routingSettings.InitialServers;

            _clusterConnectionPool = new ClusterConnectionPool(uris, connectionFactory, poolSettings, logger);
            _routingTableManager   = new RoutingTableManager(routingSettings, this, logger);

            _loadBalancingStrategy = CreateLoadBalancingStrategy(routingSettings.Strategy, _clusterConnectionPool, logger);
        }
            public void ShouldNotThrowExceptionWhenIdlePoolSizeReached()
            {
                var connectionPoolSettings = new ConnectionPoolSettings(2, Config.Infinite);
                var pool = new ConnectionPool(MockedConnection, settings: connectionPoolSettings);

                pool.Acquire();
                pool.Acquire();
                pool.NumberOfAvailableConnections.Should().Be(0);
                pool.NumberOfInUseConnections.Should().Be(2);

                var ex = Record.Exception(() => pool.Acquire());

                ex.Should().BeNull();
            }
Пример #25
0
        public void ShouldThrowOnExecutionOfMultiConnectionInPool()
        {
            var host      = "localhost";
            var port      = 8182;
            var sessionId = Guid.NewGuid().ToString();
            // set pool size more than 1
            var poolSettings = new ConnectionPoolSettings {
                PoolSize = 2
            };

            var gremlinServer = new GremlinServer(host, port);

            Assert.Throws <ArgumentOutOfRangeException>(() => new GremlinClient(gremlinServer, connectionPoolSettings: poolSettings, sessionId: sessionId));
        }
        private void ParseSettings(
            BsonDocument test,
            out ConnectionPoolSettings connectionPoolSettings,
            out ConnectionSettings connectionSettings)
        {
            connectionPoolSettings = new ConnectionPoolSettings(maintenanceInterval: TimeSpan.FromMilliseconds(200));
            connectionSettings     = new ConnectionSettings();

            if (test.TryGetValue(Schema.poolOptions, out var poolOptionsBson))
            {
                var poolOptionsDocument = poolOptionsBson.AsBsonDocument;
                foreach (var poolOption in poolOptionsDocument.Elements)
                {
                    switch (poolOption.Name)
                    {
                    case "backgroundThreadIntervalMS":
                        connectionPoolSettings = connectionPoolSettings.With(maintenanceInterval: TimeSpan.FromMilliseconds(poolOption.Value.ToInt32()));
                        break;

                    case "maxPoolSize":
                        connectionPoolSettings = connectionPoolSettings.With(maxConnections: poolOption.Value.ToInt32());
                        break;

                    case "minPoolSize":
                        connectionPoolSettings = connectionPoolSettings.With(minConnections: poolOption.Value.ToInt32());
                        break;

                    case "waitQueueTimeoutMS":
                        connectionPoolSettings = connectionPoolSettings.With(waitQueueTimeout: TimeSpan.FromMilliseconds(poolOption.Value.ToInt32()));
                        break;

                    case "maxIdleTimeMS":
                        connectionSettings = connectionSettings.With(maxIdleTime: TimeSpan.FromMilliseconds(poolOption.Value.ToInt32()));
                        break;

                    case "appName":
                        connectionSettings = connectionSettings.With(applicationName: poolOption.Value.AsString);
                        break;

                    case "maxConnecting":
                        connectionPoolSettings = connectionPoolSettings.With(maxConnecting: poolOption.Value.ToInt32());
                        break;

                    default:
                        throw new ArgumentException($"Unknown pool option {poolOption.Name}.");
                    }
                }
            }
        }
            public void ShouldAcquireFromPoolIfAvailable()
            {
                var connectionPoolSettings = new ConnectionPoolSettings(2, Config.Infinite);
                var pool = new ConnectionPool(MockedConnection, settings: connectionPoolSettings);

                for (var i = 0; i < 4; i++)
                {
                    var conn = pool.Acquire();
                    pool.NumberOfAvailableConnections.Should().Be(0);
                    conn.Dispose();
                    pool.NumberOfAvailableConnections.Should().Be(1);
                }

                pool.NumberOfAvailableConnections.Should().Be(1);
            }
Пример #28
0
        internal RoutingDriver(
            Uri seedServer,
            IAuthToken authToken,
            EncryptionManager encryptionManager,
            ConnectionPoolSettings poolSettings,
            ILogger logger)
        {
            Throw.ArgumentNullException.IfNull(seedServer, nameof(seedServer));
            Throw.ArgumentNullException.IfNull(authToken, nameof(authToken));
            Throw.ArgumentNullException.IfNull(encryptionManager, nameof(encryptionManager));
            Throw.ArgumentNullException.IfNull(poolSettings, nameof(poolSettings));

            Uri           = seedServer;
            _logger       = logger;
            _loadBalancer = new RoundRobinLoadBalancer(seedServer, authToken, encryptionManager, poolSettings, _logger);
        }
Пример #29
0
        public RoundRobinLoadBalancer(
            Uri seedServer,
            IAuthToken authToken,
            EncryptionManager encryptionManager,
            ConnectionPoolSettings poolSettings,
            ILogger logger)
        {
            _clusterConnectionPool = new ClusterConnectionPool(
                seedServer, authToken, encryptionManager,
                poolSettings, logger, CreateClusterPooledConnectionErrorHandler);

            _stopwatch   = new Stopwatch();
            _clusterView = new RoundRobinClusterView(seedServer, _stopwatch);

            _logger = logger;
        }
            public void ShouldEnsureInitialRouter()
            {
                var uri  = new Uri("bolt://123:456");
                var uris = new HashSet <Uri> {
                    uri
                };
                var connFactory    = new Mock <IPooledConnectionFactory>().Object;
                var poolSettings   = new ConnectionPoolSettings(Config.Default);
                var routingSetting = new RoutingSettings(uri, new Dictionary <string, string>(), Config.Default);
                var pool           = new ClusterConnectionPool(uris, connFactory, routingSetting, poolSettings, null);

                pool.ToString().Should().Contain(
                    "bolt://123:456/");

                pool.ToString().Should().Contain(
                    "_idleConnections: {[]}, _inUseConnections: {[]}");
            }