public void MaybeCreateCorePool_Fail_To_Grow_To_CoreConnections_Yields_Existing()
        {
            var mock          = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig());
            var testException = new Exception("Dummy exception");
            var counter       = 0;

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(() =>
            {
                var i = counter++;
                if (i == 0 || i > 2)
                {
                    throw testException;
                }
                return(new Connection(ProtocolVersion, GetIpEndPoint((byte)counter), GetConfig()));
            }, 50 * counter));
            var pool = mock.Object;

            Assert.DoesNotThrow(() => TaskHelper.WaitToComplete(pool.MaybeCreateCorePool()));
            //next attempts creates to create all, still fails
            Thread.Sleep(100);
            var connections = TaskHelper.WaitToComplete(pool.MaybeCreateCorePool());

            //2 valid still
            Assert.AreEqual(2, connections.Length);
        }
        public void MaybeCreateCorePool_Fail_To_Open_Single_Connection_Should_Yield_Valid()
        {
            var mock          = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig());
            var testException = new Exception("Dummy exception");
            var counter       = 0;

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(() =>
            {
                if (counter++ == 0)
                {
                    throw testException;
                }
                return(new Connection(ProtocolVersion, GetIpEndPoint((byte)counter++), GetConfig()));
            }));
            var pool        = mock.Object;
            var connections = TaskHelper.WaitToComplete(pool.MaybeCreateCorePool());

            //1 or 2 valid connections still
            Assert.LessOrEqual(connections.Length, 2);
            //next attempts creates all
            Thread.Sleep(100);
            connections = TaskHelper.WaitToComplete(pool.MaybeCreateCorePool());
            //The one recently created
            Assert.AreEqual(1, connections.Length);
            Thread.Sleep(500);
            connections = TaskHelper.WaitToComplete(pool.MaybeCreateCorePool());
            //Return all the pool
            Assert.AreEqual(3, connections.Length);
        }
Exemple #3
0
        public void MaybeIncreasePoolSize_Should_Increase_One_At_A_Time_Until_Core_Connections()
        {
            var mock = GetPoolMock();

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(CreateConnection(), 200));
            var pool = mock.Object;

            pool.MaybeCreateFirstConnection().Wait(1000);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            var creatingNew = pool.MaybeIncreasePoolSize(0);

            Assert.True(creatingNew);
            //No connections added yet
            Assert.AreEqual(1, pool.OpenConnections.Count());
            Thread.Sleep(500);
            Assert.AreEqual(2, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(0);
            Assert.True(creatingNew);
            Thread.Sleep(500);
            Assert.AreEqual(3, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(0);
            Assert.False(creatingNew);
            Thread.Sleep(500);
            //Still core
            Assert.AreEqual(3, pool.OpenConnections.Count());
        }
        public void EnsureCreate_Parallel_Calls_Should_Yield_First()
        {
            var mock     = GetPoolMock();
            var lastByte = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() => TestHelper.DelayedTask(CreateConnection((byte)++lastByte), 100 + (lastByte > 1 ? 10000 : 0)));
            var pool          = mock.Object;
            var creationTasks = new Task <Connection[]> [10];
            var counter       = -1;
            var initialCreate = pool.EnsureCreate();

            TestHelper.ParallelInvoke(() =>
            {
                creationTasks[Interlocked.Increment(ref counter)] = pool.EnsureCreate();
            }, 10);
            // ReSharper disable once CoVariantArrayConversion
            Task.WaitAll(creationTasks);
            Assert.AreEqual(1, TaskHelper.WaitToComplete(initialCreate).Length);

            foreach (var t in creationTasks)
            {
                Assert.AreEqual(1, TaskHelper.WaitToComplete(t).Length);
            }
            Assert.AreEqual(1, lastByte);
        }
        public async Task EnsureCreate_Can_Handle_Multiple_Concurrent_Calls()
        {
            var mock            = GetPoolMock(null, GetConfig(3, 3));
            var creationCounter = 0;
            var isCreating      = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                Interlocked.Increment(ref creationCounter);
                Interlocked.Exchange(ref isCreating, 1);
                return(TestHelper.DelayedTask(CreateConnection(), 50, () => Interlocked.Exchange(ref isCreating, 0)));
            });
            var pool = mock.Object;

            pool.SetDistance(HostDistance.Local);
            Assert.AreEqual(0, pool.OpenConnections);
            var tasks = new Task[100];

            for (var i = 0; i < 100; i++)
            {
                tasks[i] = Task.Run(async() => await pool.EnsureCreate());
            }
            await Task.WhenAll(tasks);

            Assert.Greater(pool.OpenConnections, 0);
            Assert.LessOrEqual(pool.OpenConnections, 3);
            await TestHelper.WaitUntilAsync(() => Volatile.Read(ref creationCounter) == 3, 200, 20);

            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            Assert.AreEqual(3, pool.OpenConnections);
        }
