Skip to content

Commit d0f99d4

Browse files
authored
Fix test for random initialized node (#4134) (#4144)
The test was using a local method that yielded a single pool while later .Take(50) was requested on this sequence. This always yields an enumeration with 1 element which increases the chances for the assertion to turn false. Rather than relying on Thread.Sleep to create different seeded randoms the StaticConnectionPool now defines a protected constructor that allows one to pass in a seed value. (cherry picked from commit 9734f04)
1 parent 35d80a8 commit d0f99d4

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

src/Elasticsearch.Net/ConnectionPool/SniffingConnectionPool.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public SniffingConnectionPool(IEnumerable<Node> nodes, bool randomize = true, ID
1717
: base(nodes, randomize, dateTimeProvider) { }
1818

1919
public SniffingConnectionPool(IEnumerable<Node> nodes, Func<Node, float> nodeScorer, IDateTimeProvider dateTimeProvider = null)
20-
: base(nodes, nodeScorer, false, dateTimeProvider) { }
20+
: base(nodes, nodeScorer, dateTimeProvider) { }
2121

2222
/// <inheritdoc />
2323
public override IReadOnlyCollection<Node> Nodes

src/Elasticsearch.Net/ConnectionPool/StaticConnectionPool.cs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,36 @@ public class StaticConnectionPool : IConnectionPool
1212
private readonly Func<Node, float> _nodeScorer;
1313

1414
public StaticConnectionPool(IEnumerable<Uri> uris, bool randomize = true, IDateTimeProvider dateTimeProvider = null)
15-
: this(uris.Select(uri => new Node(uri)), randomize, dateTimeProvider) { }
15+
: this(uris.Select(uri => new Node(uri)), randomize, null, dateTimeProvider) { }
1616

1717
public StaticConnectionPool(IEnumerable<Node> nodes, bool randomize = true, IDateTimeProvider dateTimeProvider = null)
18-
: this(nodes, null, randomize, dateTimeProvider) { }
18+
: this(nodes, randomize, null, dateTimeProvider) { }
1919

20+
protected StaticConnectionPool(IEnumerable<Node> nodes, bool randomize, int? randomizeSeed = null, IDateTimeProvider dateTimeProvider = null)
21+
{
22+
Randomize = randomize;
23+
Random = !randomize || !randomizeSeed.HasValue
24+
? new Random()
25+
: new Random(randomizeSeed.Value);
26+
27+
Initialize(nodes, dateTimeProvider);
28+
}
2029
//this constructor is protected because nodeScorer only makes sense on subclasses that support reseeding
2130
//otherwise just manually sort `nodes` before instantiating.
22-
protected StaticConnectionPool(IEnumerable<Node> nodes, Func<Node, float> nodeScorer = null, bool randomize = true, IDateTimeProvider dateTimeProvider = null)
31+
protected StaticConnectionPool(IEnumerable<Node> nodes, Func<Node, float> nodeScorer = null, IDateTimeProvider dateTimeProvider = null)
2332
{
24-
nodes.ThrowIfEmpty(nameof(nodes));
33+
_nodeScorer = nodeScorer;
34+
Initialize(nodes, dateTimeProvider);
35+
}
36+
37+
private void Initialize(IEnumerable<Node> nodes, IDateTimeProvider dateTimeProvider)
38+
{
39+
var nodesProvided = nodes?.ToList() ?? throw new ArgumentNullException(nameof(nodes));
40+
nodesProvided.ThrowIfEmpty(nameof(nodes));
41+
DateTimeProvider = dateTimeProvider ?? Net.DateTimeProvider.Default;
42+
2543
string scheme = null;
26-
foreach (var node in nodes)
44+
foreach (var node in nodesProvided)
2745
{
2846
if (scheme == null)
2947
{
@@ -34,10 +52,7 @@ protected StaticConnectionPool(IEnumerable<Node> nodes, Func<Node, float> nodeSc
3452
throw new ArgumentException("Trying to instantiate a connection pool with mixed URI Schemes");
3553
}
3654

37-
DateTimeProvider = dateTimeProvider ?? Net.DateTimeProvider.Default;
38-
Randomize = randomize;
39-
_nodeScorer = nodeScorer;
40-
InternalNodes = SortNodes(nodes)
55+
InternalNodes = SortNodes(nodesProvided)
4156
.DistinctBy(n => n.Uri)
4257
.ToList();
4358
LastUpdate = DateTimeProvider.Now();
@@ -62,7 +77,7 @@ protected StaticConnectionPool(IEnumerable<Node> nodes, Func<Node, float> nodeSc
6277
public virtual bool SupportsReseeding => false;
6378

6479
/// <inheritdoc />
65-
public bool UsingSsl { get; }
80+
public bool UsingSsl { get; private set; }
6681

6782
protected List<Node> AliveNodes
6883
{
@@ -75,10 +90,10 @@ protected List<Node> AliveNodes
7590
}
7691
}
7792

78-
protected IDateTimeProvider DateTimeProvider { get; }
93+
protected IDateTimeProvider DateTimeProvider { get; private set; }
7994

8095
protected List<Node> InternalNodes { get; set; }
81-
protected Random Random { get; } = new Random();
96+
protected Random Random { get; }
8297
protected bool Randomize { get; }
8398

8499
/// <summary>

src/Tests/Tests/ClientConcepts/ConnectionPooling/BuildingBlocks/ConnectionPooling.doc.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Elasticsearch.Net;
88
using FluentAssertions;
99
using Nest;
10+
using Tests.Configuration;
1011
using Tests.Framework;
1112
using Tests.XPack.Security.Privileges;
1213

@@ -216,20 +217,30 @@ [U] public void Static()
216217
}
217218
}
218219

220+
//hide
221+
private class SeededRandomConectionPool : StaticConnectionPool
222+
{
223+
public SeededRandomConectionPool(IEnumerable<Node> nodes, int seed)
224+
: base(nodes, randomize: true, randomizeSeed: seed, dateTimeProvider: null)
225+
{}
226+
}
227+
219228
// hide
220229
[U] public void RandomizedInitialNodes()
221230
{
222-
IEnumerable<StaticConnectionPool> CreatStaticConnectionPools()
231+
IEnumerable<StaticConnectionPool> CreateSeededPools(int nodeCount, int pools)
223232
{
224-
Thread.Sleep(1);
225-
var uris = Enumerable.Range(1, 50).Select(i => new Uri($"https://10.0.0.{i}:9200/"));
226-
yield return new StaticConnectionPool(uris);
233+
var seed = TestConfiguration.Instance.Seed;
234+
var nodes = Enumerable.Range(1, nodeCount)
235+
.Select(i => new Node(new Uri($"https://10.0.0.{i}:9200/")))
236+
.ToList();
237+
for(var i = 0; i < nodeCount; i++)
238+
yield return new SeededRandomConectionPool(nodes, seed + i);
227239
}
228240

229-
// assertion works on the probability of seeing a Uri other than https://10.0.0.1:9200/
230-
// as the first value over 50 runs, when randomized.
231-
CreatStaticConnectionPools()
232-
.Take(50)
241+
var connectionPools = CreateSeededPools(100, 100).ToList();
242+
connectionPools.Should().HaveCount(100);
243+
connectionPools
233244
.Select(p => p.CreateView().First().Uri.ToString())
234245
.All(uri => uri == "https://10.0.0.1:9200/")
235246
.Should()

0 commit comments

Comments
 (0)