Skip to content

Commit d269462

Browse files
committed
CSHARP574: added secondary acceptable latency to connection strings and urls to support changin the default value.
1 parent dc4ece4 commit d269462

9 files changed

+220
-7
lines changed

Driver/Core/MongoConnectionStringBuilder.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public class MongoConnectionStringBuilder : DbConnectionStringBuilder
5555
{ "readpreferencetags", "readPreferenceTags" },
5656
{ "replicaset", "replicaSet" },
5757
{ "safe", "safe" },
58+
{ "secondaryacceptablelatency", "secondaryAcceptableLatency" },
59+
{ "secondaryacceptablelatencyms", "secondaryAcceptableLatency" },
5860
{ "server", "server" },
5961
{ "servers", "server" },
6062
{ "slaveok", "slaveOk" },
@@ -88,6 +90,7 @@ public class MongoConnectionStringBuilder : DbConnectionStringBuilder
8890
private ReadPreference _readPreference;
8991
private string _replicaSetName;
9092
private SafeMode _safeMode;
93+
private TimeSpan _secondaryAcceptableLatency;
9194
private IEnumerable<MongoServerAddress> _servers;
9295
private bool? _slaveOk;
9396
private TimeSpan _socketTimeout;
@@ -362,6 +365,20 @@ public SafeMode SafeMode
362365
}
363366
}
364367

368+
/// <summary>
369+
/// Gets or sets the acceptable latency for considering a replica set member for inclusion in load balancing
370+
/// when using a read preference of Secondary, SecondaryPreferred, and Nearest.
371+
/// </summary>
372+
public TimeSpan SecondaryAcceptableLatency
373+
{
374+
get { return _secondaryAcceptableLatency; }
375+
set
376+
{
377+
_secondaryAcceptableLatency = value;
378+
base["SecondaryAcceptableLatency"] = MongoUrlBuilder.FormatTimeSpan(value);
379+
}
380+
}
381+
365382
/// <summary>
366383
/// Gets or sets the address of the server (see also Servers if using more than one address).
367384
/// </summary>
@@ -617,6 +634,10 @@ public override object this[string keyword]
617634
newSafeMode.Enabled = Convert.ToBoolean(value);
618635
SafeMode = newSafeMode;
619636
break;
637+
case "secondaryacceptablelatency":
638+
case "secondaryacceptablelatencyms":
639+
SecondaryAcceptableLatency = ToTimeSpan(keyword, value);
640+
break;
620641
case "server":
621642
case "servers":
622643
Servers = ParseServersString((string)value);
@@ -704,7 +725,8 @@ public MongoServerSettings ToServerSettings()
704725
var readPreference = ReadPreference ?? ReadPreference.Primary;
705726
return new MongoServerSettings(_connectionMode, _connectTimeout, null, defaultCredentials, _guidRepresentation, _ipv6,
706727
_maxConnectionIdleTime, _maxConnectionLifeTime, _maxConnectionPoolSize, _minConnectionPoolSize, readPreference, _replicaSetName,
707-
_safeMode ?? MongoDefaults.SafeMode, _servers, _socketTimeout, _useSsl, _verifySslCertificate, ComputedWaitQueueSize, _waitQueueTimeout);
728+
_safeMode ?? MongoDefaults.SafeMode, _secondaryAcceptableLatency, _servers, _socketTimeout, _useSsl, _verifySslCertificate,
729+
ComputedWaitQueueSize, _waitQueueTimeout);
708730
}
709731

710732
// private methods
@@ -773,6 +795,7 @@ private void ResetValues()
773795
_readPreference = null;
774796
_replicaSetName = null;
775797
_safeMode = null;
798+
_secondaryAcceptableLatency = MongoDefaults.SecondaryAcceptableLatency;
776799
_servers = null;
777800
_slaveOk = null;
778801
_socketTimeout = MongoDefaults.SocketTimeout;