Exemple #6
0
        public void MaybeIncreasePoolSize_Should_Increase_One_At_A_Time_Until_Max_Connections()
        {
            var mock = GetPoolMock(null, GetConfig(1, 3));

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(CreateConnection(1, GetConfig(1, 3)), 200));
            var pool = mock.Object;

            pool.MaybeCreateFirstConnection().Wait(1000);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            //inflight is low
            var creatingNew = pool.MaybeIncreasePoolSize(0);

            Assert.False(creatingNew);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            Thread.Sleep(500);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.True(creatingNew);
            Thread.Sleep(500);
            Assert.AreEqual(2, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.True(creatingNew);
            Thread.Sleep(500);
            Assert.AreEqual(3, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.False(creatingNew);
            Thread.Sleep(500);
            //Still max
            Assert.AreEqual(3, pool.OpenConnections.Count());
        }
Exemple #7
0
        public void MaybeIncreasePoolSize_Should_Increase_One_At_A_Time_Until_Max_Connections()
        {
            var mock = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig(1, 3));

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(new Connection(ProtocolVersion, GetIpEndPoint(), GetConfig(1, 3)), 200));
            var pool = mock.Object;

            pool.MaybeCreateFirstConnection().Wait(1000);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            //inflight is low
            var creatingNew = pool.MaybeIncreasePoolSize(0);

            Assert.False(creatingNew);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            Thread.Sleep(500);
            Assert.AreEqual(1, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.True(creatingNew);
            Thread.Sleep(500);
            Assert.AreEqual(2, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.True(creatingNew);
            Thread.Sleep(500);
            Assert.AreEqual(3, pool.OpenConnections.Count());
            creatingNew = pool.MaybeIncreasePoolSize(128);
            Assert.False(creatingNew);
            Thread.Sleep(500);
            //Still max
            Assert.AreEqual(3, pool.OpenConnections.Count());
        }
Exemple #8
0
        public async Task EnsureCreate_Should_Increase_One_At_A_Time_Until_Core_Connections()
        {
            var mock            = GetPoolMock(null, GetConfig(3, 3));
            var creationCounter = 0;
            var isCreating      = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                Interlocked.Increment(ref creationCounter);
                Interlocked.Exchange(ref isCreating, 1);
                return(TestHelper.DelayedTask(CreateConnection(), 500, () => Interlocked.Exchange(ref isCreating, 0)));
            });
            var pool = mock.Object;

            pool.SetDistance(HostDistance.Local);
            await pool.EnsureCreate();

            Assert.AreEqual(1, pool.OpenConnections);
            Thread.Sleep(100);
            //No connections added yet
            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(1, Volatile.Read(ref isCreating));
            Thread.Sleep(500);
            Assert.AreEqual(2, pool.OpenConnections);
            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(1, Volatile.Read(ref isCreating));
            Thread.Sleep(500);
            Assert.AreEqual(3, pool.OpenConnections);
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Thread.Sleep(500);
            Assert.AreEqual(3, pool.OpenConnections);
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
        }
        public void MaybeCreateCorePool_Serial_Calls_Should_Yield_First()
        {
            var mock     = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig());
            var lastByte = 1;

            mock.Setup(p => p.CreateConnection()).Returns(() =>
            {
                var c = new Connection(ProtocolVersion, GetIpEndPoint((byte)lastByte++), GetConfig());
                if (lastByte == 2)
                {
                    return(TestHelper.DelayedTask(c, 500));
                }
                return(TaskHelper.ToTask(c));
            });
            var pool          = mock.Object;
            var creationTasks = new Task <Connection[]> [4];

            creationTasks[0] = pool.MaybeCreateCorePool();
            creationTasks[1] = pool.MaybeCreateCorePool();
            creationTasks[2] = pool.MaybeCreateCorePool();
            creationTasks[3] = pool.MaybeCreateCorePool();
            // ReSharper disable once CoVariantArrayConversion
            Task.WaitAll(creationTasks);
            Assert.AreEqual(1, TaskHelper.WaitToComplete(creationTasks[0]).Length);
            for (var i = 1; i < creationTasks.Length; i++)
            {
                Assert.AreEqual(1, TaskHelper.WaitToComplete(creationTasks[i]).Length);
            }
        }
        public async Task EnsureCreate_After_Reconnection_Attempt_Waits_Existing()
        {
            var mock            = GetPoolMock(null, GetConfig(2, 2));
            var creationCounter = 0;
            var isCreating      = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                Interlocked.Increment(ref creationCounter);
                Interlocked.Exchange(ref isCreating, 1);
                return(TestHelper.DelayedTask(CreateConnection(), 300, () => Interlocked.Exchange(ref isCreating, 0)));
            });
            var pool = mock.Object;

            pool.SetDistance(HostDistance.Local);
            Assert.AreEqual(0, pool.OpenConnections);
            Thread.Sleep(100);
            pool.OnHostUp(null);
            await pool.EnsureCreate();

            Assert.AreEqual(1, pool.OpenConnections);
            await TestHelper.WaitUntilAsync(() => pool.OpenConnections == 2, 200, 30);

            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(2, pool.OpenConnections);
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
        }
        public async Task OnHostUp_Recreates_Pool_In_The_Background()
        {
            var mock            = GetPoolMock(null, GetConfig(2, 2));
            var creationCounter = 0;
            var isCreating      = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                Interlocked.Increment(ref creationCounter);
                Interlocked.Exchange(ref isCreating, 1);
                return(TestHelper.DelayedTask(CreateConnection(), 30, () => Interlocked.Exchange(ref isCreating, 0)));
            });
            var pool = mock.Object;

            pool.SetDistance(HostDistance.Local);
            Assert.AreEqual(0, pool.OpenConnections);
            Assert.AreEqual(0, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            pool.OnHostUp(null);
            await TestHelper.WaitUntilAsync(() => pool.OpenConnections == 2);

            Assert.AreEqual(2, pool.OpenConnections);
            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
        }
        public void EnsureCreate_Serial_Calls_Should_Yield_First()
        {
            var mock     = GetPoolMock();
            var lastByte = 1;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                var c = CreateConnection((byte)lastByte++);
                if (lastByte == 2)
                {
                    return(TestHelper.DelayedTask(c, 500));
                }
                return(TaskHelper.ToTask(c));
            });
            var pool          = mock.Object;
            var creationTasks = new Task <Connection[]> [4];

            creationTasks[0] = pool.EnsureCreate();
            creationTasks[1] = pool.EnsureCreate();
            creationTasks[2] = pool.EnsureCreate();
            creationTasks[3] = pool.EnsureCreate();
            // ReSharper disable once CoVariantArrayConversion
            Task.WaitAll(creationTasks);
            Assert.AreEqual(1, TaskHelper.WaitToComplete(creationTasks[0]).Length);
            for (var i = 1; i < creationTasks.Length; i++)
            {
                Assert.AreEqual(1, TaskHelper.WaitToComplete(creationTasks[i]).Length);
            }
        }
