Beispiel #1
0
        private IInternalCluster GetCluster(bool withProfiles, int eventDelayMilliseconds = 5)
        {
            var cluster  = Mock.Of <IInternalCluster>();
            var config   = GetConfig(eventDelayMilliseconds, withProfiles);
            var metadata = new Metadata(config)
            {
                ControlConnection = Mock.Of <IControlConnection>()
            };

            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.ProtocolVersion).Returns(ProtocolVersion.V4);
            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.EndPoint).Returns(new ConnectionEndPoint(new IPEndPoint(IPAddress.Parse("10.10.10.10"), 9011), null));
            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.LocalAddress).Returns(new IPEndPoint(IPAddress.Parse("10.10.10.2"), 9015));
            var hostIp  = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9042);
            var hostIp2 = new IPEndPoint(IPAddress.Parse("127.0.0.2"), 9042);

            metadata.SetResolvedContactPoints(new Dictionary <string, IEnumerable <IPEndPoint> >
            {
                { "localhost", new IPEndPoint[] { hostIp } }
            });
            metadata.AddHost(hostIp);
            metadata.AddHost(hostIp2);
            metadata.Hosts.ToCollection().First().Datacenter = "dc123";
            Mock.Get(cluster).SetupGet(m => m.Configuration).Returns(config);
            Mock.Get(cluster).SetupGet(m => m.Metadata).Returns(metadata);
            Mock.Get(cluster).Setup(c => c.AllHosts()).Returns(metadata.AllHosts);
            return(cluster);
        }
