Esempio n. 1
0
        public void Should_OnlyDisposePoliciesOnce_When_NoProfileIsProvided()
        {
            var lbp        = new FakeLoadBalancingPolicy();
            var sep        = new FakeSpeculativeExecutionPolicy();
            var testConfig = new TestConfigurationBuilder()
            {
                ControlConnectionFactory = new FakeControlConnectionFactory(),
                ConnectionFactory        = new FakeConnectionFactory(),
                Policies = new Cassandra.Policies(
                    lbp,
                    new ConstantReconnectionPolicy(50),
                    new DefaultRetryPolicy(),
                    sep,
                    new AtomicMonotonicTimestampGenerator())
            }.Build();
            var initializerMock = Mock.Of <IInitializer>();

            Mock.Get(initializerMock)
            .Setup(i => i.ContactPoints)
            .Returns(new List <IPEndPoint> {
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9042)
            });
            Mock.Get(initializerMock)
            .Setup(i => i.GetConfiguration())
            .Returns(testConfig);

            var cluster = Cluster.BuildFrom(initializerMock, new List <string>(), testConfig);

            cluster.Connect();
            cluster.Dispose();

            Assert.AreEqual(1, sep.DisposeCount);
        }
Esempio n. 2
0
        public async Task Should_UseStatementSettings_When_StatementSettingsAreSet(RequestTypeTestCase requestType)
        {
            var lbpCluster  = new FakeLoadBalancingPolicy();
            var sepCluster  = new FakeSpeculativeExecutionPolicy();
            var rpCluster   = new FakeRetryPolicy();
            var lbp         = new FakeLoadBalancingPolicy();
            var sep         = new FakeSpeculativeExecutionPolicy();
            var rp          = new FakeRetryPolicy();
            var rpStatement = new FakeRetryPolicy();
            var profile     = ((ExecutionProfileBuilder) new ExecutionProfileBuilder()
                               .WithConsistencyLevel(ConsistencyLevel.All)
                               .WithSerialConsistencyLevel(ConsistencyLevel.Serial)
                               .WithReadTimeoutMillis(50)
                               .WithLoadBalancingPolicy(lbp)
                               .WithSpeculativeExecutionPolicy(sep)
                               .WithRetryPolicy(rp)
                               ).Build();

            var mockResult = BuildRequestHandler(
                BuildStatement(requestType)
                .SetIdempotence(true)
                .SetConsistencyLevel(ConsistencyLevel.EachQuorum)
                .SetReadTimeoutMillis(400)
                .SetSerialConsistencyLevel(ConsistencyLevel.LocalSerial)
                .SetRetryPolicy(rpStatement),
                builder =>
            {
                builder.QueryOptions =
                    new QueryOptions()
                    .SetConsistencyLevel(ConsistencyLevel.LocalOne)
                    .SetSerialConsistencyLevel(ConsistencyLevel.LocalSerial);
                builder.SocketOptions =
                    new SocketOptions().SetReadTimeoutMillis(10);
                builder.Policies = new Cassandra.Policies(
                    lbpCluster, new ConstantReconnectionPolicy(5), rpCluster, sepCluster, new AtomicMonotonicTimestampGenerator());
            },
                profile);

            await mockResult.RequestHandler.SendAsync().ConfigureAwait(false);

            var results = mockResult.SendResults.ToArray();

            Assert.GreaterOrEqual(results.Length, 1);
            var timeouts = results.Select(r => r.TimeoutMillis).ToList();

            Assert.Greater(results.Length, 0);
            Assert.AreEqual(ConsistencyLevel.EachQuorum, GetConsistencyLevels(requestType, results).Distinct().Single());
            Assert.AreEqual(ConsistencyLevel.LocalSerial, GetSerialConsistencyLevels(requestType, results).Distinct().Single());
            Assert.AreEqual(400, timeouts.Distinct().Single());

            Assert.Greater(Interlocked.Read(ref lbp.Count), 0);
            Assert.Greater(Interlocked.Read(ref sep.Count), 0);
            Assert.Greater(Interlocked.Read(ref rpStatement.Count), 0);
            Assert.AreEqual(0, Interlocked.Read(ref lbpCluster.Count));
            Assert.AreEqual(0, Interlocked.Read(ref sepCluster.Count));
            Assert.AreEqual(0, Interlocked.Read(ref rpCluster.Count));
            Assert.AreEqual(0, Interlocked.Read(ref rp.Count));
        }
