public void TokenAwarePolicyReturnsChildHostsIfNoRoutingKey() { var hostList = new List <Host> { TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2") }; var clusterMock = new Mock <ICluster>(MockBehavior.Strict); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 1)); policy.Initialize(clusterMock.Object); //No routing key var hosts = policy.NewQueryPlan(null, new SimpleStatement()).ToList(); //2 localhosts Assert.AreEqual(2, hosts.Count(h => policy.Distance(h) == HostDistance.Local)); Assert.AreEqual("dc1", hosts[0].Datacenter); Assert.AreEqual("dc1", hosts[1].Datacenter); clusterMock.Verify(); //No statement hosts = policy.NewQueryPlan(null, null).ToList(); //2 localhosts Assert.AreEqual(2, hosts.Count(h => policy.Distance(h) == HostDistance.Local)); Assert.AreEqual("dc1", hosts[0].Datacenter); Assert.AreEqual("dc1", hosts[1].Datacenter); clusterMock.Verify(); }
public void BatchStatement_Should_UseRoutingKeyAndKeyspaceOfFirstStatement_When_TokenAwareLbpIsUsed() { var rawRoutingKey = new byte[] { 1, 2, 3, 4 }; var lbp = new TokenAwarePolicy(new ClusterTests.FakeLoadBalancingPolicy()); var clusterMock = Mock.Of <IInternalCluster>(); Mock.Get(clusterMock).Setup(c => c.GetReplicas(It.IsAny <string>(), It.IsAny <byte[]>())) .Returns(new List <Host>()); Mock.Get(clusterMock).Setup(c => c.AllHosts()) .Returns(new List <Host>()); lbp.Initialize(clusterMock); var s1Mock = new Mock <Statement>(MockBehavior.Loose); s1Mock.Setup(s => s.RoutingKey).Returns(new RoutingKey(rawRoutingKey)); s1Mock.Setup(s => s.Keyspace).Returns("ks1"); var batch = new BatchStatement().Add(s1Mock.Object); var _ = lbp.NewQueryPlan("ks2", batch).ToList(); Mock.Get(clusterMock).Verify(c => c.GetReplicas("ks1", rawRoutingKey), Times.Once); }
public void TokenAwarePolicyRoundRobinsOnLocalReplicas() { var hostList = new List <Host> { //5 local nodes and 4 remote TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2"), TestHelper.CreateHost("0.0.0.5", "dc1"), TestHelper.CreateHost("0.0.0.6", "dc1"), TestHelper.CreateHost("0.0.0.7", "dc2"), TestHelper.CreateHost("0.0.0.8", "dc2"), TestHelper.CreateHost("0.0.0.9", "dc1") }; var clusterMock = new Mock <ICluster>(MockBehavior.Strict); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); clusterMock .Setup(c => c.GetReplicas(It.IsAny <string>(), It.IsAny <byte[]>())) .Returns <string, byte[]>((keyspace, key) => { var i = key[0]; return(hostList.Where(h => { //The host at with address == k and the next one var address = TestHelper.GetLastAddressByte(h); return address == i || address == i + 1; }).ToList()); }) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 2)); policy.Initialize(clusterMock.Object); var firstHosts = new ConcurrentBag <Host>(); var k = new RoutingKey { RawRoutingKey = new byte[] { 1 } }; // key for host :::1 and :::2 const int times = 10000; Action action = () => { var h = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).First(); firstHosts.Add(h); }; TestHelper.ParallelInvoke(action, times); Assert.AreEqual(times, firstHosts.Count); double queryPlansWithHost1AsFirst = firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 1); double queryPlansWithHost2AsFirst = firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 2); Assert.AreEqual(times, queryPlansWithHost1AsFirst + queryPlansWithHost2AsFirst); // Around half will to one and half to the other Assert.That(queryPlansWithHost1AsFirst / times, Is.GreaterThan(0.45).And.LessThan(0.55)); Assert.That(queryPlansWithHost2AsFirst / times, Is.GreaterThan(0.45).And.LessThan(0.55)); clusterMock.Verify(); }
public void TokenAwarePolicyReturnsLocalReplicasFirst() { var hostList = new List <Host> { //5 local nodes and 4 remote TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2"), TestHelper.CreateHost("0.0.0.5", "dc1"), TestHelper.CreateHost("0.0.0.6", "dc1"), TestHelper.CreateHost("0.0.0.7", "dc2"), TestHelper.CreateHost("0.0.0.8", "dc2"), TestHelper.CreateHost("0.0.0.9", "dc1") }; var n = 2; var clusterMock = new Mock <ICluster>(); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); clusterMock .Setup(c => c.GetReplicas(It.IsAny <string>(), It.IsAny <byte[]>())) .Returns <string, byte[]>((keyspace, key) => { var i = key[0]; return(hostList.Where(h => { //The host at with address == k || address == k + n var address = TestHelper.GetLastAddressByte(h); return address == i || address == i + n; }).ToList()); }) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 2)); policy.Initialize(clusterMock.Object); //key for host :::1 and :::3 var k = new RoutingKey { RawRoutingKey = new byte[] { 1 } }; var hosts = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).ToList(); //5 local hosts + 2 remote hosts Assert.AreEqual(7, hosts.Count); //local replica first Assert.AreEqual(1, TestHelper.GetLastAddressByte(hosts[0])); clusterMock.Verify(); //key for host :::2 and :::5 k = new RoutingKey { RawRoutingKey = new byte[] { 2 } }; n = 3; hosts = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).ToList(); Assert.AreEqual(7, hosts.Count); //local replicas first CollectionAssert.AreEquivalent(new[] { 2, 5 }, hosts.Take(2).Select(TestHelper.GetLastAddressByte)); //next should be local nodes Assert.AreEqual("dc1", hosts[2].Datacenter); Assert.AreEqual("dc1", hosts[3].Datacenter); Assert.AreEqual("dc1", hosts[4].Datacenter); clusterMock.Verify(); }
public void TokenAwarePolicyRoundRobinsOnLocalReplicas() { var hostList = new List <Host> { //5 local nodes and 4 remote TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2"), TestHelper.CreateHost("0.0.0.5", "dc1"), TestHelper.CreateHost("0.0.0.6", "dc1"), TestHelper.CreateHost("0.0.0.7", "dc2"), TestHelper.CreateHost("0.0.0.8", "dc2"), TestHelper.CreateHost("0.0.0.9", "dc1") }; var clusterMock = new Mock <ICluster>(MockBehavior.Strict); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); clusterMock .Setup(c => c.GetReplicas(It.IsAny <string>(), It.IsAny <byte[]>())) .Returns <string, byte[]>((keyspace, key) => { var i = key[0]; return(hostList.Where(h => { //The host at with address == k and the next one var address = TestHelper.GetLastAddressByte(h); return address == i || address == i + 1; }).ToList()); }) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 2)); policy.Initialize(clusterMock.Object); var firstHosts = new ConcurrentBag <Host>(); var k = new RoutingKey { RawRoutingKey = new byte[] { 1 } }; //key for host :::1 and :::2 var actions = new List <Action>(); const int times = 100; for (var i = 0; i < times; i++) { actions.Add(() => { var h = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).First(); firstHosts.Add(h); }); } var parallelOptions = new ParallelOptions(); parallelOptions.TaskScheduler = new ThreadPerTaskScheduler(); parallelOptions.MaxDegreeOfParallelism = 1000; Parallel.Invoke(parallelOptions, actions.ToArray()); Assert.AreEqual(times, firstHosts.Count); //Half the times Assert.AreEqual(times / 2, firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 1)); Assert.AreEqual(times / 2, firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 2)); clusterMock.Verify(); }
public void TokenAwarePolicyReturnsChildHostsIfNoRoutingKey() { var hostList = new List<Host> { TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2") }; var clusterMock = new Mock<ICluster>(MockBehavior.Strict); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 1)); policy.Initialize(clusterMock.Object); //No routing key var hosts = policy.NewQueryPlan(null, new SimpleStatement()).ToList(); //2 localhosts Assert.AreEqual(2, hosts.Count(h => policy.Distance(h) == HostDistance.Local)); Assert.AreEqual("dc1", hosts[0].Datacenter); Assert.AreEqual("dc1", hosts[1].Datacenter); clusterMock.Verify(); //No statement hosts = policy.NewQueryPlan(null, null).ToList(); //2 localhosts Assert.AreEqual(2, hosts.Count(h => policy.Distance(h) == HostDistance.Local)); Assert.AreEqual("dc1", hosts[0].Datacenter); Assert.AreEqual("dc1", hosts[1].Datacenter); clusterMock.Verify(); }
public void TokenAwarePolicyRoundRobinsOnLocalReplicas() { var hostList = new List<Host> { //5 local nodes and 4 remote TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2"), TestHelper.CreateHost("0.0.0.5", "dc1"), TestHelper.CreateHost("0.0.0.6", "dc1"), TestHelper.CreateHost("0.0.0.7", "dc2"), TestHelper.CreateHost("0.0.0.8", "dc2"), TestHelper.CreateHost("0.0.0.9", "dc1") }; var clusterMock = new Mock<ICluster>(MockBehavior.Strict); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); clusterMock .Setup(c => c.GetReplicas(It.IsAny<string>(), It.IsAny<byte[]>())) .Returns<string, byte[]>((keyspace, key) => { var i = key[0]; return hostList.Where(h => { //The host at with address == k and the next one var address = TestHelper.GetLastAddressByte(h); return address == i || address == i + 1; }).ToList(); }) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 2)); policy.Initialize(clusterMock.Object); var firstHosts = new ConcurrentBag<Host>(); var k = new RoutingKey { RawRoutingKey = new byte[] { 1 } }; //key for host :::1 and :::2 var actions = new List<Action>(); const int times = 100; for (var i = 0; i < times; i++) { actions.Add(() => { var h = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).First(); firstHosts.Add(h); }); } var parallelOptions = new ParallelOptions(); parallelOptions.TaskScheduler = new ThreadPerTaskScheduler(); parallelOptions.MaxDegreeOfParallelism = 1000; Parallel.Invoke(parallelOptions, actions.ToArray()); Assert.AreEqual(times, firstHosts.Count); //Half the times Assert.AreEqual(times / 2, firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 1)); Assert.AreEqual(times / 2, firstHosts.Count(h => TestHelper.GetLastAddressByte(h) == 2)); clusterMock.Verify(); }
public void TokenAwarePolicyReturnsLocalReplicasFirst() { var hostList = new List<Host> { //5 local nodes and 4 remote TestHelper.CreateHost("0.0.0.1", "dc1"), TestHelper.CreateHost("0.0.0.2", "dc1"), TestHelper.CreateHost("0.0.0.3", "dc2"), TestHelper.CreateHost("0.0.0.4", "dc2"), TestHelper.CreateHost("0.0.0.5", "dc1"), TestHelper.CreateHost("0.0.0.6", "dc1"), TestHelper.CreateHost("0.0.0.7", "dc2"), TestHelper.CreateHost("0.0.0.8", "dc2"), TestHelper.CreateHost("0.0.0.9", "dc1") }; var n = 2; var clusterMock = new Mock<ICluster>(); clusterMock .Setup(c => c.AllHosts()) .Returns(hostList) .Verifiable(); clusterMock .Setup(c => c.GetReplicas(It.IsAny<string>(), It.IsAny<byte[]>())) .Returns<string, byte[]>((keyspace, key) => { var i = key[0]; return hostList.Where(h => { //The host at with address == k || address == k + n var address = TestHelper.GetLastAddressByte(h); return address == i || address == i + n; }).ToList(); }) .Verifiable(); var policy = new TokenAwarePolicy(new DCAwareRoundRobinPolicy("dc1", 2)); policy.Initialize(clusterMock.Object); //key for host :::1 and :::3 var k = new RoutingKey { RawRoutingKey = new byte[] { 1 } }; var hosts = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).ToList(); //5 local hosts + 2 remote hosts Assert.AreEqual(7, hosts.Count); //local replica first Assert.AreEqual(1, TestHelper.GetLastAddressByte(hosts[0])); //remote replica last Assert.AreEqual(3, TestHelper.GetLastAddressByte(hosts[6])); clusterMock.Verify(); //key for host :::2 and :::5 k = new RoutingKey { RawRoutingKey = new byte[] { 2 } }; n = 3; hosts = policy.NewQueryPlan(null, new SimpleStatement().SetRoutingKey(k)).ToList(); Assert.AreEqual(7, hosts.Count); //local replicas first Assert.AreEqual(2, TestHelper.GetLastAddressByte(hosts[0])); Assert.AreEqual(5, TestHelper.GetLastAddressByte(hosts[1])); //next should be local nodes Assert.AreEqual("dc1", hosts[2].Datacenter); Assert.AreEqual("dc1", hosts[3].Datacenter); Assert.AreEqual("dc1", hosts[4].Datacenter); clusterMock.Verify(); }