Skip to content

Commit dc4ece4

Browse files
author
rstam
committed
CSHARP-574: refactor so callers of GetMatchingInstances decide which instances should be matched against.
1 parent 3f74e5c commit dc4ece4

File tree

3 files changed

+46
-18
lines changed

3 files changed

+46
-18
lines changed

Driver/Internal/ConnectedInstanceCollection.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ public void Clear()
5757
}
5858

5959
/// <summary>
60-
/// Gets a list of InstanceWithPingTimes.
60+
/// Gets a list of all instances.
6161
/// </summary>
62-
/// <returns>The list of InstanceWithPingTimes</returns>
63-
public List<InstanceWithPingTime> GetInstancesWithPingTime()
62+
/// <returns>The list of all instances.</returns>
63+
public List<InstanceWithPingTime> GetAllInstances()
6464
{
6565
lock (_connectedInstancesLock)
6666
{
@@ -83,6 +83,38 @@ public MongoServerInstance GetPrimary()
8383
}
8484
}
8585

86+
/// <summary>
87+
/// Gets a list of primary and secondary instances.
88+
/// </summary>
89+
/// <returns>The list of primary and secondary instances.</returns>
90+
public List<InstanceWithPingTime> GetPrimaryAndSecondaries()
91+
{
92+
lock (_connectedInstancesLock)
93+
{
94+
// note: make copies of InstanceWithPingTime values because they can change after we return
95+
return _instances
96+
.Where(x => x.Instance.IsPrimary || x.Instance.IsSecondary)
97+
.Select(x => new InstanceWithPingTime { Instance = x.Instance, CachedAveragePingTime = x.CachedAveragePingTime })
98+
.ToList();
99+
}
100+
}
101+
102+
/// <summary>
103+
/// Gets a list of secondaries.
104+
/// </summary>
105+
/// <returns>The list of secondaries.</returns>
106+
public List<InstanceWithPingTime> GetSecondaries()
107+
{
108+
lock (_connectedInstancesLock)
109+
{
110+
// note: make copies of InstanceWithPingTime values because they can change after we return
111+
return _instances
112+
.Where(x => x.Instance.IsSecondary)
113+
.Select(x => new InstanceWithPingTime { Instance = x.Instance, CachedAveragePingTime = x.CachedAveragePingTime })
114+
.ToList();
115+
}
116+
}
117+
86118
/// <summary>
87119
/// Ensures that the instance is in the collection.
88120
/// </summary>

Driver/Internal/ReplicaSetMongoServerProxy.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ protected override MongoServerInstance ChooseServerInstance(ConnectedInstanceCol
8787
}
8888
else
8989
{
90-
return GetMatchingInstance(connectedInstances, readPreference, secondaryAcceptableLatency);
90+
return GetMatchingInstance(connectedInstances.GetSecondaries(), readPreference, secondaryAcceptableLatency);
9191
}
9292

9393
case ReadPreferenceMode.Secondary:
94-
return GetMatchingInstance(connectedInstances, readPreference, secondaryAcceptableLatency);
94+
return GetMatchingInstance(connectedInstances.GetSecondaries(), readPreference, secondaryAcceptableLatency);
9595

9696
case ReadPreferenceMode.SecondaryPreferred:
97-
var secondary = GetMatchingInstance(connectedInstances, readPreference, secondaryAcceptableLatency);
97+
var secondary = GetMatchingInstance(connectedInstances.GetSecondaries(), readPreference, secondaryAcceptableLatency);
9898
if (secondary != null)
9999
{
100100
return secondary;
@@ -105,7 +105,7 @@ protected override MongoServerInstance ChooseServerInstance(ConnectedInstanceCol
105105
}
106106

107107
case ReadPreferenceMode.Nearest:
108-
return GetMatchingInstance(connectedInstances, readPreference, secondaryAcceptableLatency);
108+
return GetMatchingInstance(connectedInstances.GetPrimaryAndSecondaries(), readPreference, secondaryAcceptableLatency);
109109

110110
default:
111111
throw new MongoInternalException("Invalid ReadPreferenceMode.");
@@ -203,13 +203,12 @@ protected override void ProcessConnectedInstanceStateChange(MongoServerInstance
203203
/// <summary>
204204
/// Gets a randomly selected matching instance.
205205
/// </summary>
206+
/// <param name="instancesWithPingTime">A list of instances from which to find a matching instance.</param>
206207
/// <param name="readPreference">The read preference that must be matched.</param>
207208
/// <param name="secondaryAcceptableLatency">The maximum acceptable secondary latency.</param>
208209
/// <returns>A randomly selected matching instance.</returns>
209-
public MongoServerInstance GetMatchingInstance(ConnectedInstanceCollection connectedInstances, ReadPreference readPreference, TimeSpan secondaryAcceptableLatency)
210+
public MongoServerInstance GetMatchingInstance(List<ConnectedInstanceCollection.InstanceWithPingTime> instancesWithPingTime, ReadPreference readPreference, TimeSpan secondaryAcceptableLatency)
210211
{
211-
var instancesWithPingTime = connectedInstances.GetInstancesWithPingTime();
212-
213212
var tagSets = readPreference.TagSets ?? new ReplicaSetTagSet[] { new ReplicaSetTagSet() };
214213
foreach (var tagSet in tagSets)
215214
{
@@ -224,15 +223,12 @@ public MongoServerInstance GetMatchingInstance(ConnectedInstanceCollection conne
224223
}
225224

226225
var instance = instanceWithPingTime.Instance;
227-
if (instance.IsSecondary || (readPreference.ReadPreferenceMode == ReadPreferenceMode.Nearest && instance.IsPrimary))
226+
if (tagSet.MatchesInstance(instance))
228227
{
229-
if (tagSet.MatchesInstance(instance))
228+
matchingInstances.Add(instance);
229+
if (maxPingTime == TimeSpan.MaxValue)
230230
{
231-
matchingInstances.Add(instance);
232-
if (maxPingTime == TimeSpan.MaxValue)
233-
{
234-
maxPingTime = instanceWithPingTime.CachedAveragePingTime + secondaryAcceptableLatency;
235-
}
231+
maxPingTime = instanceWithPingTime.CachedAveragePingTime + secondaryAcceptableLatency;
236232
}
237233
}
238234
}

Driver/Internal/ShardedMongoServerProxy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public ShardedMongoServerProxy(MongoServer server, IEnumerable<MongoServerInstan
5959
/// <returns>A MongoServerInstance.</returns>
6060
protected override MongoServerInstance ChooseServerInstance(ConnectedInstanceCollection connectedInstances, ReadPreference readPreference)
6161
{
62-
var instancesWithPingTime = connectedInstances.GetInstancesWithPingTime();
62+
var instancesWithPingTime = connectedInstances.GetAllInstances();
6363
if (instancesWithPingTime.Count == 0)
6464
{
6565
return null;

0 commit comments

Comments
 (0)