Esempio n. 1
0
 public void HashedWheelTimer_Should_Schedule_In_Order()
 {
     var results = new List<int>();
     var actions = new Action[100];
     var timer = new HashedWheelTimer(20, 8);
     Stopwatch watch = new Stopwatch();
     watch.Start();
     for (var i = 0; i < actions.Length; i++)
     {
         var index = i;
         actions[i] = () =>
         {
             // ReSharper disable once AccessToDisposedClosure
             timer.NewTimeout(() =>
             {
                 results.Add(index);
             }, 20 * (actions.Length - index));
         };
     }
     TestHelper.ParallelInvoke(actions);
     var counter = 0;
     while (results.Count < actions.Length && ++counter < 10)
     {
         Thread.Sleep(500);
         Trace.WriteLine("Slept " + counter);
     }
     Assert.AreEqual(actions.Length, results.Count);
     counter = 100;
     CollectionAssert.AreEqual(Enumerable.Repeat(0, actions.Length).Select(_ => --counter), results);
     timer.Dispose();
 }
Esempio n. 2
0
 public HostConnectionPool(Host host, HostDistance distance, Configuration config)
 {
     _host = host;
     _host.Down += OnHostDown;
     _host.Up += OnHostUp;
     _distance = distance;
     _config = config;
     _timer = config.Timer;
 }
Esempio n. 3
0
 public HostConnectionPool(Host host, HostDistance distance, Configuration config, Serializer serializer)
 {
     _host = host;
     _host.CheckedAsDown += OnHostCheckedAsDown;
     _host.Down          += OnHostDown;
     _host.Up            += OnHostUp;
     _host.Remove        += OnHostRemoved;
     _distance            = distance;
     _config              = config;
     _serializer          = serializer;
     _timer = config.Timer;
 }
 public HostConnectionPool(Host host, HostDistance distance, Configuration config, Serializer serializer)
 {
     _host = host;
     _host.CheckedAsDown += OnHostCheckedAsDown;
     _host.Down += OnHostDown;
     _host.Up += OnHostUp;
     _host.Remove += OnHostRemoved;
     _distance = distance;
     _config = config;
     _serializer = serializer;
     _timer = config.Timer;
 }
        public void TestCancelledTaskShouldNotBeExecuted(int interval, int timeout, int cancelDelayTime)
        {
            var timer   = new HashedWheelTimer(TimeSpan.FromMilliseconds(interval));
            var barrier = new CountdownEvent(1);

            var timedCallback = timer.ScheduleTimeout(() => {
                barrier.Signal();
            }, timeout);

            Task.Delay(TimeSpan.FromMilliseconds(cancelDelayTime)).Wait();
            Assert.True(timedCallback.TryCancel());
            Assert.False(barrier.Wait(timeout));
        }
        public void TestScheduleTimeoutShouldRunAfterDelay()
        {
            ITimer   timer   = new HashedWheelTimer();
            var      barrier = new CountdownEvent(1);
            ITimeout timeout = timer.NewTimeout(
                new ActionTimerTask(
                    t => { barrier.Signal(); }),
                TimeSpan.FromSeconds(2));

            Assert.True(barrier.Wait(TimeSpan.FromSeconds(3)));
            Assert.True(timeout.Expired, "timer should expire");
            timer.StopAsync().Wait();
        }
Esempio n. 7
0
 public HostConnectionPool(Host host, Configuration config, Serializer serializer)
 {
     _host                     = host;
     _host.Down               += OnHostDown;
     _host.Up                 += OnHostUp;
     _host.Remove             += OnHostRemoved;
     _host.DistanceChanged    += OnDistanceChanged;
     _config                   = config;
     _serializer               = serializer;
     _timer                    = config.Timer;
     _reconnectionSchedule     = config.Policies.ReconnectionPolicy.NewSchedule();
     _expectedConnectionLength = 1;
 }
        public void TestScheduleTimeoutShouldRunAfterDelay()
        {
            var    timer   = new HashedWheelTimer();
            var    barrier = new CountdownEvent(1);
            Action cb      = () => {
                Console.WriteLine("Test");
                barrier.Signal();;
            };
            TimedCallback timeout = timer.ScheduleTimeout(cb, TimeSpan.FromSeconds(4));

            Assert.False(timeout.IsExpired, "TimedTask should not expire");
            Assert.True(barrier.Wait(TimeSpan.FromSeconds(5)), "TimedTask should expire");
            timer.Stop();
        }