Beispiel #2
0
        public IControlConnection Create(
            IInternalCluster cluster,
            IProtocolEventDebouncer protocolEventDebouncer,
            ProtocolVersion initialProtocolVersion,
            Configuration config,
            Metadata metadata,
            IEnumerable <object> contactPoints)
        {
            var cc = Mock.Of <IControlConnection>();

            Mock.Get(cc).Setup(c => c.InitAsync()).Returns(Task.Run(() =>
            {
                var cps = new Dictionary <string, IEnumerable <IPEndPoint> >();

                foreach (var cp in contactPoints)
                {
                    if (cp is string cpStr && IPAddress.TryParse(cpStr, out var addr))
                    {
                        var host = metadata.AddHost(new IPEndPoint(addr, config.ProtocolOptions.Port));
                        host.SetInfo(BuildRow());
                        Mock.Get(cc).Setup(c => c.Host).Returns(host);
                        cps.Add(cpStr, new List <IPEndPoint> {
                            host.Address
                        });
                    }
        public void Should_Reconnect_After_Several_Failed_Attempts()
        {
            var lbp    = new RoundRobinPolicy();
            var config = new Configuration(
                new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
                new ProtocolOptions(),
                null,
                new SocketOptions(),
                new ClientOptions(),
                NoneAuthProvider.Instance,
                null,
                new QueryOptions(),
                new DefaultAddressTranslator());
            var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
            var metadata    = new Metadata(config);

            metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            var clusterMock = new Mock <ICluster>();

            clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
            lbp.Initialize(clusterMock.Object);
            using (var cc = NewInstance(testCluster, config))
            {
                cc.Init().Wait(InitTimeout);
                testCluster.Stop(1);
                Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
                Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
                Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
                Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
                testCluster.Start(1);
                Assert.DoesNotThrow(() => TaskHelper.WaitToComplete(cc.Reconnect()));
            }
            testCluster.ShutDown();
        }
Beispiel #4
0
        public IControlConnection Create(
            IInternalCluster cluster,
            IProtocolEventDebouncer protocolEventDebouncer,
            ProtocolVersion initialProtocolVersion,
            Configuration config,
            Metadata metadata,
            IEnumerable <IContactPoint> contactPoints)
        {
            var cc = Mock.Of <IControlConnection>();

            Mock.Get(cc).Setup(c => c.InitAsync()).Returns(Task.Run(async() =>
            {
                var cps = new Dictionary <IContactPoint, IEnumerable <IConnectionEndPoint> >();
                foreach (var cp in contactPoints)
                {
                    var connectionEndpoints = (await cp.GetConnectionEndPointsAsync(true).ConfigureAwait(false)).ToList();
                    cps.Add(cp, connectionEndpoints);
                    foreach (var connectionEndpoint in connectionEndpoints)
                    {
                        var endpt = connectionEndpoint.GetHostIpEndPointWithFallback();
                        var host  = metadata.AddHost(endpt, cp);
                        host.SetInfo(BuildRow());
                        Mock.Get(cc).Setup(c => c.Host).Returns(host);
                    }
                }
                metadata.SetResolvedContactPoints(cps);
            }));
            Mock.Get(cc).Setup(c => c.Serializer).Returns(new SerializerManager(ProtocolVersion.V3));
            return(cc);
        }
Beispiel #5
0
        public void UpdatePeersInfoModifiesPool()
        {
            var metadata = new Metadata(new Configuration());
            var cc       = new ControlConnection(GetCluster(), metadata);

            cc.Host = TestHelper.CreateHost("127.0.0.1");
            metadata.AddHost(cc.Host.Address);
            var hostAddress2 = IPAddress.Parse("127.0.0.2");
            var hostAddress3 = IPAddress.Parse("127.0.0.3");
            var rows         = TestHelper.CreateRows(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object> {
                    { "rpc_address", hostAddress2 }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, { "tokens", null }
                },
                new Dictionary <string, object> {
                    { "rpc_address", IPAddress.Parse("0.0.0.0") }, { "peer", hostAddress3 }, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, { "tokens", null }
                }
            });

            cc.UpdatePeersInfo(rows);
            Assert.AreEqual(3, metadata.AllHosts().Count);
            //using rpc_address
            var host2 = metadata.GetHost(new IPEndPoint(hostAddress2, ProtocolOptions.DefaultPort));

            Assert.NotNull(host2);
            Assert.AreEqual("ut-dc2", host2.Datacenter);
            Assert.AreEqual("ut-rack2", host2.Rack);
            //with rpc_address = 0.0.0.0, use peer
            var host3 = metadata.GetHost(new IPEndPoint(hostAddress3, ProtocolOptions.DefaultPort));

            Assert.NotNull(host3);
            Assert.AreEqual("ut-dc3", host3.Datacenter);
            Assert.AreEqual("ut-rack3", host3.Rack);
        }
        private IInternalCluster GetCluster()
        {
            var cluster  = Mock.Of <IInternalCluster>();
            var config   = GetConfig();
            var metadata = new Metadata(config)
            {
                ControlConnection = Mock.Of <IControlConnection>()
            };
            var contactPoint = new HostnameContactPoint(
                config.DnsResolver,
                config.ProtocolOptions,
                config.ServerNameResolver,
                config.KeepContactPointsUnresolved,
                "localhost");
            var connectionEndPoint = new ConnectionEndPoint(
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9011), config.ServerNameResolver, contactPoint);

            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.ProtocolVersion).Returns(ProtocolVersion.V4);
            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.EndPoint).Returns(connectionEndPoint);
            Mock.Get(metadata.ControlConnection).SetupGet(cc => cc.LocalAddress).Returns(new IPEndPoint(IPAddress.Parse("10.10.10.2"), 9015));
            var hostIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9042);

            metadata.SetResolvedContactPoints(new Dictionary <IContactPoint, IEnumerable <IConnectionEndPoint> >
            {
                { contactPoint, new [] { connectionEndPoint } }
            });
            metadata.AddHost(hostIp);
            metadata.Hosts.ToCollection().First().Datacenter = "dc123";
            Mock.Get(cluster).SetupGet(m => m.Configuration).Returns(config);
            Mock.Get(cluster).SetupGet(m => m.Metadata).Returns(metadata);
            Mock.Get(cluster).Setup(c => c.AllHosts()).Returns(metadata.AllHosts);
            return(cluster);
        }
        /// <summary>
        /// Parses system.local response, creates the local Host and adds it to the Hosts collection.
        /// </summary>
        private Host GetAndUpdateLocalHost(IConnectionEndPoint endPoint, IRow row)
        {
            var hostIpEndPoint = endPoint.GetOrParseHostIpEndPoint(row, _config.AddressTranslator, _config.ProtocolOptions.Port);
            var host           = _metadata.GetHost(hostIpEndPoint) ?? _metadata.AddHost(hostIpEndPoint, endPoint.ContactPoint);

            // Update cluster name, DC and rack for the one node we are connected to
            var clusterName = row.GetValue <string>("cluster_name");

            if (clusterName != null)
            {
                _metadata.ClusterName = clusterName;
            }

            host.SetInfo(row);
            return(host);
        }
 public void Should_Schedule_Reconnections_In_The_Background()
 {
     var lbp = new RoundRobinPolicy();
     var config = new Configuration(
         new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
         new ProtocolOptions(),
         null,
         new SocketOptions(),
         new ClientOptions(),
         NoneAuthProvider.Instance,
         null,
         new QueryOptions(),
         new DefaultAddressTranslator());
     var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
     var metadata = new Metadata(config);
     metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
     var clusterMock = new Mock<ICluster>();
     clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
     lbp.Initialize(clusterMock.Object);
     using (var cc = NewInstance(testCluster, config, metadata))
     {
         cc.Init();
         var host = metadata.Hosts.First();
         testCluster.Stop(1);
         host.SetDown();
         Thread.Sleep(2000);
         Assert.False(host.IsUp);
         testCluster.Start(1);
         host.BringUpIfDown();
         //Should reconnect using timer
         Thread.Sleep(5000);
         Assert.DoesNotThrow(() => cc.Query("SELECT key FROM system.local", false));
     }
     testCluster.ShutDown();
 }
 public void UpdatePeersInfoModifiesPool()
 {
     var metadata = new Metadata(new Configuration());
     var cc = NewInstance(metadata);
     cc.Host = TestHelper.CreateHost("127.0.0.1");
     metadata.AddHost(cc.Host.Address);
     var hostAddress2 = IPAddress.Parse("127.0.0.2");
     var hostAddress3 = IPAddress.Parse("127.0.0.3");
     var rows = TestHelper.CreateRows(new List<Dictionary<string, object>>
     {
         new Dictionary<string, object>{{"rpc_address", hostAddress2}, {"peer", null}, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, {"tokens", null}},
         new Dictionary<string, object>{{"rpc_address", IPAddress.Parse("0.0.0.0")}, {"peer", hostAddress3}, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, {"tokens", null}}
     });
     cc.UpdatePeersInfo(rows);
     Assert.AreEqual(3, metadata.AllHosts().Count);
     //using rpc_address
     var host2 = metadata.GetHost(new IPEndPoint(hostAddress2, ProtocolOptions.DefaultPort));
     Assert.NotNull(host2);
     Assert.AreEqual("ut-dc2", host2.Datacenter);
     Assert.AreEqual("ut-rack2", host2.Rack);
     //with rpc_address = 0.0.0.0, use peer
     var host3 = metadata.GetHost(new IPEndPoint(hostAddress3, ProtocolOptions.DefaultPort));
     Assert.NotNull(host3);
     Assert.AreEqual("ut-dc3", host3.Datacenter);
     Assert.AreEqual("ut-rack3", host3.Rack);
 }
