Skip to content

Commit f9af528

Browse files
committed
CSHARP-1823: Minor change to how MaxStaleness is validated against HeartbeatInterval and IdleWritePeriod.
1 parent 805ccec commit f9af528

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

src/MongoDB.Driver.Core/Core/Clusters/ServerSelectors/ReadPreferenceServerSelector.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,20 +255,43 @@ private void EnsureMaxStalenessIsValid(ClusterDescription cluster)
255255
{
256256
if (_maxStaleness.HasValue)
257257
{
258-
var primary = SelectPrimary(cluster.Servers).SingleOrDefault();
259-
var primaryIdleWritePeriod = primary?.IdleWritePeriod;
258+
TimeSpan heartbeatInterval;
259+
TimeSpan idleWritePeriod;
260260

261-
foreach (var server in cluster.Servers)
261+
var primary = SelectPrimary(cluster.Servers).SingleOrDefault();
262+
if (primary != null)
263+
{
264+
heartbeatInterval = primary.HeartbeatInterval;
265+
idleWritePeriod = primary.IdleWritePeriod;
266+
}
267+
else
262268
{
263-
if (server.Type == ServerType.ReplicaSetPrimary || server.Type == ServerType.ReplicaSetSecondary)
269+
ServerDescription secondaryWithGreatestLastUpdateTime = null;
270+
foreach (var secondary in SelectSecondaries(cluster.Servers))
264271
{
265-
var heartbeatInterval = server.HeartbeatInterval;
266-
var idleWriteTime = primaryIdleWritePeriod ?? server.IdleWritePeriod;
267-
if (_maxStaleness.Value < heartbeatInterval + idleWriteTime)
272+
if (secondaryWithGreatestLastUpdateTime == null || secondary.LastUpdateTimestamp > secondaryWithGreatestLastUpdateTime.LastUpdateTimestamp)
268273
{
269-
throw new Exception("Max staleness must greater than or equal to heartbeat interval plus idle write period.");
274+
secondaryWithGreatestLastUpdateTime = secondary;
270275
}
271276
}
277+
278+
if (secondaryWithGreatestLastUpdateTime == null)
279+
{
280+
return;
281+
}
282+
283+
heartbeatInterval = secondaryWithGreatestLastUpdateTime.HeartbeatInterval;
284+
idleWritePeriod = secondaryWithGreatestLastUpdateTime.IdleWritePeriod;
285+
}
286+
287+
if (_maxStaleness.Value < heartbeatInterval + idleWritePeriod)
288+
{
289+
var message = string.Format(
290+
"Max staleness ({0} ms) must greater than or equal to heartbeat interval ({1} ms) plus idle write period ({2} ms).",
291+
(int)_maxStaleness.Value.TotalMilliseconds,
292+
(int)heartbeatInterval.TotalMilliseconds,
293+
(int)idleWritePeriod.TotalMilliseconds);
294+
throw new Exception(message);
272295
}
273296
}
274297
}

tests/MongoDB.Driver.Core.Tests.Dotnet/Specifications/max-staleness/tests/ReplicaSetNoPrimary/IdleWritePeriod.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
{
3737
"address": "b:27017",
3838
"avg_rtt_ms": 50,
39-
"idleWritePeriodMillis": 9000,
39+
"idleWritePeriodMillis": 11000,
4040
"lastUpdateTime": 0,
4141
"lastWrite": {
4242
"lastWriteDate": {
@@ -65,7 +65,7 @@
6565
{
6666
"address": "b:27017",
6767
"avg_rtt_ms": 50,
68-
"idleWritePeriodMillis": 9000,
68+
"idleWritePeriodMillis": 11000,
6969
"lastUpdateTime": 0,
7070
"lastWrite": {
7171
"lastWriteDate": {

tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/IdleWritePeriod.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
{
3737
"address": "b:27017",
3838
"avg_rtt_ms": 50,
39-
"idleWritePeriodMillis": 9000,
39+
"idleWritePeriodMillis": 11000,
4040
"lastUpdateTime": 0,
4141
"lastWrite": {
4242
"lastWriteDate": {
@@ -65,7 +65,7 @@
6565
{
6666
"address": "b:27017",
6767
"avg_rtt_ms": 50,
68-
"idleWritePeriodMillis": 9000,
68+
"idleWritePeriodMillis": 11000,
6969
"lastUpdateTime": 0,
7070
"lastWrite": {
7171
"lastWriteDate": {

0 commit comments

Comments
 (0)