Skip to content

Commit 20391c9

Browse files
authored
CSHARP-4615: Switch to polling monitoring on FaaS environment. (#1237)
1 parent e43cad9 commit 20391c9

32 files changed

+1271
-137
lines changed

specifications/server-discovery-and-monitoring/tests/unified/serverMonitoringMode.json

Lines changed: 449 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
description: serverMonitoringMode
2+
3+
schemaVersion: "1.17"
4+
# These tests cannot run on replica sets because the order of the expected
5+
# SDAM events are non-deterministic when monitoring multiple servers.
6+
# They also cannot run on Serverless or load balanced clusters where SDAM is disabled.
7+
runOnRequirements:
8+
- topologies: [single, sharded, sharded-replicaset]
9+
serverless: forbid
10+
tests:
11+
- description: "connect with serverMonitoringMode=auto >=4.4"
12+
runOnRequirements:
13+
- minServerVersion: "4.4.0"
14+
operations:
15+
- name: createEntities
16+
object: testRunner
17+
arguments:
18+
entities:
19+
- client:
20+
id: client
21+
uriOptions:
22+
serverMonitoringMode: "auto"
23+
useMultipleMongoses: false
24+
observeEvents:
25+
- serverHeartbeatStartedEvent
26+
- serverHeartbeatSucceededEvent
27+
- serverHeartbeatFailedEvent
28+
- database:
29+
id: db
30+
client: client
31+
databaseName: sdam-tests
32+
- &ping
33+
name: runCommand
34+
object: db
35+
arguments:
36+
commandName: ping
37+
command: { ping: 1 }
38+
expectResult: { ok: 1 }
39+
# Wait for the second serverHeartbeatStartedEvent to ensure we start streaming.
40+
- &waitForSecondHeartbeatStarted
41+
name: waitForEvent
42+
object: testRunner
43+
arguments:
44+
client: client
45+
event:
46+
serverHeartbeatStartedEvent: {}
47+
count: 2
48+
expectEvents: &streamingStartedEvents
49+
- client: client
50+
eventType: sdam
51+
ignoreExtraEvents: true
52+
events:
53+
- serverHeartbeatStartedEvent:
54+
awaited: False
55+
- serverHeartbeatSucceededEvent:
56+
awaited: False
57+
- serverHeartbeatStartedEvent:
58+
awaited: True
59+
60+
- description: "connect with serverMonitoringMode=auto <4.4"
61+
runOnRequirements:
62+
- maxServerVersion: "4.2.99"
63+
operations:
64+
- name: createEntities
65+
object: testRunner
66+
arguments:
67+
entities:
68+
- client:
69+
id: client
70+
uriOptions:
71+
serverMonitoringMode: "auto"
72+
heartbeatFrequencyMS: 500
73+
useMultipleMongoses: false
74+
observeEvents:
75+
- serverHeartbeatStartedEvent
76+
- serverHeartbeatSucceededEvent
77+
- serverHeartbeatFailedEvent
78+
- database:
79+
id: db
80+
client: client
81+
databaseName: sdam-tests
82+
- *ping
83+
# Wait for the second serverHeartbeatStartedEvent to ensure we do not stream.
84+
- *waitForSecondHeartbeatStarted
85+
expectEvents: &pollingStartedEvents
86+
- client: client
87+
eventType: sdam
88+
ignoreExtraEvents: true
89+
events:
90+
- serverHeartbeatStartedEvent:
91+
awaited: False
92+
- serverHeartbeatSucceededEvent:
93+
awaited: False
94+
- serverHeartbeatStartedEvent:
95+
awaited: False
96+
97+
- description: "connect with serverMonitoringMode=stream >=4.4"
98+
runOnRequirements:
99+
- minServerVersion: "4.4.0"
100+
operations:
101+
- name: createEntities
102+
object: testRunner
103+
arguments:
104+
entities:
105+
- client:
106+
id: client
107+
uriOptions:
108+
serverMonitoringMode: "stream"
109+
useMultipleMongoses: false
110+
observeEvents:
111+
- serverHeartbeatStartedEvent
112+
- serverHeartbeatSucceededEvent
113+
- serverHeartbeatFailedEvent
114+
- database:
115+
id: db
116+
client: client
117+
databaseName: sdam-tests
118+
- *ping
119+
# Wait for the second serverHeartbeatStartedEvent to ensure we start streaming.
120+
- *waitForSecondHeartbeatStarted
121+
expectEvents: *streamingStartedEvents
122+
123+
- description: "connect with serverMonitoringMode=stream <4.4"
124+
runOnRequirements:
125+
- maxServerVersion: "4.2.99"
126+
operations:
127+
- name: createEntities
128+
object: testRunner
129+
arguments:
130+
entities:
131+
- client:
132+
id: client
133+
uriOptions:
134+
serverMonitoringMode: "stream"
135+
heartbeatFrequencyMS: 500
136+
useMultipleMongoses: false
137+
observeEvents:
138+
- serverHeartbeatStartedEvent
139+
- serverHeartbeatSucceededEvent
140+
- serverHeartbeatFailedEvent
141+
- database:
142+
id: db
143+
client: client
144+
databaseName: sdam-tests
145+
- *ping
146+
# Wait for the second serverHeartbeatStartedEvent to ensure we do not stream.
147+
- *waitForSecondHeartbeatStarted
148+
expectEvents: *pollingStartedEvents
149+
150+
- description: "connect with serverMonitoringMode=poll"
151+
operations:
152+
- name: createEntities
153+
object: testRunner
154+
arguments:
155+
entities:
156+
- client:
157+
id: client
158+
uriOptions:
159+
serverMonitoringMode: "poll"
160+
heartbeatFrequencyMS: 500
161+
useMultipleMongoses: false
162+
observeEvents:
163+
- serverHeartbeatStartedEvent
164+
- serverHeartbeatSucceededEvent
165+
- serverHeartbeatFailedEvent
166+
- database:
167+
id: db
168+
client: client
169+
databaseName: sdam-tests
170+
- *ping
171+
# Wait for the second serverHeartbeatStartedEvent to ensure we do not stream.
172+
- *waitForSecondHeartbeatStarted
173+
expectEvents: *pollingStartedEvents
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"tests": [
3+
{
4+
"description": "serverMonitoringMode=auto",
5+
"uri": "mongodb://example.com/?serverMonitoringMode=auto",
6+
"valid": true,
7+
"warning": false,
8+
"hosts": null,
9+
"auth": null,
10+
"options": {
11+
"serverMonitoringMode": "auto"
12+
}
13+
},
14+
{
15+
"description": "serverMonitoringMode=stream",
16+
"uri": "mongodb://example.com/?serverMonitoringMode=stream",
17+
"valid": true,
18+
"warning": false,
19+
"hosts": null,
20+
"auth": null,
21+
"options": {
22+
"serverMonitoringMode": "stream"
23+
}
24+
},
25+
{
26+
"description": "serverMonitoringMode=poll",
27+
"uri": "mongodb://example.com/?serverMonitoringMode=poll",
28+
"valid": true,
29+
"warning": false,
30+
"hosts": null,
31+
"auth": null,
32+
"options": {
33+
"serverMonitoringMode": "poll"
34+
}
35+
},
36+
{
37+
"description": "invalid serverMonitoringMode",
38+
"uri": "mongodb://example.com/?serverMonitoringMode=invalid",
39+
"valid": true,
40+
"warning": true,
41+
"hosts": null,
42+
"auth": null,
43+
"options": {}
44+
}
45+
]
46+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
tests:
2+
- description: "serverMonitoringMode=auto"
3+
uri: "mongodb://example.com/?serverMonitoringMode=auto"
4+
valid: true
5+
warning: false
6+
hosts: ~
7+
auth: ~
8+
options:
9+
serverMonitoringMode: "auto"
10+
11+
- description: "serverMonitoringMode=stream"
12+
uri: "mongodb://example.com/?serverMonitoringMode=stream"
13+
valid: true
14+
warning: false
15+
hosts: ~
16+
auth: ~
17+
options:
18+
serverMonitoringMode: "stream"
19+
20+
- description: "serverMonitoringMode=poll"
21+
uri: "mongodb://example.com/?serverMonitoringMode=poll"
22+
valid: true
23+
warning: false
24+
hosts: ~
25+
auth: ~
26+
options:
27+
serverMonitoringMode: "poll"
28+
29+
- description: "invalid serverMonitoringMode"
30+
uri: "mongodb://example.com/?serverMonitoringMode=invalid"
31+
valid: true
32+
warning: true
33+
hosts: ~
34+
auth: ~
35+
options: {}

src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,8 @@ private IServerMonitorFactory CreateServerMonitorFactory()
311311
var serverMonitorStreamFactory = CreateTcpStreamFactory(serverMonitorTcpStreamSettings);
312312
var serverMonitorSettings = new ServerMonitorSettings(
313313
connectTimeout: serverMonitorTcpStreamSettings.ConnectTimeout,
314-
heartbeatInterval: _serverSettings.HeartbeatInterval);
314+
heartbeatInterval: _serverSettings.HeartbeatInterval,
315+
serverMonitoringMode: _serverSettings.ServerMonitoringMode);
315316