Beispiel #10
0
        private ControlConnection NewInstance(
            ProtocolVersion version = ProtocolVersion.MaxSupported,
            Configuration config    = null,
            Metadata metadata       = null)
        {
            config = config ?? new Configuration();
            if (metadata == null)
            {
                metadata = new Metadata(config);
                metadata.AddHost(new IPEndPoint(IPAddress.Parse(_testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            }
            var cc = new ControlConnection(
                Mock.Of <IInternalCluster>(),
                GetEventDebouncer(config),
                version,
                config,
                metadata,
                new List <IContactPoint>
            {
                new IpLiteralContactPoint(IPAddress.Parse(_testCluster.InitialContactPoint), config.ProtocolOptions, config.ServerNameResolver)
            });

            metadata.ControlConnection = cc;
            return(cc);
        }
Beispiel #11
0
        public void ShouldNotAttemptDownOrIgnoredHosts()
        {
            var config = new TestConfigurationBuilder()
            {
                SocketOptions = new SocketOptions().SetConnectTimeoutMillis(100).SetReadTimeoutMillis(100),
                Policies      = new Cassandra.Policies(
                    new ClusterUnitTests.FakeHostDistanceLbp(new Dictionary <string, HostDistance>
                {
                    { "127.0.0.1", HostDistance.Local },
                    { "127.0.0.2", HostDistance.Local },
                    { "127.0.0.3", HostDistance.Ignored },
                    { "127.0.0.4", HostDistance.Local }
                }),
                    new ConstantReconnectionPolicy(1000),
                    new DefaultRetryPolicy())
            }.Build();
            var cluster  = Mock.Of <IInternalCluster>();
            var metadata = new Metadata(config);

            using (var cc = NewInstance(cluster, config, metadata))
            {
                cc.Host = TestHelper.CreateHost("127.0.0.1");
                metadata.AddHost(cc.Host.Address);
                var hostAddress2 = IPAddress.Parse("127.0.0.2");
                var hostAddress3 = IPAddress.Parse("127.0.0.3");
                var hostAddress4 = IPAddress.Parse("127.0.0.4");
                var rows         = TestHelper.CreateRows(new List <Dictionary <string, object> >
                {
                    new Dictionary <string, object> {
                        { "rpc_address", hostAddress2 }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, { "tokens", null }, { "release_version", "2.1.5" }
                    },
                    new Dictionary <string, object> {
                        { "rpc_address", IPAddress.Parse("0.0.0.0") }, { "peer", hostAddress3 }, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, { "tokens", null }, { "release_version", "2.1.5" }
                    },
                    new Dictionary <string, object> {
                        { "rpc_address", IPAddress.Parse("0.0.0.0") }, { "peer", hostAddress4 }, { "data_center", "ut-dc3" }, { "rack", "ut-rack2" }, { "tokens", null }, { "release_version", "2.1.5" }
                    }
                });
                cc.UpdatePeersInfo(rows, cc.Host);
                Assert.AreEqual(4, metadata.AllHosts().Count);
                var host2 = metadata.GetHost(new IPEndPoint(hostAddress2, ProtocolOptions.DefaultPort));
                Assert.NotNull(host2);
                host2.SetDown();
                var host3 = metadata.GetHost(new IPEndPoint(hostAddress3, ProtocolOptions.DefaultPort));
                Assert.NotNull(host3);

                Mock.Get(cluster)
                .Setup(c => c.RetrieveAndSetDistance(It.IsAny <Host>()))
                .Returns <Host>(h => config.Policies.LoadBalancingPolicy.Distance(h));
                Mock.Get(cluster).Setup(c => c.AllHosts()).Returns(() => metadata.AllHosts());
                config.Policies.LoadBalancingPolicy.Initialize(cluster);

                var ex = Assert.ThrowsAsync <NoHostAvailableException>(() => cc.Reconnect());
                CollectionAssert.AreEquivalent(new[] { "127.0.0.1", "127.0.0.4" }, ex.Errors.Keys.Select(e => e.Address.ToString()));
            }
        }
Beispiel #12
0
        public void UpdatePeersInfoUsesAddressTranslator()
        {
            var invokedEndPoints = new List <IPEndPoint>();
            var translatorMock   = new Mock <IAddressTranslator>(MockBehavior.Strict);

            translatorMock
            .Setup(t => t.Translate(It.IsAny <IPEndPoint>()))
            .Callback <IPEndPoint>(invokedEndPoints.Add)
            .Returns <IPEndPoint>(e => e);
            const int portNumber = 9999;
            var       metadata   = new Metadata(new Configuration());
            var       config     = new Configuration(Policies.DefaultPolicies,
                                                     new ProtocolOptions(portNumber),
                                                     null,
                                                     new SocketOptions(),
                                                     new ClientOptions(),
                                                     NoneAuthProvider.Instance,
                                                     null,
                                                     new QueryOptions(),
                                                     translatorMock.Object,
                                                     Mock.Of <IStartupOptionsFactory>(),
                                                     new SessionFactoryBuilder(),
                                                     new Dictionary <string, IExecutionProfile>(),
                                                     new RequestOptionsMapper(),
                                                     null,
                                                     null,
                                                     null,
                                                     null,
                                                     null);
            var cc = NewInstance(config, metadata);

            cc.Host = TestHelper.CreateHost("127.0.0.1");
            metadata.AddHost(cc.Host.Address);
            var hostAddress2 = IPAddress.Parse("127.0.0.2");
            var hostAddress3 = IPAddress.Parse("127.0.0.3");
            var rows         = TestHelper.CreateRows(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object> {
                    { "rpc_address", hostAddress2 }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, { "tokens", null }
                },
                new Dictionary <string, object> {
                    { "rpc_address", IPAddress.Parse("0.0.0.0") }, { "peer", hostAddress3 }, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, { "tokens", null }
                }
            });

            cc.UpdatePeersInfo(rows, cc.Host);
            Assert.AreEqual(3, metadata.AllHosts().Count);
            Assert.AreEqual(2, invokedEndPoints.Count);
            Assert.AreEqual(hostAddress2, invokedEndPoints[0].Address);
            Assert.AreEqual(portNumber, invokedEndPoints[0].Port);
            Assert.AreEqual(hostAddress3, invokedEndPoints[1].Address);
            Assert.AreEqual(portNumber, invokedEndPoints[1].Port);
        }
 public void UpdatePeersInfoWithNullRpcIgnores()
 {
     var metadata = new Metadata(new Configuration());
     var cc = new ControlConnection(GetCluster(), metadata);
     cc.Host = TestHelper.CreateHost("127.0.0.1");
     metadata.AddHost(cc.Host.Address);
     var rows = TestHelper.CreateRows(new List<Dictionary<string, object>>
     {
         new Dictionary<string, object>{{"rpc_address", null}, {"peer", null}, { "data_center", "ut-dc2" }, { "rack", "ut-rack" }, {"tokens", null}}
     });
     cc.UpdatePeersInfo(rows);
     //Only local host present
     Assert.AreEqual(1, metadata.AllHosts().Count);
 }
        public Task <Host> RefreshNodeListAsync(IConnectionEndPoint currentEndPoint, IConnection connection, ISerializer serializer)
        {
            foreach (var h in _hosts)
            {
                if (_metadata.GetHost(h.Key) == null)
                {
                    var host = _metadata.AddHost(h.Key);
                    host.SetInfo(h.Value);
                }
            }

            _metadata.Partitioner = "Murmur3Partitioner";
            return(Task.FromResult(_metadata.Hosts.First()));
        }
        public async Task Should_Issue_Reconnect_Once()
        {
            var lbp    = new RoundRobinPolicy();
            var config = new Configuration(
                new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
                new ProtocolOptions(),
                null,
                new SocketOptions(),
                new ClientOptions(),
                NoneAuthProvider.Instance,
                null,
                new QueryOptions(),
                new DefaultAddressTranslator());
            var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
            var metadata    = new Metadata(config);

            metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            var clusterMock = new Mock <ICluster>();

            clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
            lbp.Initialize(clusterMock.Object);
            using (var cc = NewInstance(testCluster, config))
            {
                await cc.Init();

                testCluster.Stop(1);
                const int lengthPerProcessor = 20;
                var       arr = new Task[Environment.ProcessorCount * lengthPerProcessor];
                Parallel.For(0, Environment.ProcessorCount, j =>
                {
                    for (var i = 0; i < lengthPerProcessor; i++)
                    {
                        arr[j * lengthPerProcessor + i] = cc.Reconnect();
                    }
                });
                // When any of the tasks completes, all the task should have completed
                await Task.WhenAny(arr);

                await Task.Delay(20);

                var notFaultedTaskStatus = arr.Where(t => !t.IsFaulted)
                                           .Select(t => (TaskStatus?)t.Status).FirstOrDefault();
                Assert.Null(notFaultedTaskStatus, "Expected only faulted tasks");
                var ex = Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(arr[0]));
                Assert.AreEqual(1, ex.Errors.Count);
                Assert.IsInstanceOf <SocketException>(ex.Errors.Values.First());
            }
            testCluster.ShutDown();
        }
Beispiel #16
0
        private ControlConnection NewInstance(
            ProtocolVersion version = ProtocolVersion.MaxSupported,
            Configuration config    = null,
            Metadata metadata       = null)
        {
            config = config ?? new Configuration();
            if (metadata == null)
            {
                metadata = new Metadata(config);
                metadata.AddHost(new IPEndPoint(IPAddress.Parse(_testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            }
            var cc = new ControlConnection(version, config, metadata);

            metadata.ControlConnection = cc;
            return(cc);
        }
 private ControlConnection NewInstance(ITestCluster testCluster, Configuration config = null, Metadata metadata = null)
 {
     var version = GetProtocolVersion();
     if (config == null)
     {
         config = new Configuration();
     }
     if (metadata == null)
     {
         metadata = new Metadata(config);
         metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
     }
     var cc = new ControlConnection(version, config, metadata);
     metadata.ControlConnection = cc;
     return cc;
 }
Beispiel #18
0
        public void UpdatePeersInfoWithNullRpcIgnores()
        {
            var metadata = new Metadata(new Configuration());
            var cc       = new ControlConnection(GetCluster(), metadata);

            cc.Host = TestHelper.CreateHost("127.0.0.1");
            metadata.AddHost(cc.Host.Address);
            var rows = TestHelper.CreateRows(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object> {
                    { "rpc_address", null }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack" }, { "tokens", null }
                }
            });

            cc.UpdatePeersInfo(rows);
            //Only local host present
            Assert.AreEqual(1, metadata.AllHosts().Count);
        }
        private ControlConnection NewInstance(ITestCluster testCluster, Configuration config = null, Metadata metadata = null)
        {
            var version = (byte)Cluster.MaxProtocolVersion;

            if (config == null)
            {
                config = new Configuration();
            }
            if (metadata == null)
            {
                metadata = new Metadata(config);
                metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            }
            var cc = new ControlConnection(version, config, metadata);

            metadata.ControlConnection = cc;
            return(cc);
        }
Beispiel #20
0
        public void UpdatePeersInfoWithNullRpcIgnores()
        {
            var config   = new Configuration();
            var metadata = new Metadata(config);
            var cc       = NewInstance(Mock.Of <IInternalCluster>(), config, metadata);

            cc.Host = TestHelper.CreateHost("127.0.0.1");
            metadata.AddHost(cc.Host.Address);
            var rows = TestHelper.CreateRows(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object> {
                    { "rpc_address", null }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack" }, { "tokens", null }, { "release_version", "2.2.1" }
                }
            });

            cc.UpdatePeersInfo(rows, cc.Host);
            //Only local host present
            Assert.AreEqual(1, metadata.AllHosts().Count);
        }
Beispiel #21
0
        public void UpdatePeersInfoUsesAddressTranslator()
        {
            var invokedEndPoints = new List <IPEndPoint>();
            var translatorMock   = new Mock <IAddressTranslator>(MockBehavior.Strict);

            translatorMock
            .Setup(t => t.Translate(It.IsAny <IPEndPoint>()))
            .Callback <IPEndPoint>(invokedEndPoints.Add)
            .Returns <IPEndPoint>(e => e);
            const int portNumber = 9999;
            var       metadata   = new Metadata(new Configuration());
            var       config     =
                new TestConfigurationBuilder
            {
                ProtocolOptions       = new ProtocolOptions(portNumber),
                AddressTranslator     = translatorMock.Object,
                StartupOptionsFactory = Mock.Of <IStartupOptionsFactory>()
            }.Build();
            var cc = NewInstance(Mock.Of <IInternalCluster>(), config, metadata);

            cc.Host = TestHelper.CreateHost("127.0.0.1");
            metadata.AddHost(cc.Host.Address);
            var hostAddress2 = IPAddress.Parse("127.0.0.2");
            var hostAddress3 = IPAddress.Parse("127.0.0.3");
            var rows         = TestHelper.CreateRows(new List <Dictionary <string, object> >
            {
                new Dictionary <string, object> {
                    { "rpc_address", hostAddress2 }, { "peer", null }, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, { "tokens", null }
                },
                new Dictionary <string, object> {
                    { "rpc_address", IPAddress.Parse("0.0.0.0") }, { "peer", hostAddress3 }, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, { "tokens", null }
                }
            });

            cc.UpdatePeersInfo(rows, cc.Host);
            Assert.AreEqual(3, metadata.AllHosts().Count);
            Assert.AreEqual(2, invokedEndPoints.Count);
            Assert.AreEqual(hostAddress2, invokedEndPoints[0].Address);
            Assert.AreEqual(portNumber, invokedEndPoints[0].Port);
            Assert.AreEqual(hostAddress3, invokedEndPoints[1].Address);
            Assert.AreEqual(portNumber, invokedEndPoints[1].Port);
        }
Beispiel #22
0
        private ControlConnection NewInstance(
            ProtocolVersion version = ProtocolVersion.MaxSupported,
            Configuration config    = null,
            Metadata metadata       = null)
        {
            if (config == null)
            {
                config            = new Configuration();
                config.BufferPool = new Microsoft.IO.RecyclableMemoryStreamManager();
            }
            if (metadata == null)
            {
                metadata = new Metadata(config);
                metadata.AddHost(new IPEndPoint(IPAddress.Parse(_testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            }
            var cc = new ControlConnection(version, config, metadata);

            metadata.ControlConnection = cc;
            return(cc);
        }
 private ControlConnection NewInstance(byte version = 0, Configuration config = null, Metadata metadata = null)
 {
     if (version == 0)
     {
         version = (byte) Cluster.MaxProtocolVersion;
     }
     if (config == null)
     {
         config = new Configuration();
         config.BufferPool = new Microsoft.IO.RecyclableMemoryStreamManager();
     }
     if (metadata == null)
     {
         metadata = new Metadata(config);
         metadata.AddHost(new IPEndPoint(IPAddress.Parse(_testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
     }
     var cc = new ControlConnection(version, config, metadata);
     metadata.ControlConnection = cc;
     return cc;
 }
Beispiel #24
0
        public void Should_Reconnect_Once_If_Called_Serially()
        {
            var lbp    = new RoundRobinPolicy();
            var config = new Configuration(
                new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
                new ProtocolOptions(),
                null,
                new SocketOptions(),
                new ClientOptions(),
                NoneAuthProvider.Instance,
                null,
                new QueryOptions(),
                new DefaultAddressTranslator());

            config.BufferPool = new Microsoft.IO.RecyclableMemoryStreamManager();
            var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
            var metadata    = new Metadata(config);

            metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            var clusterMock = new Mock <ICluster>();

            clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
            lbp.Initialize(clusterMock.Object);
            using (var cc = NewInstance(testCluster, config))
            {
                cc.Init();
                testCluster.Stop(1);
                var t1 = cc.Reconnect();
                var t2 = cc.Reconnect();
                var t3 = cc.Reconnect();
                var t4 = cc.Reconnect();
                Assert.AreEqual(t1, t2);
                Assert.AreEqual(t1, t3);
                Assert.AreEqual(t1, t4);
                var ex = Assert.Throws <NoHostAvailableException>(() => TaskHelper.WaitToComplete(t1));
                Assert.AreEqual(1, ex.Errors.Count);
                Assert.IsInstanceOf <SocketException>(ex.Errors.Values.First());
            }
            testCluster.ShutDown();
        }
Beispiel #25
0
        public void Should_Schedule_Reconnections_In_The_Background()
        {
            var lbp    = new RoundRobinPolicy();
            var config = new Configuration(
                new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
                new ProtocolOptions(),
                null,
                new SocketOptions(),
                new ClientOptions(),
                NoneAuthProvider.Instance,
                null,
                new QueryOptions(),
                new DefaultAddressTranslator());

            config.BufferPool = new Microsoft.IO.RecyclableMemoryStreamManager();
            var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
            var metadata    = new Metadata(config);

            metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
            var clusterMock = new Mock <ICluster>();

            clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
            lbp.Initialize(clusterMock.Object);
            using (var cc = NewInstance(testCluster, config, metadata))
            {
                cc.Init();
                var host = metadata.Hosts.First();
                testCluster.Stop(1);
                host.SetDown();
                Thread.Sleep(2000);
                Assert.False(host.IsUp);
                testCluster.Start(1);
                host.BringUpIfDown();
                //Should reconnect using timer
                Thread.Sleep(5000);
                Assert.DoesNotThrow(() => cc.Query("SELECT key FROM system.local", false));
            }
            testCluster.ShutDown();
        }
 public void Should_Reconnect_Once_If_Called_Serially()
 {
     var lbp = new RoundRobinPolicy();
     var config = new Configuration(
         new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
         new ProtocolOptions(),
         null,
         new SocketOptions(),
         new ClientOptions(),
         NoneAuthProvider.Instance,
         null,
         new QueryOptions(),
         new DefaultAddressTranslator());
     config.BufferPool = new Microsoft.IO.RecyclableMemoryStreamManager();
     var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
     var metadata = new Metadata(config);
     metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
     var clusterMock = new Mock<ICluster>();
     clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
     lbp.Initialize(clusterMock.Object);
     using (var cc = NewInstance(testCluster, config))
     {
         cc.Init();
         testCluster.Stop(1);
         var t1 = cc.Reconnect();
         var t2 = cc.Reconnect();
         var t3 = cc.Reconnect();
         var t4 = cc.Reconnect();
         Assert.AreEqual(t1, t2);
         Assert.AreEqual(t1, t3);
         Assert.AreEqual(t1, t4);
         var ex = Assert.Throws<NoHostAvailableException>(() => TaskHelper.WaitToComplete(t1));
         Assert.AreEqual(1, ex.Errors.Count);
         Assert.IsInstanceOf<SocketException>(ex.Errors.Values.First());
     }
     testCluster.ShutDown();
 }
 public void Should_Reconnect_After_Several_Failed_Attempts()
 {
     var lbp = new RoundRobinPolicy();
     var config = new Configuration(
         new Cassandra.Policies(lbp, new ConstantReconnectionPolicy(1000), FallthroughRetryPolicy.Instance),
         new ProtocolOptions(),
         null,
         new SocketOptions(),
         new ClientOptions(),
         NoneAuthProvider.Instance,
         null,
         new QueryOptions(),
         new DefaultAddressTranslator());
     var testCluster = TestClusterManager.GetNonShareableTestCluster(1, DefaultMaxClusterCreateRetries, true, false);
     var metadata = new Metadata(config);
     metadata.AddHost(new IPEndPoint(IPAddress.Parse(testCluster.InitialContactPoint), ProtocolOptions.DefaultPort));
     var clusterMock = new Mock<ICluster>();
     clusterMock.Setup(c => c.AllHosts()).Returns(() => metadata.Hosts.ToCollection());
     lbp.Initialize(clusterMock.Object);
     using (var cc = NewInstance(testCluster, config))
     {
         cc.Init();
         testCluster.Stop(1);
         Assert.Throws<NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
         Assert.Throws<NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
         Assert.Throws<NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
         Assert.Throws<NoHostAvailableException>(() => TaskHelper.WaitToComplete(cc.Reconnect()));
         testCluster.Start(1);
         Assert.DoesNotThrow(() => TaskHelper.WaitToComplete(cc.Reconnect()));
     }
     testCluster.ShutDown();
 }
 public void UpdatePeersInfoUsesAddressTranslator()
 {
     var invokedEndPoints = new List<IPEndPoint>();
     var translatorMock = new Mock<IAddressTranslator>(MockBehavior.Strict);
     translatorMock
         .Setup(t => t.Translate(It.IsAny<IPEndPoint>()))
         .Callback<IPEndPoint>(invokedEndPoints.Add)
         .Returns<IPEndPoint>(e => e);
     const int portNumber = 9999;
     var metadata = new Metadata(new Configuration());
     var config = new Configuration(new Policies(),
          new ProtocolOptions(portNumber),
          null,
          new SocketOptions(),
          new ClientOptions(),
          NoneAuthProvider.Instance,
          null,
          new QueryOptions(),
          translatorMock.Object);
     var cc = NewInstance(config, metadata);
     cc.Host = TestHelper.CreateHost("127.0.0.1");
     metadata.AddHost(cc.Host.Address);
     var hostAddress2 = IPAddress.Parse("127.0.0.2");
     var hostAddress3 = IPAddress.Parse("127.0.0.3");
     var rows = TestHelper.CreateRows(new List<Dictionary<string, object>>
     {
         new Dictionary<string, object>{{"rpc_address", hostAddress2}, {"peer", null}, { "data_center", "ut-dc2" }, { "rack", "ut-rack2" }, {"tokens", null}},
         new Dictionary<string, object>{{"rpc_address", IPAddress.Parse("0.0.0.0")}, {"peer", hostAddress3}, { "data_center", "ut-dc3" }, { "rack", "ut-rack3" }, {"tokens", null}}
     });
     cc.UpdatePeersInfo(rows);
     Assert.AreEqual(3, metadata.AllHosts().Count);
     Assert.AreEqual(2, invokedEndPoints.Count);
     Assert.AreEqual(hostAddress2, invokedEndPoints[0].Address);
     Assert.AreEqual(portNumber, invokedEndPoints[0].Port);
     Assert.AreEqual(hostAddress3, invokedEndPoints[1].Address);
     Assert.AreEqual(portNumber, invokedEndPoints[1].Port);
 }