Esempio n. 9
0
        public void ShouldCancelTheTimer()
        {
            var expired      = false;
            var wheelTimer   = new HashedWheelTimer(16, 100);
            var cancellation = wheelTimer.SetTimeout(200, () => expired = true);

            wheelTimer.Start();

            cancellation.Cancel();

            Thread.Sleep(300);

            Assert.IsFalse(expired);
        }
        public void TestOverflow()
        {
            CountdownEvent barrier           = new CountdownEvent(1);
            const int      intervalMs        = 50;
            var            timer             = new HashedWheelTimer(interval: TimeSpan.FromMilliseconds(intervalMs));
            TimeSpan       superDureTimeSpan = TimeSpan.FromMilliseconds(intervalMs) * 0xffffffff;
            var            timeout           = timer.ScheduleTimeout(() =>
            {
                barrier.Signal();
            }, superDureTimeSpan);

            Assert.False(barrier.Wait(TimeSpan.FromSeconds(1)));
            Assert.True(timeout.TryCancel());
            timer.Stop();
        }
Esempio n. 11
0
 public HostConnectionPool(Host host, Configuration config, ISerializer serializer, IObserverFactory observerFactory)
 {
     _host                     = host;
     _host.Down               += OnHostDown;
     _host.Up                 += OnHostUp;
     _host.DistanceChanged    += OnDistanceChanged;
     _config                   = config ?? throw new ArgumentNullException(nameof(config));
     _poolingOptions           = config.GetOrCreatePoolingOptions(serializer.ProtocolVersion);
     _maxRequestsPerConnection = _poolingOptions.GetMaxRequestsPerConnection();
     _serializer               = serializer;
     _observerFactory          = observerFactory;
     _timer                    = config.Timer;
     _reconnectionSchedule     = config.Policies.ReconnectionPolicy.NewSchedule();
     _expectedConnectionLength = 1;
 }
Esempio n. 12
0
 public HostConnectionPool(Host host, Configuration config, Serializer serializer)
 {
     _host                     = host;
     _host.Down               += OnHostDown;
     _host.Up                 += OnHostUp;
     _host.Remove             += OnHostRemoved;
     _host.DistanceChanged    += OnDistanceChanged;
     _config                   = config ?? throw new ArgumentNullException(nameof(config));
     _maxRequestsPerConnection = config.GetPoolingOptions(serializer.ProtocolVersion)
                                 .GetMaxRequestsPerConnection();
     _serializer               = serializer;
     _timer                    = config.Timer;
     _reconnectionSchedule     = config.Policies.ReconnectionPolicy.NewSchedule();
     _expectedConnectionLength = 1;
 }
        public void TestDelayTimeoutShouldNotLargerThanSingleTickDuration(int tickInterval, int timeout)
        {
            var  watch   = new ConcurrentStopwatch();
            var  barrier = new CountdownEvent(1);
            var  timer   = new HashedWheelTimer(interval: TimeSpan.FromMilliseconds(tickInterval));
            long elapsed = 0;

            watch.Start();
            timer.ScheduleTimeout(() =>
            {
                Interlocked.Exchange(ref elapsed, watch.Elapsed);
                barrier.Signal();
            }, TimeSpan.FromMilliseconds(timeout));

            Assert.True(barrier.Wait(tickInterval * 2 + timeout), $"Elapsed: {NanoTime.ToMilliseconds(elapsed)}, ticks interval: {tickInterval}, timeout: {timeout}.");
        }
        public void TestScheduleTimeoutShouldNotRunBeforeDelay(double expiryTime, double waitTime)
        {
            var    timer   = new HashedWheelTimer();
            var    barrier = new CountdownEvent(1);
            bool   flag    = false;
            Action cb      = () => {
                flag = true;
                barrier.Signal();
            };
            TimedCallback timeout = timer.ScheduleTimeout(cb, TimeSpan.FromMilliseconds(expiryTime));

            Assert.False(barrier.Wait(TimeSpan.FromMilliseconds(waitTime)));
            Assert.False(timeout.IsExpired, "TimedTask should not be expired");
            Assert.False(flag);
            timer.Stop();
        }