Driver/Core/MongoServerSettings.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class MongoServerSettings
4444
private ReadPreference _readPreference;
4545
private string _replicaSetName;
4646
private SafeMode _safeMode;
47+
private TimeSpan _secondaryAcceptableLatency;
4748
private List<MongoServerAddress> _servers;
4849
private ReadOnlyCollection<MongoServerAddress> _serversReadOnly;
4950
private TimeSpan _socketTimeout;
@@ -76,6 +77,7 @@ public MongoServerSettings()
7677
_readPreference = ReadPreference.Primary;
7778
_replicaSetName = null;
7879
_safeMode = MongoDefaults.SafeMode;
80+
_secondaryAcceptableLatency = TimeSpan.FromMilliseconds(15);
7981
_servers = new List<MongoServerAddress> { new MongoServerAddress("localhost") };
8082
_serversReadOnly = new ReadOnlyCollection<MongoServerAddress>(_servers);
8183
_socketTimeout = MongoDefaults.SocketTimeout;
@@ -121,6 +123,7 @@ public MongoServerSettings(
121123
ReadPreference readPreference,
122124
string replicaSetName,
123125
SafeMode safeMode,
126+
TimeSpan secondaryAcceptableLatency,
124127
IEnumerable<MongoServerAddress> servers,
125128
TimeSpan socketTimeout,
126129
bool useSsl,
@@ -154,6 +157,7 @@ public MongoServerSettings(
154157
_readPreference = readPreference;
155158
_replicaSetName = replicaSetName;
156159
_safeMode = safeMode;
160+
_secondaryAcceptableLatency = secondaryAcceptableLatency;
157161
_servers = new List<MongoServerAddress>(servers);
158162
_serversReadOnly = new ReadOnlyCollection<MongoServerAddress>(_servers);
159163
_socketTimeout = socketTimeout;
@@ -361,6 +365,20 @@ public SafeMode SafeMode
361365
}
362366
}
363367

368+
/// <summary>
369+
/// Gets or sets the acceptable latency for considering a replica set member for inclusion in load balancing
370+
/// when using a read preference of Secondary, SecondaryPreferred, and Nearest.
371+
/// </summary>
372+
public TimeSpan SecondaryAcceptableLatency
373+
{
374+
get { return _secondaryAcceptableLatency; }
375+
set
376+
{
377+
if (_isFrozen) { throw new InvalidOperationException("MongoServerSettings is frozen."); }
378+
_secondaryAcceptableLatency = value;
379+
}
380+
}
381+
364382
/// <summary>
365383
/// Gets or sets the address of the server (see also Servers if using more than one address).
366384
/// </summary>
@@ -488,8 +506,8 @@ public MongoServerSettings Clone()
488506
{
489507
return new MongoServerSettings(_connectionMode, _connectTimeout, _credentialsStore.Clone(), _defaultCredentials,
490508
_guidRepresentation, _ipv6, _maxConnectionIdleTime, _maxConnectionLifeTime, _maxConnectionPoolSize,
491-
_minConnectionPoolSize, _readPreference, _replicaSetName, _safeMode, _servers, _socketTimeout, _useSsl, _verifySslCertificate,
492-
_waitQueueSize, _waitQueueTimeout);
509+
_minConnectionPoolSize, _readPreference, _replicaSetName, _safeMode, _secondaryAcceptableLatency, _servers,
510+
_socketTimeout, _useSsl, _verifySslCertificate, _waitQueueSize, _waitQueueTimeout);
493511
}
494512

