mongo 2.4.0.rc1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|