Esempio n. 15
0
        public void PendingTimeouts()
        {
            var latch = new ManualResetEvent(false);
            var timer = new HashedWheelTimer();
            var t1    = timer.NewTimeout(new TimerTask(() => { }), TimeSpan.FromMinutes(100));
            var t2    = timer.NewTimeout(new TimerTask(() => { }), TimeSpan.FromMinutes(100));

            timer.NewTimeout(new ManualResetEventTask(latch), TimeSpan.FromMilliseconds(90));

            Assert.Equal(3, timer.PendingTimeouts);
            t1.Cancel();
            t2.Cancel();
            latch.WaitOne();
            Assert.Equal(0, timer.PendingTimeouts);
            timer.Stop();
        }
Esempio n. 16
0
        public void NewTimeoutShouldStopThrowingRejectedExecutionExceptionWhenExistingTimeoutIsCancelled()
        {
            var latch = new ManualResetEvent(false);
            var timer = new HashedWheelTimer(TimeSpan.FromMilliseconds(25), 4, 2);

            timer.NewTimeout(new TimerTask(() => { }), TimeSpan.FromSeconds(5));
            timer.NewTimeout(new ManualResetEventTask(latch), TimeSpan.FromMilliseconds(90));
            latch.WaitOne();

            var secondLatch = new ManualResetEvent(false);

            timer.NewTimeout(new ManualResetEventTask(secondLatch), TimeSpan.FromMilliseconds(90));
            secondLatch.WaitOne();

            timer.Stop();
        }
Esempio n. 17
0
        public void ShouldOnlyCancelThisTimer()
        {
            var expired       = new List <string>(3);
            var wheelTimer    = new HashedWheelTimer(16, 100);
            var cancellation1 = wheelTimer.SetTimeout(200, () => expired.Add("1"));
            var cancellation2 = wheelTimer.SetTimeout(200, () => expired.Add("2"));
            var cancellation3 = wheelTimer.SetTimeout(200, () => expired.Add("3"));

            wheelTimer.Start();

            cancellation2.Cancel();

            Thread.Sleep(300);

            Assert.AreEqual(2, expired.Count);
            CollectionAssert.DoesNotContain(expired, "2");
        }
Esempio n. 18
0
        public void ReportPendingTimeouts()
        {
            var latch = new CountdownEvent(1);
            var timer = new HashedWheelTimer();
            var t1    = timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromMinutes(100));
            var t2    = timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromMinutes(100));

            timer.NewTimeout(CreateCountdownEventTimerTask(latch), TimeSpan.FromMilliseconds(90));

            Assert.Equal(3, timer.PendingTimeouts);
            t1.Cancel();
            t2.Cancel();
            latch.Wait();

            Assert.Equal(0, timer.PendingTimeouts);
            timer.StopAsync().GetAwaiter().GetResult();
        }
        public void TestScheduleTimeoutShouldNotRunBeforeDelay()
        {
            ITimer   timer   = new HashedWheelTimer(TimeSpan.FromMilliseconds(100), 512, -1);
            var      barrier = new CountdownEvent(1);
            ITimeout timeout = timer.NewTimeout(
                new ActionTimerTask(
                    t =>
            {
                Assert.True(false, "This should not have run");
                barrier.Signal();
            }),
                TimeSpan.FromSeconds(10));

            Assert.False(barrier.Wait(TimeSpan.FromSeconds(3)));
            Assert.False(timeout.Expired, "timer should not expire");
            timer.StopAsync().Wait();
        }