495513
/// <summary>
@@ -526,6 +544,7 @@ public override bool Equals(object obj)
526544
_readPreference == rhs._readPreference &&
527545
_replicaSetName == rhs._replicaSetName &&
528546
_safeMode == rhs._safeMode &&
547+
_secondaryAcceptableLatency == rhs._secondaryAcceptableLatency &&
529548
_servers.SequenceEqual(rhs._servers) &&
530549
_socketTimeout == rhs._socketTimeout &&
531550
_useSsl == rhs._useSsl &&
@@ -626,6 +645,7 @@ public override int GetHashCode()
626645
hash = 37 * hash + _readPreference.GetHashCode();
627646
hash = 37 * hash + ((_replicaSetName == null) ? 0 : _replicaSetName.GetHashCode());
628647
hash = 37 * hash + _safeMode.GetHashCode();
648+
hash = 37 * hash + _secondaryAcceptableLatency.GetHashCode();
629649
foreach (var server in _servers)
630650
{
631651
hash = 37 * hash + server.GetHashCode();
@@ -663,6 +683,7 @@ public override string ToString()
663683
sb.AppendFormat("ReadPreference={0};", _readPreference);
664684
sb.AppendFormat("ReplicaSetName={0};", _replicaSetName);
665685
sb.AppendFormat("SafeMode={0};", _safeMode);
686+
sb.AppendFormat("SecondaryAcceptableLatency={0};", _secondaryAcceptableLatency);
666687
sb.AppendFormat("Servers={0};", string.Join(",", _servers.Select(s => s.ToString()).ToArray()));
667688
sb.AppendFormat("SocketTimeout={0};", _socketTimeout);
668689
sb.AppendFormat("Ssl={0};", _useSsl);

Driver/Core/MongoUrlBuilder.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class MongoUrlBuilder
4747
private ReadPreference _readPreference;
4848
private string _replicaSetName;
4949
private SafeMode _safeMode;
50+
private TimeSpan _secondaryAcceptableLatency;
5051
private IEnumerable<MongoServerAddress> _servers;
5152
private bool? _slaveOk;
5253
private TimeSpan _socketTimeout;
@@ -231,6 +232,16 @@ public SafeMode SafeMode
231232
set { _safeMode = value; }
232233
}
233234

235+
/// <summary>
236+
/// Gets or sets the acceptable latency for considering a replica set member for inclusion in load balancing
237+
/// when using a read preference of Secondary, SecondaryPreferred, and Nearest.
238+
/// </summary>
239+
public TimeSpan SecondaryAcceptableLatency
240+
{
241+
get { return _secondaryAcceptableLatency; }
242+
set { _secondaryAcceptableLatency = value; }
243+
}
244+
234245
/// <summary>
235246
/// Gets or sets the address of the server (see also Servers if using more than one address).
236247
/// </summary>
@@ -637,6 +648,10 @@ public void Parse(string url)
637648
if (_safeMode == null) { _safeMode = new SafeMode(false); }
638649
SafeMode.Enabled = ParseBoolean(name, value);
639650
break;
651+
case "secondaryacceptablelatency":
652+
case "secondaryacceptablelatencyms":
653+
_secondaryAcceptableLatency = ParseTimeSpan(name, value);
654+
break;
640655
case "slaveok":
641656
_slaveOk = ParseBoolean(name, value);
642657
break;
@@ -706,7 +721,8 @@ public MongoServerSettings ToServerSettings()
706721
var readPreference = ReadPreference ?? ReadPreference.Primary;
707722
return new MongoServerSettings(_connectionMode, _connectTimeout, null, _defaultCredentials, _guidRepresentation, _ipv6,
708723
_maxConnectionIdleTime, _maxConnectionLifeTime, _maxConnectionPoolSize, _minConnectionPoolSize, readPreference, _replicaSetName,
709-
_safeMode ?? MongoDefaults.SafeMode, _servers, _socketTimeout, _useSsl, _verifySslCertificate, ComputedWaitQueueSize, _waitQueueTimeout);
724+
_safeMode ?? MongoDefaults.SafeMode, _secondaryAcceptableLatency, _servers, _socketTimeout, _useSsl, _verifySslCertificate,
725+
ComputedWaitQueueSize, _waitQueueTimeout);
710726
}
711727

712728
/// <summary>
@@ -827,6 +843,10 @@ public override string ToString()
827843
{
828844
query.AppendFormat("minPoolSize={0};", _minConnectionPoolSize);
829845
}
846+
if (_secondaryAcceptableLatency != MongoDefaults.SecondaryAcceptableLatency)
847+
{
848+
query.AppendFormat("secondaryAcceptableLatency={0};", FormatTimeSpan(_secondaryAcceptableLatency));
849+
}
830850
if (_socketTimeout != MongoDefaults.SocketTimeout)
831851
{
832852
query.AppendFormat("socketTimeout={0};", FormatTimeSpan(_socketTimeout));
@@ -876,6 +896,7 @@ private void ResetValues()
876896
_readPreference = null;
877897
_replicaSetName = null;
878898
_safeMode = null;
899+
_secondaryAcceptableLatency = MongoDefaults.SecondaryAcceptableLatency;
879900
_servers = null;
880901
_slaveOk = null;
881902
_socketTimeout = MongoDefaults.SocketTimeout;

Driver/Internal/MultipleInstanceMongoServerProxy.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ public MongoServerState State
139139
}
140140
}
141141