Exemple #13
0
        public void SchemaParser_GetQueryTrace_Should_Not_Try_More_Than_Max_Attempts()
        {
            var counter           = 0;
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.sessions"), It.IsAny <bool>()))
            .Returns(() =>
            {
                counter++;
                var sessionRow = TestHelper.CreateRow(new Dictionary <string, object>
                {
                    { "duration", null },
                    { "request", "test query " },
                    { "coordinator", IPAddress.Parse("192.168.12.13") },
                    { "parameters", null },
                    { "started_at", DateTimeOffset.Now }
                });
                return(TestHelper.DelayedTask <IEnumerable <Row> >(new[] { sessionRow }));
            });
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.events"), It.IsAny <bool>()))
            .Returns(() => TaskHelper.ToTask(Enumerable.Empty <Row>()));
            var queryTrace = GetQueryTrace();
            var parser     = GetV1Instance(queryProviderMock.Object);
            var timer      = new HashedWheelTimer();

            Assert.Throws <TraceRetrievalException>(() => TaskHelper.WaitToComplete(parser.GetQueryTrace(queryTrace, timer)));
            Assert.AreEqual(counter, 5);
            timer.Dispose();
        }
Exemple #14
0
        public void SchemaParser_GetQueryTrace_When_Second_QueryAsync_Fails_Exception_Should_Propagate()
        {
            var sessionRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "duration", 10 },
                { "request", "test query" },
                { "coordinator", IPAddress.Parse("192.168.12.13") },
                { "parameters", null },
                { "started_at", DateTimeOffset.Now }
            });
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.sessions"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { sessionRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.events"), It.IsAny <bool>()))
            .Returns(() => TaskHelper.FromException <IEnumerable <Row> >(new Exception("Test exception 2")));

            var queryTrace = GetQueryTrace();
            var parser     = GetV1Instance(queryProviderMock.Object);
            var timer      = new HashedWheelTimer();
            var ex         = Assert.Throws <Exception>(() => TaskHelper.WaitToComplete(parser.GetQueryTrace(queryTrace, timer)));

            Assert.AreEqual("Test exception 2", ex.Message);
            timer.Dispose();
        }