Esempio n. 20
0
 public void HashedWheelTimer_Cancelled_Should_Be_Removed_From_Bucket()
 {
     using (var timer = new HashedWheelTimer(200, 8))
     {
         var flag = 0;
         timer.NewTimeout(_ => flag += 1, null, 500);
         //this callback should never be executed
         var timeout2 = (TimeoutItem)timer.NewTimeout(_ => flag += 2, null, 500);
         timer.NewTimeout(_ => flag += 4, null, 500);
         Thread.Sleep(300);
         Assert.NotNull(timeout2.Bucket);
         timeout2.Cancel();
         Thread.Sleep(800);
         Assert.AreEqual(5, flag);
         timer.Dispose();
     }
 }
Esempio n. 21
0
        [Fact] // (timeout = 3000)
        public void TestNewTimeoutShouldStopThrowingRejectedExecutionExceptionWhenExistingTimeoutIsExecuted()
        {
            var latch = new CountdownEvent(1);
            var timer = new HashedWheelTimer(TimeSpan.FromMilliseconds(25), 4, 2);

            timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromSeconds(5));
            timer.NewTimeout(CreateCountdownEventTimerTask(latch), TimeSpan.FromMilliseconds(90));

            latch.Wait(3000);

            var secondLatch = new CountdownEvent(1);

            timer.NewTimeout(CreateCountdownEventTimerTask(secondLatch), TimeSpan.FromMilliseconds(90));

            secondLatch.Wait(3000);
            timer.StopAsync().Wait();
        }
        [Fact] // (timeout = 3000)
        public void TestTimerShouldThrowExceptionAfterShutdownForNewTimeouts()
        {
            var    latch = new CountdownEvent(3);
            ITimer timer = new HashedWheelTimer();

            for (int i = 0; i < 3; i++)
            {
                timer.NewTimeout(
                    new ActionTimerTask(
                        t => { latch.Signal(); }),
                    TimeSpan.FromMilliseconds(1));
            }

            latch.Wait(3000);
            timer.StopAsync().Wait();

            Assert.Throws <RejectedExecutionException>(() => timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromMilliseconds(1)));
        }
        [Fact] // (timeout = 5000)
        public void TestTimerOverflowWheelLength()
        {
            var timer = new HashedWheelTimer(TimeSpan.FromMilliseconds(100), 32, -1);
            var latch = new CountdownEvent(3);

            ActionTimerTask task = null;

            task = new ActionTimerTask(
                t =>
            {
                timer.NewTimeout(task, TimeSpan.FromMilliseconds(100));
                latch.Signal();
            });
            timer.NewTimeout(task, TimeSpan.FromMilliseconds(100));

            Assert.True(latch.Wait(5000));
            Assert.NotEqual(0, timer.StopAsync().Result.Count);
        }
Esempio n. 24
0
        public void WheelTimer_Bucket_Should_Remove_Head_Items_Correctly()
        {
            using (var timer = new HashedWheelTimer(500, 10))
            {
                var bucket = new Bucket();

                var t1 = new TimeoutItem(timer, EmptyAction, null);
                var t2 = new TimeoutItem(timer, EmptyAction, null);
                var t3 = new TimeoutItem(timer, EmptyAction, null);
                var t4 = new TimeoutItem(timer, EmptyAction, null);

                bucket.Add(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1 });
                Assert.AreEqual(bucket.Tail, t1);

                bucket.Add(t2);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2 });
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Add(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3 });
                Assert.AreEqual(bucket.Tail, t3);

                bucket.Add(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t3, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4 });
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2 });
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Remove(t2);
                Assert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
            }
        }
Esempio n. 25
0
        public void SchemaParser_GetQueryTrace_When_First_QueryAsync_Fails_Exception_Should_Propagate()
        {
            var queryProviderMock = new Mock <IMetadataQueryProvider>(MockBehavior.Strict);

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

            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", ex.Message);
            timer.Dispose();
        }