142+
//protected properties
143+
/// <summary>
144+
/// Gets the server.
145+
/// </summary>
146+
protected MongoServer Server
147+
{
148+
get { return _server; }
149+
}
150+
142151
// public methods
143152
/// <summary>
144153
/// Chooses the server instance.

Driver/Internal/ReplicaSetMongoServerProxy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public string ReplicaSetName
7272
// protected methods
7373
protected override MongoServerInstance ChooseServerInstance(ConnectedInstanceCollection connectedInstances, ReadPreference readPreference)
7474
{
75-
var secondaryAcceptableLatency = TimeSpan.FromMilliseconds(15); // TODO: make configurable
75+
var secondaryAcceptableLatency = Server.Settings.SecondaryAcceptableLatency;
7676

7777
switch (readPreference.ReadPreferenceMode)
7878
{
@@ -207,7 +207,7 @@ protected override void ProcessConnectedInstanceStateChange(MongoServerInstance
207207
/// <param name="readPreference">The read preference that must be matched.</param>
208208
/// <param name="secondaryAcceptableLatency">The maximum acceptable secondary latency.</param>
209209
/// <returns>A randomly selected matching instance.</returns>
210-
public MongoServerInstance GetMatchingInstance(List<ConnectedInstanceCollection.InstanceWithPingTime> instancesWithPingTime, ReadPreference readPreference, TimeSpan secondaryAcceptableLatency)
210+
private MongoServerInstance GetMatchingInstance(List<ConnectedInstanceCollection.InstanceWithPingTime> instancesWithPingTime, ReadPreference readPreference, TimeSpan secondaryAcceptableLatency)
211211
{
212212
var tagSets = readPreference.TagSets ?? new ReplicaSetTagSet[] { new ReplicaSetTagSet() };
213213
foreach (var tagSet in tagSets)

Driver/Internal/ShardedMongoServerProxy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ protected override MongoServerInstance ChooseServerInstance(ConnectedInstanceCol
6666
}
6767
else
6868
{
69-
var secondaryAcceptableLatency = TimeSpan.FromMilliseconds(15); // TODO: make configurable
69+
var secondaryAcceptableLatency = Server.Settings.SecondaryAcceptableLatency;
7070
var minPingTime = instancesWithPingTime[0].CachedAveragePingTime;
7171
var maxPingTime = minPingTime + secondaryAcceptableLatency;
7272
var n = instancesWithPingTime.Count(i => i.CachedAveragePingTime <= maxPingTime);

Driver/MongoDefaults.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public static class MongoDefaults
3737
private static int __maxMessageLength = 16000000; // 16MB (not 16 MiB!)
3838
private static int __minConnectionPoolSize = 0;
3939
private static SafeMode __safeMode = SafeMode.False;
40+
private static TimeSpan __secondaryAcceptableLatency = TimeSpan.FromMilliseconds(15);
4041
private static TimeSpan __socketTimeout = TimeSpan.Zero; // use operating system default (presumably infinite)
4142
private static int __tcpReceiveBufferSize = 64 * 1024; // 64KiB (note: larger than 2MiB fails on Mac using Mono)
4243
private static int __tcpSendBufferSize = 64 * 1024; // 64KiB (TODO: what is the optimum value for the buffers?)
@@ -153,6 +154,16 @@ public static SafeMode SafeMode
153154
set { __safeMode = value; }
154155
}
155156

157+
/// <summary>
158+
/// Gets or sets the default acceptable latency for considering a replica set member for inclusion in load balancing
159+
/// when using a read preference of Secondary, SecondaryPreferred, and Nearest.
160+
/// </summary>
161+
public static TimeSpan SecondaryAcceptableLatency
162+
{
163+
get { return __secondaryAcceptableLatency; }
164+
set { __secondaryAcceptableLatency = value; }
165+
}
166+
156167
/// <summary>
157168
/// Gets or sets the socket timeout.
158169
/// </summary>

0 commit comments

Comments
 (0)