Exemple #15
0
        public void SchemaParserV1_GetKeyspace_Should_Retrieve_And_Parse_Keyspace_With_SimpleStrategy()
        {
            const string ksName = "ks1";
            var          row    = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", ksName },
                { "durable_writes", true },
                { "strategy_class", "Simple" },
                { "strategy_options", "{\"replication_factor\": \"4\"}" }
            });
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_keyspaces.*" + ksName), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { row }));
            var parser = GetV1Instance(queryProviderMock.Object);
            var ks     = TaskHelper.WaitToComplete(parser.GetKeyspace(ksName));

            Assert.NotNull(ks);
            Assert.AreEqual(ksName, ks.Name);
            Assert.AreEqual(true, ks.DurableWrites);
            Assert.AreEqual("Simple", ks.StrategyClass);
            CollectionAssert.AreEqual(new Dictionary <string, int> {
                { "replication_factor", 4 }
            }, ks.Replication);
        }
Exemple #16
0
        public void SchemaParserV2_GetTable_Should_Propagate_Exceptions_From_Query_Provider()
        {
            var ksRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", "ks1" }, { "durable_writes", true }, { "replication", new Dictionary <string, string> {
                                                                              { "class", "org.apache.cassandra.locator.SimpleStrategy" }, { "replication_factor", "1" }
                                                                          } },
            });
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_schema\\.keyspaces.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { ksRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_schema\\.tables.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask(Enumerable.Empty <Row>()));
            //This will cause the task to be faulted
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_schema\\.columns.*ks1"), It.IsAny <bool>()))
            .Returns(() => TaskHelper.FromException <IEnumerable <Row> >(new NoHostAvailableException(new Dictionary <IPEndPoint, Exception>())));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system_schema\\.indexes.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask(Enumerable.Empty <Row>()));
            var parser = GetV2Instance(queryProviderMock.Object);
            var ks     = TaskHelper.WaitToComplete(parser.GetKeyspace("ks1"));

            Assert.NotNull(ks);
            Assert.Throws <NoHostAvailableException>(() => ks.GetTableMetadata("tbl1"));
        }