Esempio n. 26
0
        public void WheelTimer_Bucket_Should_Remove_Head_Items_Correctly()
        {
            using (var timer = new HashedWheelTimer(500, 10))
            {
                var bucket = new Bucket();

                var t1 = new TimeoutItem(timer, EmptyAction, null);
                var t2 = new TimeoutItem(timer, EmptyAction, null);
                var t3 = new TimeoutItem(timer, EmptyAction, null);
                var t4 = new TimeoutItem(timer, EmptyAction, null);

                bucket.Add(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t1});
                Assert.AreEqual(bucket.Tail, t1);

                bucket.Add(t2);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t1, t2});
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Add(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t1, t2, t3});
                Assert.AreEqual(bucket.Tail, t3);

                bucket.Add(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t1, t2, t3, t4});
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t1);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t2, t3, t4});
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t3);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t2, t4});
                Assert.AreEqual(bucket.Tail, t4);

                bucket.Remove(t4);
                CollectionAssert.AreEqual(bucket.ToArray(), new[] {t2});
                Assert.AreEqual(bucket.Tail, t2);

                bucket.Remove(t2);
                Assert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
            }
        }
Esempio n. 27
0
        public void TestNewTimeoutShouldStopThrowingRejectedExecutionExceptionWhenExistingTimeoutIsCancelled()
        {
            var tickDurationMs = 100;
            var timer          = new HashedWheelTimer(TimeSpan.FromMilliseconds(tickDurationMs), 32, 2);

            timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromSeconds(5));
            var timeoutToCancel = timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromSeconds(5));

            Assert.True(timeoutToCancel.Cancel());

            Thread.Sleep(tickDurationMs * 5);

            var secondLatch = new CountdownEvent(1);

            timer.NewTimeout(CreateCountdownEventTimerTask(secondLatch), TimeSpan.FromMilliseconds(90));

            secondLatch.Wait();
            timer.StopAsync().Wait();
        }
Esempio n. 28
0
 public void HashedWheelTimer_Should_Not_Execute_Cancelled()
 {
     //Schedule 3 actions
     //sleep a couple of ms
     //Cancel one of them
     //Check that it has not been executed
     using (var timer = new HashedWheelTimer(200, 8))
     {
         var flag = 0;
         timer.NewTimeout(_ => flag += 1, null, 500);
         var timeout2 = timer.NewTimeout(_ => flag += 2, null, 500);
         timer.NewTimeout(_ => flag += 4, null, 500);
         Thread.Sleep(300);
         timeout2.Cancel();
         Thread.Sleep(800);
         Assert.AreEqual(5, flag);
         timer.Dispose();
     }
 }
        public void TestActivePendingTimeoutsShouldBeZero()
        {
            CountdownEvent barrier = new CountdownEvent(1);
            var            timer   = new HashedWheelTimer();
            var            t1      = timer.ScheduleTimeout(EmptyCallback(), TimeSpan.FromMinutes(100));
            var            t2      = timer.ScheduleTimeout(EmptyCallback(), TimeSpan.FromMinutes(100));

            timer.ScheduleTimeout(() =>
            {
                barrier.Signal();
            }, TimeSpan.FromMilliseconds(90));

            Assert.Equal(3, timer.ActiveTimeoutsCount);
            Assert.True(t1.TryCancel());
            Assert.True(t2.TryCancel());
            barrier.Wait();

            Assert.Equal(0, timer.ActiveTimeoutsCount);
            timer.Stop();
        }
        public void TestRejectedExecutionExceptionWhenTooManyTimeoutsAreAddedBackToBack()
        {
            var timer = new HashedWheelTimer(TimeSpan.FromMilliseconds(100), 32, 2);

            timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromSeconds(5));
            timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromSeconds(5));
            try
            {
                timer.NewTimeout(CreateNoOpTimerTask(), TimeSpan.FromMilliseconds(1));
                Assert.True(false, "Timer allowed adding 3 timeouts when maxPendingTimeouts was 2");
            }
            catch (RejectedExecutionException)
            {
                // Expected
            }
            finally
            {
                timer.StopAsync().Wait();
            }
        }