316317
var serverMonitorConnectionFactory = new BinaryConnectionFactory(
317318
serverMonitorConnectionSettings,

src/MongoDB.Driver.Core/Core/Configuration/ConnectionString.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
using MongoDB.Driver.Core.Clusters;
2727
using MongoDB.Driver.Core.Compression;
2828
using MongoDB.Driver.Core.Misc;
29+
using MongoDB.Driver.Core.Servers;
2930

3031
namespace MongoDB.Driver.Core.Configuration
3132
{
@@ -98,6 +99,7 @@ public sealed class ConnectionString
9899
private bool? _retryReads;
99100
private bool? _retryWrites;
100101
private ConnectionStringScheme _scheme;
102+
private ServerMonitoringMode? _serverMonitoringMode;
101103
private TimeSpan? _serverSelectionTimeout;
102104
private TimeSpan? _socketTimeout;
103105
private int? _srvMaxHosts;
@@ -452,6 +454,14 @@ public ConnectionStringScheme Scheme
452454
get { return _scheme; }
453455
}
454456

457+
/// <summary>
458+
/// Gets the server monitoring mode.
459+
/// </summary>
460+
public ServerMonitoringMode? ServerMonitoringMode
461+
{
462+
get { return _serverMonitoringMode; }
463+
}
464+
455465
/// <summary>
456466
/// Gets the server selection timeout.
457467
/// </summary>
@@ -1101,6 +1111,9 @@ private void ParseOption(string name, string value)
11011111
case "serverselectiontimeoutms":
11021112
_serverSelectionTimeout = ParseTimeSpan(name, value);
11031113
break;
1114+
case "servermonitoringmode":
1115+
_serverMonitoringMode = ParseEnum<ServerMonitoringMode>(name, value);
1116+
break;
11041117
case "sockettimeout":
11051118
case "sockettimeoutms":
11061119
_socketTimeout = ParseTimeSpan(name, value);

src/MongoDB.Driver.Core/Core/Configuration/ServerSettings.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Net.Sockets;
1818
using System.Threading;
1919
using MongoDB.Driver.Core.Misc;
20+
using MongoDB.Driver.Core.Servers;
2021

2122
namespace MongoDB.Driver.Core.Configuration
2223
{
@@ -36,24 +37,33 @@ public class ServerSettings
3637
/// Gets the default heartbeat timeout.
3738
/// </summary>
3839
public static TimeSpan DefaultHeartbeatTimeout => Timeout.InfiniteTimeSpan;
40+
41+
/// <summary>
42+
/// Gets the default server monitoring mode.
43+
/// </summary>
44+
public static ServerMonitoringMode DefaultServerMonitoringMode => ServerMonitoringMode.Auto;
3945
#endregion
4046

4147
// fields
4248
private readonly TimeSpan _heartbeatInterval;
4349
private readonly TimeSpan _heartbeatTimeout;
50+
private readonly ServerMonitoringMode _serverMonitoringMode;
4451

4552
// constructors
4653
/// <summary>
4754
/// Initializes a new instance of the <see cref="ServerSettings"/> class.
4855
/// </summary>
4956
/// <param name="heartbeatInterval">The heartbeat interval.</param>
5057
/// <param name="heartbeatTimeout">The heartbeat timeout.</param>
58+
/// <param name="serverMonitoringMode">The server monitoring mode.</param>
5159
public ServerSettings(
5260
Optional<TimeSpan> heartbeatInterval = default(Optional<TimeSpan>),
53-
Optional<TimeSpan> heartbeatTimeout = default(Optional<TimeSpan>))
61+
Optional<TimeSpan> heartbeatTimeout = default(Optional<TimeSpan>),
62+
Optional<ServerMonitoringMode> serverMonitoringMode = default)
5463
{
5564
_heartbeatInterval = Ensure.IsInfiniteOrGreaterThanOrEqualToZero(heartbeatInterval.WithDefault(DefaultHeartbeatInterval), "heartbeatInterval");
5665
_heartbeatTimeout = Ensure.IsInfiniteOrGreaterThanOrEqualToZero(heartbeatTimeout.WithDefault(DefaultHeartbeatTimeout), "heartbeatTimeout");
66+
_serverMonitoringMode = serverMonitoringMode.WithDefault(DefaultServerMonitoringMode);
5767
}
5868

5969
// properties
@@ -79,20 +89,34 @@ public TimeSpan HeartbeatTimeout
7989
get { return _heartbeatTimeout; }
8090
}
8191