Exemple #17
0
        public void SchemaParserV1_GetTable_Should_Throw_ArgumentException_When_A_Table_Column_Not_Defined()
        {
            var tableRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", "ks_tbl_meta" },
                { "columnfamily_name", "tbl1" },
                //{"bloom_filter_fp_chance", 0.01}, ---> not defined
                { "caching", "{\"keys\":\"ALL\", \"rows_per_partition\":\"NONE\"}" },
                { "cf_id", "609f53a0-038b-11e5-be48-0d419bfb85c8" },
                { "column_aliases", "[]" },
                { "comment", "" },
                { "compaction_strategy_class", "org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy" },
                { "compaction_strategy_options", "{}" },
                { "comparator", "org.apache.cassandra.db.marshal.UTF8Type" },
                { "compression_parameters", "{\"sstable_compression\":\"org.apache.cassandra.io.compress.LZ4Compressor\"}" },
                { "default_time_to_live", 0 },
                { "default_validator", "org.apache.cassandra.db.marshal.BytesType" },
                { "dropped_columns", null },
                { "gc_grace_seconds", 864000 },
                { "index_interval", null },
                { "is_dense", false },
                { "key_aliases", "[\"id\"]" },
                { "key_validator", "org.apache.cassandra.db.marshal.UUIDType" },
                { "local_read_repair_chance", 0.1 },
                { "max_compaction_threshold", 32 },
                { "max_index_interval", 2048 },
                { "memtable_flush_period_in_ms", 0 },
                { "min_compaction_threshold", 4 },
                { "min_index_interval", 128 },
                { "read_repair_chance", 0D },
                { "speculative_retry", "99.0PERCENTILE" },
                { "subcomparator", null },
                { "type", "Standard" },
                { "value_alias", null }
            });

            var ksRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", "ks1" }, { "durable_writes", true }, { "strategy_class", "Simple" }, { "strategy_options", "{\"replication_factor\": \"1\"}" }
            });
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_keyspaces.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { ksRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_columnfamilies.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { tableRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_columns.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask(Enumerable.Empty <Row>));
            var parser = GetV1Instance(queryProviderMock.Object);
            var ks     = TaskHelper.WaitToComplete(parser.GetKeyspace("ks1"));

            Assert.NotNull(ks);
            var ex = Assert.Throws <ArgumentException>(() => ks.GetTableMetadata("ks_tbl_meta"));

            StringAssert.Contains("bloom_filter_fp_chance", ex.Message);
        }
Exemple #18
0
        public void TaskHelper_ContinueSync_Continues_Delayed_Tasks()
        {
            var t1 = TestHelper.DelayedTask(1);
            var t2 = t1.ContinueSync(inValue => 2 + inValue);

            t2.Wait();
            Assert.AreEqual(3, t2.Result);
        }
Exemple #19
0
        public void TaskHelper_Then_Continues_Delayed_Tasks()
        {
            var t1 = TestHelper.DelayedTask(1);
            var t2 = t1.Then(inValue => TestHelper.DelayedTask(2 + inValue));

            t2.Wait();
            Assert.AreEqual(3, t2.Result);
        }
Exemple #20
0
        public void TaskHelper_Then_Continues_Completed_Tasks()
        {
            var completedTask = Completed <bool>();
            var t2            = completedTask.Then(_ => TestHelper.DelayedTask(true));

            t2.Wait();
            Assert.True(t2.Result);
        }
