public void EachViewDoesNotSkip() { var seeds = Enumerable.Range(9200, NumberOfNodes).Select(p => new Node(new Uri("http://localhost:" + p))).ToList(); var pool = new StickyConnectionPool(seeds); for (var i = 0; i < 20; i++) { var node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); } }
public void ViewSeesResurrectedNodes() { var dateTimeProvider = new TestableDateTimeProvider(); var seeds = Enumerable.Range(9200, NumberOfNodes).Select(p => new Node(new Uri("http://localhost:" + p))).ToList(); seeds.First().MarkDead(dateTimeProvider.Now().AddDays(1)); var pool = new StickyConnectionPool(seeds, dateTimeProvider: dateTimeProvider); for (var i = 0; i < 20; i++) { var node = pool.CreateView().First(); node.Uri.Port.Should().Be(9201); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9201); } /** If we forward our clock 2 days the node that was marked dead until tomorrow (or yesterday!) should be resurrected */ dateTimeProvider.ChangeTime(d => d.AddDays(2)); var n = pool.CreateView().First(); n.Uri.Port.Should().Be(9200); n = pool.CreateView().First(); n.Uri.Port.Should().Be(9200); n = pool.CreateView().First(); n.Uri.Port.Should().Be(9200); n.IsResurrected.Should().BeTrue(); }
public void EachViewSeesNextButSkipsTheDeadNode() { var seeds = Enumerable.Range(9200, NumberOfNodes).Select(p => new Node(new Uri("http://localhost:" + p))).ToList(); seeds.First().MarkDead(DateTime.Now.AddDays(1)); var pool = new StickyConnectionPool(seeds); for (var i = 0; i < 20; i++) { var node = pool.CreateView().First(); node.Uri.Port.Should().Be(9201); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9201); } /** After we mark the first node alive again we expect it to be hit again*/ seeds.First().MarkAlive(); for (var i = 0; i < 20; i++) { var node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); node = pool.CreateView().First(); node.Uri.Port.Should().Be(9200); } }
public void AssertCreateView(StickyConnectionPool pool) { /** * Here we have setup a static connection pool seeded with 10 nodes. * So what order we expect? Imagine the following: * * Thread A calls GetNext and gets returned the first live node * Thread B calls GetNext() and gets returned the same node as it's still the first live. */ var startingPositions = Enumerable.Range(0, NumberOfNodes) .Select(i => pool.CreateView().First()) .Select(n => n.Uri.Port) .ToList(); var expectedOrder = Enumerable.Repeat(9200, NumberOfNodes); startingPositions.Should().ContainInOrder(expectedOrder); }
public void EachViewStartsAtNextPositionAndWrapsOver() { var numberOfNodes = 10; var uris = Enumerable.Range(9200, numberOfNodes).Select(p => new Uri("http://localhost:" + p)); var pool = new StickyConnectionPool(uris); /** * Here we have setup a sticky connection pool seeded with 10 nodes. * So what order we expect? Imagine the following: * * Thread A calls GetNext and gets returned the first live node * Thread B calls GetNext() and gets returned the same node as it's still the first live. */ var startingPositions = Enumerable.Range(0, numberOfNodes) .Select(i => pool.CreateView().First()) .Select(n => n.Uri.Port) .ToList(); var expectedOrder = Enumerable.Repeat(9200, numberOfNodes); startingPositions.Should().ContainInOrder(expectedOrder); }