Esempio n. 31
0
        /// <summary>
        /// Creates a new instance. This class is also used to shareable a context across all instance that are created below one Cluster instance.
        /// One configuration instance per Cluster instance.
        /// </summary>
        internal Configuration(Policies policies,
                               ProtocolOptions protocolOptions,
                               PoolingOptions poolingOptions,
                               SocketOptions socketOptions,
                               ClientOptions clientOptions,
                               IAuthProvider authProvider,
                               IAuthInfoProvider authInfoProvider,
                               QueryOptions queryOptions,
                               IAddressTranslator addressTranslator,
                               IStartupOptionsFactory startupOptionsFactory,
                               ISessionFactoryBuilder <IInternalCluster, IInternalSession> sessionFactoryBuilder,
                               IRequestHandlerFactory requestHandlerFactory         = null,
                               IHostConnectionPoolFactory hostConnectionPoolFactory = null,
                               IRequestExecutionFactory requestExecutionFactory     = null,
                               IConnectionFactory connectionFactory = null,
                               IControlConnectionFactory controlConnectionFactory = null)
        {
            AddressTranslator     = addressTranslator ?? throw new ArgumentNullException(nameof(addressTranslator));
            QueryOptions          = queryOptions ?? throw new ArgumentNullException(nameof(queryOptions));
            Policies              = policies;
            ProtocolOptions       = protocolOptions;
            PoolingOptions        = poolingOptions;
            SocketOptions         = socketOptions;
            ClientOptions         = clientOptions;
            AuthProvider          = authProvider;
            AuthInfoProvider      = authInfoProvider;
            StartupOptionsFactory = startupOptionsFactory;
            SessionFactoryBuilder = sessionFactoryBuilder;

            RequestHandlerFactory     = requestHandlerFactory ?? new RequestHandlerFactory();
            HostConnectionPoolFactory = hostConnectionPoolFactory ?? new HostConnectionPoolFactory();
            RequestExecutionFactory   = requestExecutionFactory ?? new RequestExecutionFactory();
            ConnectionFactory         = connectionFactory ?? new ConnectionFactory();
            ControlConnectionFactory  = controlConnectionFactory ?? new ControlConnectionFactory();

            // Create the buffer pool with 16KB for small buffers and 256Kb for large buffers.
            // The pool does not eagerly reserve the buffers, so it doesn't take unnecessary memory
            // to create the instance.
            BufferPool = new RecyclableMemoryStreamManager(16 * 1024, 256 * 1024, ProtocolOptions.MaximumFrameLength);
            Timer      = new HashedWheelTimer();
        }
Esempio n. 32
0
 public void WheelTimer_Bucket_Should_Support_Add_And_Remove()
 {
     using (var timer = new HashedWheelTimer(500, 10))
     {
         var bucket = new Bucket();
         Assert.Null(bucket.Head);
         var t1 = new TimeoutItem(timer, EmptyAction, null);
         var t2 = new TimeoutItem(timer, EmptyAction, null);
         var t3 = new TimeoutItem(timer, EmptyAction, null);
         var t4 = new TimeoutItem(timer, EmptyAction, null);
         var t5 = new TimeoutItem(timer, EmptyAction, null);
         var t6 = new TimeoutItem(timer, EmptyAction, null);
         bucket.Add(t1);
         bucket.Add(t2);
         bucket.Add(t3);
         bucket.Add(t4);
         Assert.AreEqual(bucket.Head, t1);
         Assert.AreEqual(bucket.Tail, t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3, t4 });
         bucket.Remove(t3);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t4 });
         Assert.AreEqual(t2.Next, t4);
         Assert.AreEqual(t4.Previous, t2);
         bucket.Remove(t1);
         Assert.AreEqual(bucket.Head, t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4 });
         bucket.Add(t5);
         Assert.AreEqual(bucket.Tail, t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5 });
         bucket.Add(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5, t6 });
         bucket.Remove(t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t5, t6 });
         bucket.Remove(t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5, t6 });
         bucket.Remove(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5 });
         bucket.Remove(t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
     }
 }