Exemple #21
0
        public async Task ConsiderResizingPool_Should_Increase_One_At_A_Time_Until_Max_Connections()
        {
            var mock            = GetPoolMock(null, GetConfig(1, 3));
            var creationCounter = 0;
            var isCreating      = 0;

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() =>
            {
                Interlocked.Increment(ref creationCounter);
                Interlocked.Exchange(ref isCreating, 1);
                return(TestHelper.DelayedTask(CreateConnection(), 50, () => Interlocked.Exchange(ref isCreating, 0)));
            });
            var pool = mock.Object;

            pool.SetDistance(HostDistance.Local);
            await pool.EnsureCreate();

            // Low in-flight
            pool.ConsiderResizingPool(20);
            Assert.AreEqual(1, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            // Above threshold
            pool.ConsiderResizingPool(1501);
            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(1, Volatile.Read(ref isCreating));
            // Wait for the creation
            await Task.Delay(100);

            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            // Wait for the connection pool to allow further connections
            await Task.Delay(2100);

            // Below threshold
            pool.ConsiderResizingPool(20);
            Assert.AreEqual(2, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            // Above threshold
            pool.ConsiderResizingPool(1700);
            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(1, Volatile.Read(ref isCreating));
            // Wait for the creation
            await Task.Delay(100);

            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            // Wait for the connection pool to allow further connections
            await Task.Delay(2100);

            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
            // Reached max: above threshold
            pool.ConsiderResizingPool(1700);
            // Still max
            Assert.AreEqual(3, Volatile.Read(ref creationCounter));
            Assert.AreEqual(0, Volatile.Read(ref isCreating));
        }
Exemple #22
0
        public void TaskHelper_Then_Propagates_Exceptions()
        {
            var tcs = new TaskCompletionSource <bool>();
            var t2  = tcs.Task.Then(_ => TestHelper.DelayedTask(true));

            tcs.SetException(new InvalidQueryException("Dummy exception"));
            var ex = Assert.Throws <AggregateException>(() => t2.Wait());

            Assert.IsInstanceOf <InvalidQueryException>(ex.InnerException);
            Assert.AreEqual("Dummy exception", ex.InnerException.Message);
        }
Exemple #23
0
        public void ScheduleReconnection_Should_Reconnect_In_The_Background()
        {
            var mock = GetPoolMock(null, GetConfig(1, 1, new ConstantReconnectionPolicy(50)));

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() => TestHelper.DelayedTask(CreateConnection(), 20));
            var pool = mock.Object;

            Assert.AreEqual(0, pool.OpenConnections);
            pool.ScheduleReconnection();
            Thread.Sleep(200);
            Assert.AreEqual(1, pool.OpenConnections);
        }
Exemple #24
0
        public void AttemptReconnection_Should_Reconnect_In_The_Background()
        {
            var mock = GetPoolMock();

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(CreateConnection(), 20));
            var pool = mock.Object;

            Assert.AreEqual(0, pool.OpenConnections.Count());
            pool.AttemptReconnection();
            Thread.Sleep(100);
            Assert.AreEqual(1, pool.OpenConnections.Count());
        }
        public void AttemptReconnection_Should_Reconnect_In_The_Background()
        {
            var mock = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig());

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(new Connection(ProtocolVersion, GetIpEndPoint(), GetConfig()), 20));
            var pool = mock.Object;

            Assert.AreEqual(0, pool.OpenConnections.Count());
            pool.AttemptReconnection();
            Thread.Sleep(100);
            Assert.AreEqual(1, pool.OpenConnections.Count());
        }
Exemple #26
0
        public void Dispose_Should_Cancel_Reconnection_Attempts()
        {
            var mock = GetPoolMock();

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask(CreateConnection(), 200));
            var pool = mock.Object;

            Assert.AreEqual(0, pool.OpenConnections.Count());
            pool.AttemptReconnection();
            pool.Dispose();
            Thread.Sleep(500);
            Assert.AreEqual(0, pool.OpenConnections.Count());
        }