92+
/// <summary>
93+
/// Gets the server monitoring mode.
94+
/// </summary>
95+
/// <value>
96+
/// The server monitoring mode.
97+
/// </value>
98+
public ServerMonitoringMode ServerMonitoringMode
99+
{
100+
get { return _serverMonitoringMode; }
101+
}
102+
82103
// methods
83104
/// <summary>
84105
/// Returns a new ServerSettings instance with some settings changed.
85106
/// </summary>
86107
/// <param name="heartbeatInterval">The heartbeat interval.</param>
87108
/// <param name="heartbeatTimeout">The heartbeat timeout.</param>
109+
/// <param name="serverMonitoringMode">The server monitoring mode.</param>
88110
/// <returns>A new ServerSettings instance.</returns>
89111
public ServerSettings With(
90112
Optional<TimeSpan> heartbeatInterval = default(Optional<TimeSpan>),
91-
Optional<TimeSpan> heartbeatTimeout = default(Optional<TimeSpan>))
113+
Optional<TimeSpan> heartbeatTimeout = default(Optional<TimeSpan>),
114+
Optional<ServerMonitoringMode> serverMonitoringMode = default)
92115
{
93116
return new ServerSettings(
94117
heartbeatInterval: heartbeatInterval.WithDefault(_heartbeatInterval),
95-
heartbeatTimeout: heartbeatTimeout.WithDefault(_heartbeatTimeout));
118+
heartbeatTimeout: heartbeatTimeout.WithDefault(_heartbeatTimeout),
119+
serverMonitoringMode: serverMonitoringMode.WithDefault(_serverMonitoringMode));
96120
}
97121
}
98122
}

0 commit comments

Comments
 (0)