Esempio n. 33
0
 public void WheelTimer_Bucket_Should_Support_Add_And_Remove()
 {
     using (var timer = new HashedWheelTimer(500, 10))
     {
         var bucket = new Bucket();
         Assert.Null(bucket.Head);
         var t1 = new TimeoutItem(timer, EmptyAction, null);
         var t2 = new TimeoutItem(timer, EmptyAction, null);
         var t3 = new TimeoutItem(timer, EmptyAction, null);
         var t4 = new TimeoutItem(timer, EmptyAction, null);
         var t5 = new TimeoutItem(timer, EmptyAction, null);
         var t6 = new TimeoutItem(timer, EmptyAction, null);
         bucket.Add(t1);
         bucket.Add(t2);
         bucket.Add(t3);
         bucket.Add(t4);
         Assert.AreEqual(bucket.Head, t1);
         Assert.AreEqual(bucket.Tail, t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t3, t4 });
         bucket.Remove(t3);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t1, t2, t4 });
         Assert.AreEqual(t2.Next, t4);
         Assert.AreEqual(t4.Previous, t2);
         bucket.Remove(t1);
         Assert.AreEqual(bucket.Head, t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4 });
         bucket.Add(t5);
         Assert.AreEqual(bucket.Tail, t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5 });
         bucket.Add(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t4, t5, t6 });
         bucket.Remove(t4);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t2, t5, t6 });
         bucket.Remove(t2);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5, t6 });
         bucket.Remove(t6);
         CollectionAssert.AreEqual(bucket.ToArray(), new[] { t5 });
         bucket.Remove(t5);
         CollectionAssert.AreEqual(bucket.ToArray(), new TimeoutItem[0]);
     }
 }
Esempio n. 34
0
        public void SchemaParser_GetQueryTrace_Should_Query_Traces_Tables()
        {
            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 eventRow = TestHelper.CreateRow(new Dictionary <string, object>
            {
                { "activity", "whatever" },
                { "event_id", TimeUuid.NewId() },
                { "source_elapsed", 100 },
                { "source", IPAddress.Parse("192.168.1.100") },
                { "thread", "thread name" }
            });
            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(() => TestHelper.DelayedTask <IEnumerable <Row> >(new[] { eventRow }));

            var queryTrace  = GetQueryTrace();
            var parser      = GetV1Instance(queryProviderMock.Object);
            var timer       = new HashedWheelTimer();
            var resultTrace = TaskHelper.WaitToComplete(parser.GetQueryTrace(queryTrace, timer));

            Assert.AreSame(queryTrace, resultTrace);
            Assert.Greater(queryTrace.DurationMicros, 0);
            Assert.AreEqual("test query", queryTrace.RequestType);
            Assert.AreEqual(1, queryTrace.Events.Count);
            Assert.AreEqual("whatever", queryTrace.Events.First().Description);
            timer.Dispose();
        }
Esempio n. 35
0
        public void TimerShouldThrowExceptionAfterShutdownForNewTimeouts()
        {
            var timer  = new HashedWheelTimer();
            int count1 = 3;

            for (int i = 0; i < 3; i++)
            {
                timer.NewTimeout(new TimerTask(() => { count1--; }), TimeSpan.FromMilliseconds(1));
            }

            while (count1 > 0)
            {
                Thread.Sleep(100);
            }

            timer.Stop();

            Assert.Throws <InvalidOperationException>(() =>
            {
                timer.NewTimeout(new TimerTask(() => { }), TimeSpan.FromMilliseconds(1));
            });
        }
Esempio n. 36
0
        public void SchemaParser_GetQueryTrace_When_First_QueryAsync_Fails_Exception_Should_Propagate()
        {
            var queryProviderMock = new Mock<IMetadataQueryProvider>(MockBehavior.Strict);
            queryProviderMock
                .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.sessions"), It.IsAny<bool>()))
                .Returns(() => TaskHelper.FromException<IEnumerable<Row>>(new Exception("Test exception")));
            queryProviderMock
                .Setup(cc => cc.QueryAsync(It.IsRegex("system_traces\\.events"), It.IsAny<bool>()))
                .Returns(() => TestHelper.DelayedTask(Enumerable.Empty<Row>()));

            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", ex.Message);
            timer.Dispose();
        }
Esempio n. 37
0
 public void HashedWheelTimer_Should_Not_Execute_Cancelled()
 {
     //Schedule 3 actions
     //sleep a couple of ms
     //Cancel one of them
     //Check that it has not been executed
     var timer = new HashedWheelTimer(200, 8);
     var flag = 0;
     timer.NewTimeout(() => flag += 1, 500);
     var timeout2 = timer.NewTimeout(() => flag += 2, 500);
     timer.NewTimeout(() => flag += 4, 500);
     Thread.Sleep(300);
     timeout2.Cancel();
     Thread.Sleep(800);
     Assert.AreEqual(5, flag);
     timer.Dispose();
 }
