mongo 2.4.0.rc1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +4 -2
- data/lib/mongo/client.rb +7 -4
- data/lib/mongo/cluster.rb +55 -5
- data/lib/mongo/cluster/app_metadata.rb +7 -1
- data/lib/mongo/cluster/topology.rb +7 -6
- data/lib/mongo/cluster/topology/replica_set.rb +48 -2
- data/lib/mongo/cluster/topology/sharded.rb +47 -1
- data/lib/mongo/cluster/topology/single.rb +55 -4
- data/lib/mongo/cluster/topology/unknown.rb +65 -9
- data/lib/mongo/error/invalid_server_preference.rb +3 -1
- data/lib/mongo/event.rb +8 -0
- data/lib/mongo/event/description_changed.rb +20 -2
- data/lib/mongo/event/member_discovered.rb +65 -0
- data/lib/mongo/event/primary_elected.rb +3 -1
- data/lib/mongo/event/standalone_discovered.rb +1 -1
- data/lib/mongo/monitoring.rb +41 -0
- data/lib/mongo/monitoring/event.rb +6 -0
- data/lib/mongo/monitoring/event/server_closed.rb +46 -0
- data/lib/mongo/monitoring/event/server_description_changed.rb +58 -0
- data/lib/mongo/monitoring/event/server_opening.rb +46 -0
- data/lib/mongo/monitoring/event/topology_changed.rb +46 -0
- data/lib/mongo/monitoring/event/topology_closed.rb +41 -0
- data/lib/mongo/monitoring/event/topology_opening.rb +41 -0
- data/lib/mongo/monitoring/publishable.rb +12 -0
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +54 -0
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +30 -0
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +33 -0
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +30 -0
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +40 -0
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +30 -0
- data/lib/mongo/server.rb +6 -0
- data/lib/mongo/server/connection.rb +1 -1
- data/lib/mongo/server/description.rb +23 -3
- data/lib/mongo/server/description/inspector.rb +4 -2
- data/lib/mongo/server/description/inspector/description_changed.rb +2 -2
- data/lib/mongo/server/description/inspector/member_discovered.rb +59 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +2 -0
- data/lib/mongo/server_selector.rb +10 -5
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector/selectable.rb +24 -12
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/mongo/auth/cr_spec.rb +6 -1
- data/spec/mongo/auth/ldap_spec.rb +6 -1
- data/spec/mongo/auth/scram_spec.rb +6 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +69 -0
- data/spec/mongo/auth/x509_spec.rb +9 -4
- data/spec/mongo/client_spec.rb +40 -2
- data/spec/mongo/cluster/topology/replica_set_spec.rb +218 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +17 -2
- data/spec/mongo/cluster/topology/single_spec.rb +19 -4
- data/spec/mongo/cluster/topology/unknown_spec.rb +19 -1
- data/spec/mongo/cluster/topology_spec.rb +11 -7
- data/spec/mongo/cluster_spec.rb +25 -7
- data/spec/mongo/max_staleness_spec.rb +40 -22
- data/spec/mongo/monitoring_spec.rb +2 -2
- data/spec/mongo/sdam_monitoring_spec.rb +60 -0
- data/spec/mongo/sdam_spec.rb +77 -0
- data/spec/mongo/server/connection_pool_spec.rb +6 -1
- data/spec/mongo/server/connection_spec.rb +6 -1
- data/spec/mongo/server/description_spec.rb +90 -1
- data/spec/mongo/server_selection_spec.rb +7 -6
- data/spec/mongo/server_selector/nearest_spec.rb +7 -7
- data/spec/mongo/server_selector/primary_preferred_spec.rb +7 -7
- data/spec/mongo/server_selector/primary_spec.rb +4 -4
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
- data/spec/mongo/server_selector/secondary_spec.rb +6 -6
- data/spec/mongo/server_selector_spec.rb +8 -0
- data/spec/mongo/server_spec.rb +6 -1
- data/spec/mongo/uri_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +4 -4
- data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +15 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +4 -4
- data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +5 -5
- data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness2.yml → LongHeartbeat.yml} +4 -4
- data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness.yml → LongHeartbeat2.yml} +6 -10
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +3 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +7 -11
- data/spec/support/max_staleness/Sharded/Incompatible.yml +4 -4
- data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +10 -2
- data/spec/support/max_staleness/Single/Incompatible.yml +4 -4
- data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +2 -2
- data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +14 -0
- data/spec/support/sdam/rs/primary_mismatched_me.yml +2 -2
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +2 -2
- data/spec/support/sdam_monitoring.rb +144 -0
- data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +112 -0
- data/spec/support/sdam_monitoring/replica_set_with_primary.yml +111 -0
- data/spec/support/sdam_monitoring/replica_set_with_removal.yml +106 -0
- data/spec/support/sdam_monitoring/required_replica_set.yml +84 -0
- data/spec/support/sdam_monitoring/standalone.yml +70 -0
- data/spec/support/server_discovery_and_monitoring.rb +34 -1
- data/spec/support/server_selection.rb +14 -11
- data/spec/support/shared/server_selector.rb +6 -0
- metadata +49 -13
- metadata.gz.sig +0 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
@@ -7,11 +7,11 @@ describe Mongo::Cluster::Topology::Sharded do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:topology) do
|
10
|
-
described_class.new({})
|
10
|
+
described_class.new({}, monitoring)
|
11
11
|
end
|
12
12
|
|
13
13
|
let(:monitoring) do
|
14
|
-
Mongo::Monitoring.new
|
14
|
+
Mongo::Monitoring.new(monitoring: false)
|
15
15
|
end
|
16
16
|
|
17
17
|
let(:listeners) do
|
@@ -20,6 +20,7 @@ describe Mongo::Cluster::Topology::Sharded do
|
|
20
20
|
|
21
21
|
let(:cluster) do
|
22
22
|
double('cluster').tap do |cl|
|
23
|
+
allow(cl).to receive(:topology).and_return(topology)
|
23
24
|
allow(cl).to receive(:app_metadata).and_return(app_metadata)
|
24
25
|
end
|
25
26
|
end
|
@@ -86,6 +87,20 @@ describe Mongo::Cluster::Topology::Sharded do
|
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
90
|
+
describe '#has_readable_servers?' do
|
91
|
+
|
92
|
+
it 'returns true' do
|
93
|
+
expect(topology).to have_readable_server(nil, nil)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe '#has_writable_servers?' do
|
98
|
+
|
99
|
+
it 'returns true' do
|
100
|
+
expect(topology).to have_writable_server(nil)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
89
104
|
describe '#add_hosts?' do
|
90
105
|
|
91
106
|
it 'returns false' do
|
@@ -6,12 +6,12 @@ describe Mongo::Cluster::Topology::Single do
|
|
6
6
|
Mongo::Address.new('127.0.0.1:27017')
|
7
7
|
end
|
8
8
|
|
9
|
-
let(:
|
10
|
-
|
9
|
+
let(:monitoring) do
|
10
|
+
Mongo::Monitoring.new(monitoring: false)
|
11
11
|
end
|
12
12
|
|
13
|
-
let(:
|
14
|
-
|
13
|
+
let(:topology) do
|
14
|
+
described_class.new({}, monitoring)
|
15
15
|
end
|
16
16
|
|
17
17
|
let(:listeners) do
|
@@ -21,6 +21,7 @@ describe Mongo::Cluster::Topology::Single do
|
|
21
21
|
let(:cluster) do
|
22
22
|
double('cluster').tap do |cl|
|
23
23
|
allow(cl).to receive(:app_metadata).and_return(app_metadata)
|
24
|
+
allow(cl).to receive(:topology).and_return(topology)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -91,6 +92,20 @@ describe Mongo::Cluster::Topology::Single do
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
95
|
+
describe '#has_readable_servers?' do
|
96
|
+
|
97
|
+
it 'returns true' do
|
98
|
+
expect(topology).to have_readable_server(nil, nil)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '#has_writable_servers?' do
|
103
|
+
|
104
|
+
it 'returns true' do
|
105
|
+
expect(topology).to have_writable_server(nil)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
94
109
|
describe '#add_hosts?' do
|
95
110
|
|
96
111
|
it 'returns false' do
|
@@ -2,8 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongo::Cluster::Topology::Unknown do
|
4
4
|
|
5
|
+
let(:monitoring) do
|
6
|
+
Mongo::Monitoring.new(monitoring: false)
|
7
|
+
end
|
8
|
+
|
5
9
|
let(:topology) do
|
6
|
-
described_class.new({})
|
10
|
+
described_class.new({}, monitoring)
|
7
11
|
end
|
8
12
|
|
9
13
|
describe '.servers' do
|
@@ -45,6 +49,20 @@ describe Mongo::Cluster::Topology::Unknown do
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
52
|
+
describe '#has_readable_servers?' do
|
53
|
+
|
54
|
+
it 'returns false' do
|
55
|
+
expect(topology).to_not have_readable_server(nil, nil)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#has_writable_servers?' do
|
60
|
+
|
61
|
+
it 'returns false' do
|
62
|
+
expect(topology).to_not have_writable_server(nil)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
48
66
|
describe '#add_hosts?' do
|
49
67
|
|
50
68
|
context 'when the description is from an unknown server' do
|
@@ -2,12 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongo::Cluster::Topology do
|
4
4
|
|
5
|
+
let(:monitoring) do
|
6
|
+
Mongo::Monitoring.new(monitoring: false)
|
7
|
+
end
|
8
|
+
|
5
9
|
describe '.initial' do
|
6
10
|
|
7
11
|
context 'when provided a replica set option' do
|
8
12
|
|
9
13
|
let(:topology) do
|
10
|
-
described_class.initial([ 'a' ], connect: :replica_set)
|
14
|
+
described_class.initial([ 'a' ], monitoring, connect: :replica_set)
|
11
15
|
end
|
12
16
|
|
13
17
|
it 'returns a replica set topology' do
|
@@ -18,7 +22,7 @@ describe Mongo::Cluster::Topology do
|
|
18
22
|
context 'when provided a single option' do
|
19
23
|
|
20
24
|
let(:topology) do
|
21
|
-
described_class.initial([ 'a' ], connect: :direct)
|
25
|
+
described_class.initial([ 'a' ], monitoring, connect: :direct)
|
22
26
|
end
|
23
27
|
|
24
28
|
it 'returns a single topology' do
|
@@ -33,7 +37,7 @@ describe Mongo::Cluster::Topology do
|
|
33
37
|
context 'when provided a sharded option' do
|
34
38
|
|
35
39
|
let(:topology) do
|
36
|
-
described_class.initial([ 'a' ], connect: :sharded)
|
40
|
+
described_class.initial([ 'a' ], monitoring, connect: :sharded)
|
37
41
|
end
|
38
42
|
|
39
43
|
it 'returns a sharded topology' do
|
@@ -46,7 +50,7 @@ describe Mongo::Cluster::Topology do
|
|
46
50
|
context 'when a set name is in the options' do
|
47
51
|
|
48
52
|
let(:topology) do
|
49
|
-
described_class.initial([], replica_set: 'testing')
|
53
|
+
described_class.initial([], monitoring, replica_set: 'testing')
|
50
54
|
end
|
51
55
|
|
52
56
|
it 'returns a replica set topology' do
|
@@ -57,7 +61,7 @@ describe Mongo::Cluster::Topology do
|
|
57
61
|
context 'when no set name is in the options' do
|
58
62
|
|
59
63
|
let(:topology) do
|
60
|
-
described_class.initial([], {})
|
64
|
+
described_class.initial([], monitoring, {})
|
61
65
|
end
|
62
66
|
|
63
67
|
it 'returns an unknown topology' do
|
@@ -68,7 +72,7 @@ describe Mongo::Cluster::Topology do
|
|
68
72
|
context 'when provided a single mongos', if: single_mongos? do
|
69
73
|
|
70
74
|
let(:topology) do
|
71
|
-
described_class.initial(ADDRESSES, TEST_OPTIONS)
|
75
|
+
described_class.initial(ADDRESSES, monitoring, TEST_OPTIONS)
|
72
76
|
end
|
73
77
|
|
74
78
|
it 'returns a sharded topology' do
|
@@ -79,7 +83,7 @@ describe Mongo::Cluster::Topology do
|
|
79
83
|
context 'when provided a single replica set member', if: single_rs_member? do
|
80
84
|
|
81
85
|
let(:topology) do
|
82
|
-
described_class.initial(ADDRESSES, TEST_OPTIONS)
|
86
|
+
described_class.initial(ADDRESSES, monitoring, TEST_OPTIONS)
|
83
87
|
end
|
84
88
|
|
85
89
|
it 'returns a single topology' do
|
data/spec/mongo/cluster_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Mongo::Cluster do
|
4
4
|
|
5
5
|
let(:monitoring) do
|
6
|
-
Mongo::Monitoring.new
|
6
|
+
Mongo::Monitoring.new(monitoring: false)
|
7
7
|
end
|
8
8
|
|
9
9
|
let(:cluster) do
|
@@ -59,6 +59,24 @@ describe Mongo::Cluster do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
describe '#has_readable_server?' do
|
63
|
+
|
64
|
+
let(:selector) do
|
65
|
+
Mongo::ServerSelector.get(mode: :primary)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'delegates to the topology' do
|
69
|
+
expect(cluster.has_readable_server?).to eq(cluster.topology.has_readable_server?(cluster))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#has_writable_server?' do
|
74
|
+
|
75
|
+
it 'delegates to the topology' do
|
76
|
+
expect(cluster.has_writable_server?).to eq(cluster.topology.has_writable_server?(cluster))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
62
80
|
describe '#inspect' do
|
63
81
|
|
64
82
|
let(:preference) do
|
@@ -156,7 +174,7 @@ describe Mongo::Cluster do
|
|
156
174
|
context 'when topology is Single' do
|
157
175
|
|
158
176
|
let(:topology) do
|
159
|
-
Mongo::Cluster::Topology::Single.new({})
|
177
|
+
Mongo::Cluster::Topology::Single.new({}, monitoring)
|
160
178
|
end
|
161
179
|
|
162
180
|
it 'returns an empty array' do
|
@@ -167,7 +185,7 @@ describe Mongo::Cluster do
|
|
167
185
|
context 'when topology is ReplicaSet' do
|
168
186
|
|
169
187
|
let(:topology) do
|
170
|
-
Mongo::Cluster::Topology::ReplicaSet.new({})
|
188
|
+
Mongo::Cluster::Topology::ReplicaSet.new({}, monitoring)
|
171
189
|
end
|
172
190
|
|
173
191
|
it 'returns an empty array' do
|
@@ -178,7 +196,7 @@ describe Mongo::Cluster do
|
|
178
196
|
context 'when topology is Sharded' do
|
179
197
|
|
180
198
|
let(:topology) do
|
181
|
-
Mongo::Cluster::Topology::Sharded.new({})
|
199
|
+
Mongo::Cluster::Topology::Sharded.new({}, monitoring)
|
182
200
|
end
|
183
201
|
|
184
202
|
it 'returns an empty array' do
|
@@ -189,7 +207,7 @@ describe Mongo::Cluster do
|
|
189
207
|
context 'when topology is Unknown' do
|
190
208
|
|
191
209
|
let(:topology) do
|
192
|
-
Mongo::Cluster::Topology::Unknown.new({})
|
210
|
+
Mongo::Cluster::Topology::Unknown.new({}, monitoring)
|
193
211
|
end
|
194
212
|
|
195
213
|
it 'returns an empty array' do
|
@@ -268,7 +286,7 @@ describe Mongo::Cluster do
|
|
268
286
|
end
|
269
287
|
|
270
288
|
let(:monitoring) do
|
271
|
-
Mongo::Monitoring.new
|
289
|
+
Mongo::Monitoring.new(monitoring: false)
|
272
290
|
end
|
273
291
|
|
274
292
|
let(:server_a) do
|
@@ -361,7 +379,7 @@ describe Mongo::Cluster do
|
|
361
379
|
end
|
362
380
|
|
363
381
|
let(:monitoring) do
|
364
|
-
Mongo::Monitoring.new
|
382
|
+
Mongo::Monitoring.new(monitoring: false)
|
365
383
|
end
|
366
384
|
|
367
385
|
let(:server) do
|
@@ -11,7 +11,11 @@ describe 'Max Staleness Spec' do
|
|
11
11
|
context(spec.description) do
|
12
12
|
|
13
13
|
let(:topology) do
|
14
|
-
spec.type.new({})
|
14
|
+
spec.type.new({}, monitoring, [])
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:monitoring) do
|
18
|
+
Mongo::Monitoring.new(monitoring: false)
|
15
19
|
end
|
16
20
|
|
17
21
|
let(:monitoring) do
|
@@ -26,10 +30,10 @@ describe 'Max Staleness Spec' do
|
|
26
30
|
if spec.heartbeat_frequency
|
27
31
|
TEST_OPTIONS.merge(heartbeat_frequency: spec.heartbeat_frequency)
|
28
32
|
else
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end.merge!(server_selection_timeout: 0.2)
|
33
|
+
TEST_OPTIONS.dup.tap do |opts|
|
34
|
+
opts.delete(:heartbeat_frequency)
|
35
|
+
end
|
36
|
+
end.merge!(server_selection_timeout: 0.2, connect_timeout: 0.1)
|
33
37
|
end
|
34
38
|
|
35
39
|
let(:cluster) do
|
@@ -38,7 +42,8 @@ describe 'Max Staleness Spec' do
|
|
38
42
|
allow(c).to receive(:single?).and_return(topology.single?)
|
39
43
|
allow(c).to receive(:sharded?).and_return(topology.sharded?)
|
40
44
|
allow(c).to receive(:replica_set?).and_return(topology.replica_set?)
|
41
|
-
allow(c).to receive(:
|
45
|
+
allow(c).to receive(:unknown?).and_return(topology.unknown?)
|
46
|
+
allow(c).to receive(:options).and_return(options)
|
42
47
|
allow(c).to receive(:scan!).and_return(true)
|
43
48
|
allow(c).to receive(:app_metadata).and_return(app_metadata)
|
44
49
|
end
|
@@ -47,17 +52,17 @@ describe 'Max Staleness Spec' do
|
|
47
52
|
let(:candidate_servers) do
|
48
53
|
spec.candidate_servers.collect do |server|
|
49
54
|
features = double('features').tap do |feat|
|
50
|
-
allow(feat).to receive(:max_staleness_enabled?).and_return(server['maxWireVersion'] >= 5)
|
55
|
+
allow(feat).to receive(:max_staleness_enabled?).and_return(server['maxWireVersion'] && server['maxWireVersion'] >= 5)
|
51
56
|
end
|
52
57
|
address = Mongo::Address.new(server['address'])
|
53
58
|
Mongo::Server.new(address, cluster, monitoring, listeners, options).tap do |s|
|
54
|
-
allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
|
59
|
+
allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'] / 1000.0) if server['avg_rtt_ms']
|
55
60
|
allow(s).to receive(:tags).and_return(server['tags'])
|
56
61
|
allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
|
57
62
|
allow(s).to receive(:primary?).and_return(server['type'] == 'RSPrimary')
|
58
63
|
allow(s).to receive(:connectable?).and_return(true)
|
59
|
-
allow(s).to receive(:last_write_date).and_return(server['lastWrite']['lastWriteDate']['$numberLong'].to_i
|
60
|
-
allow(s).to receive(:last_scan).and_return(server['lastUpdateTime']
|
64
|
+
allow(s).to receive(:last_write_date).and_return(server['lastWrite']['lastWriteDate']['$numberLong'].to_i) if server['lastWrite']
|
65
|
+
allow(s).to receive(:last_scan).and_return(server['lastUpdateTime'])
|
61
66
|
allow(s).to receive(:features).and_return(features)
|
62
67
|
end
|
63
68
|
end
|
@@ -65,7 +70,7 @@ describe 'Max Staleness Spec' do
|
|
65
70
|
|
66
71
|
let(:in_latency_window) do
|
67
72
|
spec.in_latency_window.collect do |server|
|
68
|
-
Mongo::Server.new(Mongo::Address.new(server['address']), cluster, monitoring, listeners)
|
73
|
+
Mongo::Server.new(Mongo::Address.new(server['address']), cluster, monitoring, listeners, options)
|
69
74
|
end
|
70
75
|
end
|
71
76
|
|
@@ -84,23 +89,36 @@ describe 'Max Staleness Spec' do
|
|
84
89
|
allow(cluster).to receive(:servers).and_return(candidate_servers)
|
85
90
|
end
|
86
91
|
|
87
|
-
context '
|
92
|
+
context 'when the max staleness is invalid' do
|
88
93
|
|
89
|
-
it '
|
90
|
-
expect(server_selector.send(:select, cluster.servers)).to match_array(in_latency_window)
|
91
|
-
end
|
94
|
+
it 'Raises an InvalidServerPreference exception', if: spec.invalid_max_staleness? do
|
92
95
|
|
93
|
-
|
94
|
-
|
96
|
+
expect do
|
97
|
+
server_selector.select_server(cluster)
|
98
|
+
end.to raise_exception(Mongo::Error::InvalidServerPreference)
|
95
99
|
end
|
96
100
|
end
|
97
101
|
|
98
|
-
context 'when the max staleness
|
102
|
+
context 'when the max staleness is valid' do
|
99
103
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
+
context 'when there are available servers' do
|
105
|
+
|
106
|
+
it 'Finds all suitable servers in the latency window', if: (spec.replica_set? && !spec.invalid_max_staleness? && spec.server_available?) do
|
107
|
+
expect(server_selector.send(:select, cluster.servers)).to match_array(in_latency_window)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'Finds the most suitable server in the latency window', if: (!spec.invalid_max_staleness? && spec.server_available?) do
|
111
|
+
expect(in_latency_window).to include(server_selector.select_server(cluster))
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'when there are no available servers', if: (!spec.invalid_max_staleness? && !spec.server_available?) do
|
116
|
+
|
117
|
+
it 'Raises a NoServerAvailable Exception' do
|
118
|
+
expect do
|
119
|
+
server_selector.select_server(cluster)
|
120
|
+
end.to raise_exception(Mongo::Error::NoServerAvailable)
|
121
|
+
end
|
104
122
|
end
|
105
123
|
end
|
106
124
|
end
|
@@ -45,7 +45,7 @@ describe Mongo::Monitoring do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'includes the global subscribers' do
|
48
|
-
expect(monitoring.subscribers.size).to eq(
|
48
|
+
expect(monitoring.subscribers.size).to eq(6)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -58,7 +58,7 @@ describe Mongo::Monitoring do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'includes the global subscribers' do
|
61
|
-
expect(monitoring.subscribers.size).to eq(
|
61
|
+
expect(monitoring.subscribers.size).to eq(6)
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'SDAM Monitoring' do
|
4
|
+
include Mongo::SDAM
|
5
|
+
|
6
|
+
SDAM_MONITORING_TESTS.each do |file|
|
7
|
+
|
8
|
+
spec = Mongo::SDAM::Spec.new(file)
|
9
|
+
|
10
|
+
context(spec.description) do
|
11
|
+
|
12
|
+
before(:all) do
|
13
|
+
@client = Mongo::Client.new([], heartbeat_frequency: 100, connect_timeout: 0.1)
|
14
|
+
@subscriber = Mongo::SDAMMonitoring::TestSubscriber.new
|
15
|
+
@client.subscribe(Mongo::Monitoring::SERVER_OPENING, @subscriber)
|
16
|
+
@client.subscribe(Mongo::Monitoring::SERVER_CLOSED, @subscriber)
|
17
|
+
@client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, @subscriber)
|
18
|
+
@client.subscribe(Mongo::Monitoring::TOPOLOGY_OPENING, @subscriber)
|
19
|
+
@client.subscribe(Mongo::Monitoring::TOPOLOGY_CHANGED, @subscriber)
|
20
|
+
@client.send(:create_from_uri, spec.uri_string)
|
21
|
+
end
|
22
|
+
|
23
|
+
after(:all) do
|
24
|
+
@client.close
|
25
|
+
end
|
26
|
+
|
27
|
+
spec.phases.each_with_index do |phase, index|
|
28
|
+
|
29
|
+
context("Phase: #{index + 1}") do
|
30
|
+
|
31
|
+
before(:all) do
|
32
|
+
phase.responses.each do |response|
|
33
|
+
# For each response in the phase, we need to change that server's description.
|
34
|
+
server = find_server(@client, response.address)
|
35
|
+
server ||= Mongo::Server.new(
|
36
|
+
Mongo::Address.new(response.address),
|
37
|
+
@client.cluster,
|
38
|
+
@client.instance_variable_get(:@monitoring),
|
39
|
+
@client.cluster.send(:event_listeners),
|
40
|
+
@client.cluster.options
|
41
|
+
)
|
42
|
+
monitor = server.instance_variable_get(:@monitor)
|
43
|
+
description = monitor.inspector.run(server.description, response.ismaster, 0.5)
|
44
|
+
monitor.instance_variable_set(:@description, description)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
phase.outcome.events.each do |expectation|
|
49
|
+
|
50
|
+
it "expects a #{expectation.name} to be fired" do
|
51
|
+
fired_event = @subscriber.first_event(expectation.name)
|
52
|
+
expect(fired_event).not_to be_nil
|
53
|
+
expect(fired_event).to match_sdam_monitoring_event(expectation)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|