Exemple #27
0
        public void SchemaParserV1_GetTable_Should_Parse_1_2_Table_With_Partition_And_Clustering_Keys()
        {
            var tableRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", "ks_tbl_meta" }, { "columnfamily_name", "tbl1" }, { "bloom_filter_fp_chance", 0.01 }, { "caching", "KEYS_ONLY" },
                { "column_aliases", "[\"zck\"]" }, { "comment", "" }, { "compaction_strategy_class", "org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy" }, { "compaction_strategy_options", "{}" },
                { "comparator", "org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.TimeUUIDType,org.apache.cassandra.db.marshal.UTF8Type)" }, { "compression_parameters", "{\"sstable_compression\":\"org.apache.cassandra.io.compress.SnappyCompressor\"}" }, { "default_validator", "org.apache.cassandra.db.marshal.BytesType" }, { "gc_grace_seconds", 864000 }, { "id", null }, { "key_alias", null },
                { "key_aliases", "[\"pk1\",\"apk2\"]" }, { "key_validator", "org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UUIDType,org.apache.cassandra.db.marshal.UTF8Type)" }, { "local_read_repair_chance", 0D }, { "max_compaction_threshold", 32 }, { "min_compaction_threshold", 4 }, { "populate_io_cache_on_flush", false }, { "read_repair_chance", 0.1 }, { "replicate_on_write", true }, { "subcomparator", null }, { "type", "Standard" }, { "value_alias", null }
            });
            var columnRows = new []
            {
                new Dictionary <string, object> {
                    { "keyspace_name", "ks_tbl_meta" }, { "columnfamily_name", "tbl1" }, { "column_name", "val2" }, { "component_index", 1 }, { "index_name", null }, { "index_options", null }, { "index_type", null }, { "validator", "org.apache.cassandra.db.marshal.BytesType" }
                },
                new Dictionary <string, object> {
                    { "keyspace_name", "ks_tbl_meta" }, { "columnfamily_name", "tbl1" }, { "column_name", "valz1" }, { "component_index", 1 }, { "index_name", null }, { "index_options", null }, { "index_type", null }, { "validator", "org.apache.cassandra.db.marshal.Int32Type" }
                }
            }.Select(TestHelper.CreateRow);

            var ksRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "keyspace_name", "ks1" },
                { "durable_writes", true },
                { "strategy_class", "Simple" },
                { "strategy_options", "{\"replication_factor\": \"1\"}" }
            });
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_keyspaces.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { ksRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_columnfamilies.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { tableRow }));
            queryProviderMock
            .Setup(cc => cc.QueryAsync(It.IsRegex("system\\.schema_columns.*ks1"), It.IsAny <bool>()))
            .Returns(() => TestHelper.DelayedTask(columnRows));
            var parser = GetV1Instance(queryProviderMock.Object);
            var ks     = TaskHelper.WaitToComplete(parser.GetKeyspace("ks1"));

            Assert.NotNull(ks);
            var table = ks.GetTableMetadata("ks_tbl_meta");

            Assert.False(table.Options.IsCompactStorage);
            Assert.NotNull(table.Options.Caching);
            Assert.AreEqual(5, table.TableColumns.Length);
            CollectionAssert.AreEqual(new[] { "pk1", "apk2" }, table.PartitionKeys.Select(c => c.Name));
            CollectionAssert.AreEqual(new[] { "zck" }, table.ClusteringKeys.Select(c => c.Item1.Name));
            CollectionAssert.AreEqual(new[] { SortOrder.Ascending }, table.ClusteringKeys.Select(c => c.Item2));
        }
        public void MaybeCreateCorePool_Fail_To_Open_All_Connections_Should_Fault_Task()
        {
            var mock          = new Mock <HostConnectionPool>(Host1, HostDistance.Local, GetConfig());
            var testException = new Exception("Dummy exception");

            mock.Setup(p => p.CreateConnection()).Returns(() => TestHelper.DelayedTask <Connection>(() =>
            {
                throw testException;
            }));
            var pool = mock.Object;
            var task = pool.MaybeCreateCorePool();
            var ex   = Assert.Throws <Exception>(() => TaskHelper.WaitToComplete(task));

            Assert.AreEqual(testException, ex);
        }
        public void EnsureCreate_Fail_To_Open_All_Connections_Should_Fault_Task()
        {
            var mock          = GetPoolMock();
            var testException = new Exception("Dummy exception");

            mock.Setup(p => p.DoCreateAndOpen()).Returns(() => TestHelper.DelayedTask <Connection>(() =>
            {
                throw testException;
            }));
            var pool = mock.Object;
            var task = pool.EnsureCreate();
            var ex   = Assert.Throws <Exception>(() => TaskHelper.WaitToComplete(task));

            Assert.AreEqual(testException, ex);
        }
        public void MaybeCreateFirstConnection_Should_Yield_The_First_Connection_Opened()
        {
            var mock     = GetPoolMock();
            var lastByte = 1;

            //use different addresses for same hosts to differentiate connections: for test only
            //different connections to same hosts should use the same address
            mock.Setup(p => p.DoCreateAndOpen()).Returns(() => TestHelper.DelayedTask(CreateConnection((byte)lastByte++), 200 - lastByte * 50));
            var pool     = mock.Object;
            var creation = pool.EnsureCreate();

            creation.Wait();
            Assert.AreEqual(1, creation.Result.Length);
            //yield the third connection first
            CollectionAssert.AreEqual(new[] { GetIpEndPoint() }, creation.Result.Select(c => c.Address));
        }