Esempio n. 38
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();
        }
 public void SpeculativeExecution_With_Multiple_Nodes_Pausing()
 {
     _testCluster = TestClusterManager.GetNonShareableTestCluster(3, 1, true, false);
     var session = GetSession(new ConstantSpeculativeExecutionPolicy(50L, 1));
     var timer = new HashedWheelTimer(1000, 64);
     timer.NewTimeout(_ => Task.Factory.StartNew(() => _testCluster.PauseNode(2)), null, 2000);
     //2 secs after resume node2
     timer.NewTimeout(_ => Task.Factory.StartNew(() => _testCluster.ResumeNode(2)), null, 4000);
     timer.NewTimeout(_ => Task.Factory.StartNew(() => _testCluster.PauseNode(1)), null, 6000);
     //4 secs after resume node1
     timer.NewTimeout(_ => Task.Factory.StartNew(() => _testCluster.ResumeNode(1)), null, 10000);
     var finished = false;
     timer.NewTimeout(_ => Task.Factory.StartNew(() => finished = true), null, 12000);
     //64 constant concurrent requests
     var semaphore = new SemaphoreSlim(64);
     while (!finished)
     {
         TestHelper.ParallelInvoke(() =>
         {
             semaphore.Wait();
             session.Execute(new SimpleStatement(QueryLocal).SetIdempotence(true));
             semaphore.Release();
         }, 512);
     }
     Thread.Sleep(1000);
     timer.Dispose();
 }
Esempio n. 40
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();
 }
Esempio n. 41
0
 /// <summary>
 /// Cancels the previous and set the next reconnection timeout, as an atomic operation.
 /// </summary>
 private void SetReconnectionTimeout(HashedWheelTimer.ITimeout nextTimeout)
 {
     var timeout = Interlocked.Exchange(ref _timeout, nextTimeout);
     if (timeout != null)
     {
         timeout.Cancel();
     }
 }
Esempio n. 42
0
        public void SchemaParser_GetQueryTrace_Should_Query_Traces_Tables()
        {
            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 eventRow = TestHelper.CreateRow(new Dictionary<string, object>
            {
                {"activity", "whatever"},
                {"event_id", TimeUuid.NewId()},
                {"source_elapsed", 100 },
                {"source", IPAddress.Parse("192.168.1.100")},
                {"thread", "thread name"}
            });
            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(() => TestHelper.DelayedTask<IEnumerable<Row>>(new[] { eventRow }));

            var queryTrace = GetQueryTrace();
            var parser = GetV1Instance(queryProviderMock.Object);
            var timer = new HashedWheelTimer();
            var resultTrace = TaskHelper.WaitToComplete(parser.GetQueryTrace(queryTrace, timer));
            Assert.AreSame(queryTrace, resultTrace);
            Assert.Greater(queryTrace.DurationMicros, 0);
            Assert.AreEqual("test query", queryTrace.RequestType);
            Assert.AreEqual(1, queryTrace.Events.Count);
            Assert.AreEqual("whatever", queryTrace.Events.First().Description);
            timer.Dispose();
        }
Esempio n. 43
0
 public void HashedWheelTimer_Cancelled_Should_Be_Removed_From_Bucket()
 {
     using (var timer = new HashedWheelTimer(200, 8))
     {
         var flag = 0;
         timer.NewTimeout(_ => flag += 1, null, 500);
         //this callback should never be executed
         var timeout2 = (TimeoutItem)timer.NewTimeout(_ => flag += 2, null, 500);
         timer.NewTimeout(_ => flag += 4, null, 500);
         Thread.Sleep(300);
         Assert.NotNull(timeout2.Bucket);
         timeout2.Cancel();
         Thread.Sleep(800);
         Assert.Null(timeout2.Bucket);
         Assert.AreEqual(5, flag);
         timer.Dispose();
     }
 }