Esempio n. 3
0
        public void Should_OnlyInitializeRelevantPolicies_When_PoliciesAreProvidedByDefaultProfile()
        {
            var lbp1       = new FakeLoadBalancingPolicy();
            var sep1       = new FakeSpeculativeExecutionPolicy();
            var lbp2       = new FakeLoadBalancingPolicy();
            var sep2       = new FakeSpeculativeExecutionPolicy();
            var testConfig = new TestConfigurationBuilder()
            {
                ControlConnectionFactory = new FakeControlConnectionFactory(),
                ConnectionFactory        = new FakeConnectionFactory(),
                Policies = new Cassandra.Policies(
                    lbp1,
                    new ConstantReconnectionPolicy(50),
                    new DefaultRetryPolicy(),
                    sep1,
                    new AtomicMonotonicTimestampGenerator()),
                ExecutionProfiles = new Dictionary <string, IExecutionProfile>
                {
                    { Configuration.DefaultExecutionProfileName, new ExecutionProfile(null, null, null, lbp2, sep2, null, null) }
                }
            }.Build();
            var initializerMock = Mock.Of <IInitializer>();

            Mock.Get(initializerMock)
            .Setup(i => i.ContactPoints)
            .Returns(new List <IPEndPoint> {
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9042)
            });
            Mock.Get(initializerMock)
            .Setup(i => i.GetConfiguration())
            .Returns(testConfig);

            var cluster = Cluster.BuildFrom(initializerMock, new List <string>(), testConfig);

            cluster.Connect();

            Assert.AreEqual(0, lbp1.InitializeCount);
            Assert.AreEqual(0, sep1.InitializeCount);
            Assert.AreEqual(1, lbp2.InitializeCount);
            Assert.AreEqual(1, sep2.InitializeCount);
        }
Esempio n. 4
0
        public async Task Should_SendRequestToFirstHostOnly_When_PrepareOnAllHostsIsFalseAndAllHostsHaveConnectionsButFirstHostPoolDoesntHaveConnections()
        {
            var lbpCluster = new FakeLoadBalancingPolicy();
            var mockResult = BuildPrepareHandler(
                builder =>
            {
                builder.QueryOptions =
                    new QueryOptions()
                    .SetConsistencyLevel(ConsistencyLevel.LocalOne)
                    .SetSerialConsistencyLevel(ConsistencyLevel.LocalSerial)
                    .SetPrepareOnAllHosts(false);
                builder.SocketOptions =
                    new SocketOptions().SetReadTimeoutMillis(10);
                builder.Policies = new Cassandra.Policies(
                    lbpCluster,
                    new ConstantReconnectionPolicy(5),
                    new DefaultRetryPolicy(),
                    NoSpeculativeExecutionPolicy.Instance,
                    new AtomicMonotonicTimestampGenerator());
            });

            // mock connection send
            mockResult.ConnectionFactory.OnCreate += connection =>
            {
                Mock.Get(connection)
                .Setup(c => c.Send(It.IsAny <IRequest>()))
                .Returns <IRequest>(async req =>
                {
                    mockResult.SendResults.Enqueue(new ConnectionSendResult {
                        Connection = connection, Request = req
                    });
                    await Task.Delay(1).ConfigureAwait(false);
                    return(new ProxyResultResponse(
                               ResultResponse.ResultResponseKind.Void,
                               new OutputPrepared(new byte[0], new RowSetMetadata {
                        Columns = new CqlColumn[0]
                    })));
                });
            };
            var queryPlan = mockResult.Session.InternalCluster.GetResolvedEndpoints().Select(x => new Host(x.Value.First())).ToList();
            await mockResult.Session.GetOrCreateConnectionPool(queryPlan[1], HostDistance.Local).Warmup().ConfigureAwait(false);

            await mockResult.Session.GetOrCreateConnectionPool(queryPlan[2], HostDistance.Local).Warmup().ConfigureAwait(false);

            var pools = mockResult.Session.GetPools().ToList();

            Assert.AreEqual(2, pools.Count);
            var distanceCount = Interlocked.Read(ref lbpCluster.DistanceCount);
            var request       = new InternalPrepareRequest("TEST");

            await mockResult.PrepareHandler.Prepare(
                request,
                mockResult.Session,
                queryPlan.GetEnumerator()).ConfigureAwait(false);

            var results = mockResult.SendResults.ToArray();

            pools = mockResult.Session.GetPools().ToList();
            Assert.AreEqual(3, pools.Count);
            Assert.AreEqual(1, results.Length);
            Assert.AreEqual(distanceCount + 1, Interlocked.Read(ref lbpCluster.DistanceCount), 1);
            Assert.AreEqual(Interlocked.Read(ref lbpCluster.NewQueryPlanCount), 0);
            Assert.AreEqual(3, mockResult.ConnectionFactory.CreatedConnections.Count);
            Assert.LessOrEqual(1, mockResult.ConnectionFactory.CreatedConnections[queryPlan[0].Address].Count);
            Assert.LessOrEqual(1, mockResult.ConnectionFactory.CreatedConnections[queryPlan[1].Address].Count);
            Assert.LessOrEqual(1, mockResult.ConnectionFactory.CreatedConnections[queryPlan[2].Address].Count);
            // Assert that pool of first host contains only one connection that was called send
            var poolConnections =
                pools
                .Select(p => p.Value.ConnectionsSnapshot.Intersect(results.Select(r => r.Connection)))
                .Where(p => mockResult.ConnectionFactory.CreatedConnections[queryPlan[0].Address].Contains(p.SingleOrDefault()))
                .ToList();

            Assert.AreEqual(1, poolConnections.Count);
            foreach (var pool in poolConnections)
            {
                Mock.Get(pool.Single()).Verify(c => c.Send(request), Times.Once);
            }
        }