mongo 2.10.5 → 2.11.0.rc0
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/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +2 -0
- data/lib/mongo/address.rb +4 -0
- data/lib/mongo/address/validator.rb +99 -0
- data/lib/mongo/auth.rb +7 -2
- data/lib/mongo/auth/user.rb +1 -7
- data/lib/mongo/background_thread.rb +135 -0
- data/lib/mongo/bulk_write/transformable.rb +3 -3
- data/lib/mongo/client.rb +74 -16
- data/lib/mongo/cluster.rb +193 -41
- data/lib/mongo/cluster/periodic_executor.rb +31 -43
- data/lib/mongo/cluster/sdam_flow.rb +26 -3
- data/lib/mongo/cluster/srv_monitor.rb +127 -0
- data/lib/mongo/collection/view/readable.rb +3 -5
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -4
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +5 -23
- data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +5 -24
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +7 -8
- data/lib/mongo/error/invalid_address.rb +24 -0
- data/lib/mongo/error/notable.rb +2 -2
- data/lib/mongo/error/operation_failure.rb +3 -3
- data/lib/mongo/error/pool_closed_error.rb +11 -4
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/loggable.rb +5 -1
- data/lib/mongo/monitoring.rb +1 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +7 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +12 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +62 -0
- data/lib/mongo/operation/shared/executable.rb +5 -10
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -5
- data/lib/mongo/protocol/get_more.rb +1 -2
- data/lib/mongo/protocol/kill_cursors.rb +13 -6
- data/lib/mongo/protocol/serializers.rb +4 -20
- data/lib/mongo/retryable.rb +9 -34
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +113 -42
- data/lib/mongo/server/connection.rb +12 -5
- data/lib/mongo/server/connection_pool.rb +250 -40
- data/lib/mongo/server/connection_pool/populator.rb +58 -0
- data/lib/mongo/server/description.rb +9 -2
- data/lib/mongo/server/monitor.rb +68 -93
- data/lib/mongo/server/monitor/connection.rb +2 -0
- data/lib/mongo/server_selector/selectable.rb +13 -5
- data/lib/mongo/session.rb +0 -13
- data/lib/mongo/srv.rb +17 -0
- data/lib/mongo/srv/monitor.rb +96 -0
- data/lib/mongo/srv/resolver.rb +130 -0
- data/lib/mongo/srv/result.rb +126 -0
- data/lib/mongo/srv/warning_result.rb +35 -0
- data/lib/mongo/uri.rb +45 -55
- data/lib/mongo/uri/srv_protocol.rb +89 -42
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +3 -4
- data/spec/README.md +6 -1
- data/spec/enterprise_auth/kerberos_spec.rb +7 -6
- data/spec/integration/change_stream_examples_spec.rb +0 -4
- data/spec/integration/client_construction_spec.rb +14 -2
- data/spec/integration/connect_single_rs_name_spec.rb +2 -2
- data/spec/integration/connection_pool_populator_spec.rb +296 -0
- data/spec/integration/connection_spec.rb +31 -22
- data/spec/integration/cursor_reaping_spec.rb +1 -2
- data/spec/integration/docs_examples_spec.rb +0 -4
- data/spec/integration/heartbeat_events_spec.rb +17 -15
- data/spec/integration/reconnect_spec.rb +144 -1
- data/spec/integration/retryable_writes_errors_spec.rb +0 -4
- data/spec/integration/retryable_writes_spec.rb +36 -36
- data/spec/integration/sdam_error_handling_spec.rb +31 -25
- data/spec/integration/sdam_events_spec.rb +2 -6
- data/spec/integration/server_monitor_spec.rb +28 -0
- data/spec/integration/server_selector_spec.rb +7 -5
- data/spec/integration/srv_monitoring_spec.rb +360 -0
- data/spec/integration/step_down_spec.rb +4 -6
- data/spec/lite_spec_helper.rb +22 -0
- data/spec/mongo/address/validator_spec.rb +51 -0
- data/spec/mongo/auth/cr_spec.rb +1 -29
- data/spec/mongo/auth/ldap_spec.rb +1 -29
- data/spec/mongo/auth/scram/conversation_spec.rb +0 -2
- data/spec/mongo/auth/scram/negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -29
- data/spec/mongo/auth/user/view_spec.rb +1 -36
- data/spec/mongo/auth/user_spec.rb +0 -12
- data/spec/mongo/auth/x509_spec.rb +1 -29
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +56 -15
- data/spec/mongo/client_spec.rb +31 -27
- data/spec/mongo/cluster/periodic_executor_spec.rb +16 -0
- data/spec/mongo/cluster/srv_monitor_spec.rb +214 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -11
- data/spec/mongo/cluster/topology/sharded_spec.rb +12 -9
- data/spec/mongo/cluster/topology/single_spec.rb +20 -11
- data/spec/mongo/cluster_spec.rb +45 -29
- data/spec/mongo/collection/view/map_reduce_spec.rb +14 -9
- data/spec/mongo/collection/view/readable_spec.rb +0 -16
- data/spec/mongo/collection_spec.rb +0 -44
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +2 -4
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +2 -4
- data/spec/mongo/cursor_spec.rb +27 -7
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +10 -3
- data/spec/mongo/operation/delete/op_msg_spec.rb +17 -8
- data/spec/mongo/operation/insert/op_msg_spec.rb +50 -35
- data/spec/mongo/operation/update/op_msg_spec.rb +14 -7
- data/spec/mongo/retryable_spec.rb +52 -31
- data/spec/mongo/server/app_metadata_spec.rb +0 -8
- data/spec/mongo/server/connection_auth_spec.rb +5 -2
- data/spec/mongo/server/connection_pool/populator_spec.rb +101 -0
- data/spec/mongo/server/connection_pool_spec.rb +256 -107
- data/spec/mongo/server/connection_spec.rb +22 -33
- data/spec/mongo/server/description_spec.rb +42 -4
- data/spec/mongo/server/monitor/connection_spec.rb +22 -11
- data/spec/mongo/server/monitor_spec.rb +66 -107
- data/spec/mongo/server_spec.rb +82 -60
- data/spec/mongo/session/session_pool_spec.rb +1 -5
- data/spec/mongo/session_spec.rb +0 -4
- data/spec/mongo/socket/ssl_spec.rb +2 -2
- data/spec/mongo/srv/monitor_spec.rb +211 -0
- data/spec/mongo/srv/result_spec.rb +54 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +30 -15
- data/spec/mongo/uri_spec.rb +125 -4
- data/spec/spec_helper.rb +6 -0
- data/spec/spec_tests/auth_spec.rb +39 -0
- data/spec/spec_tests/cmap_spec.rb +55 -8
- data/spec/spec_tests/connection_string_spec.rb +6 -31
- data/spec/spec_tests/data/auth/connection-string.yml +297 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +4 -1
- data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
- data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
- data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +26 -30
- data/spec/spec_tests/data/transactions/abort.yml +3 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +3 -3
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +1 -1
- data/spec/spec_tests/max_staleness_spec.rb +7 -2
- data/spec/spec_tests/retryable_reads_spec.rb +0 -31
- data/spec/spec_tests/sdam_monitoring_spec.rb +12 -12
- data/spec/spec_tests/sdam_spec.rb +4 -7
- data/spec/spec_tests/server_selection_spec.rb +6 -2
- data/spec/spec_tests/transactions_spec.rb +0 -2
- data/spec/spec_tests/uri_options_spec.rb +4 -2
- data/spec/stress/connection_pool_stress_spec.rb +203 -0
- data/spec/stress/connection_pool_timing_spec.rb +181 -0
- data/spec/support/auth.rb +113 -0
- data/spec/support/background_thread_registry.rb +63 -0
- data/spec/support/client_registry.rb +11 -2
- data/spec/support/cluster_config.rb +65 -46
- data/spec/support/cluster_tools.rb +2 -2
- data/spec/support/cmap.rb +13 -14
- data/spec/support/cmap/verifier.rb +4 -5
- data/spec/support/command_monitoring.rb +0 -5
- data/spec/support/common_shortcuts.rb +101 -1
- data/spec/support/constraints.rb +25 -0
- data/spec/support/dns.rb +13 -0
- data/spec/support/event_subscriber.rb +0 -7
- data/spec/support/json_ext_formatter.rb +5 -1
- data/spec/support/lite_constraints.rb +22 -6
- data/spec/support/local_resource_registry.rb +34 -0
- data/spec/support/sdam_monitoring.rb +115 -0
- data/spec/support/spec_config.rb +20 -6
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/transactions.rb +1 -1
- data/spec/support/transactions/test.rb +1 -1
- data/spec/support/utils.rb +1 -16
- metadata +685 -659
- metadata.gz.sig +0 -0
- data/lib/mongo/event/description_changed.rb +0 -52
- data/spec/integration/bson_symbol_spec.rb +0 -34
- data/spec/integration/crud_spec.rb +0 -45
- data/spec/integration/get_more_spec.rb +0 -32
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/retryable_errors_spec.rb +0 -265
- data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +0 -98
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
- data/spec/runners/sdam/verifier.rb +0 -88
data/spec/mongo/client_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe Mongo::Client do
|
|
8
8
|
describe '#==' do
|
9
9
|
|
10
10
|
let(:client) do
|
11
|
-
|
11
|
+
new_local_client_nmio(
|
12
12
|
['127.0.0.1:27017'],
|
13
13
|
:read => { :mode => :primary },
|
14
14
|
:database => SpecConfig.instance.test_db
|
@@ -20,7 +20,7 @@ describe Mongo::Client do
|
|
20
20
|
context 'when the options and cluster are equal' do
|
21
21
|
|
22
22
|
let(:other) do
|
23
|
-
|
23
|
+
new_local_client_nmio(
|
24
24
|
['127.0.0.1:27017'],
|
25
25
|
:read => { :mode => :primary },
|
26
26
|
:database => SpecConfig.instance.test_db
|
@@ -35,7 +35,7 @@ describe Mongo::Client do
|
|
35
35
|
context 'when the options are not equal' do
|
36
36
|
|
37
37
|
let(:other) do
|
38
|
-
|
38
|
+
new_local_client_nmio(
|
39
39
|
['127.0.0.1:27017'],
|
40
40
|
:read => { :mode => :secondary },
|
41
41
|
:database => SpecConfig.instance.test_db
|
@@ -50,7 +50,7 @@ describe Mongo::Client do
|
|
50
50
|
context 'when cluster is not equal' do
|
51
51
|
|
52
52
|
let(:other) do
|
53
|
-
|
53
|
+
new_local_client_nmio(
|
54
54
|
['127.0.0.1:27010'],
|
55
55
|
:read => { :mode => :primary },
|
56
56
|
:database => SpecConfig.instance.test_db
|
@@ -74,7 +74,8 @@ describe Mongo::Client do
|
|
74
74
|
describe '#[]' do
|
75
75
|
|
76
76
|
let(:client) do
|
77
|
-
|
77
|
+
new_local_client_nmio(['127.0.0.1:27017'],
|
78
|
+
:database => SpecConfig.instance.test_db)
|
78
79
|
end
|
79
80
|
|
80
81
|
shared_examples_for 'a collection switching object' do
|
@@ -110,7 +111,7 @@ describe Mongo::Client do
|
|
110
111
|
describe '#eql' do
|
111
112
|
|
112
113
|
let(:client) do
|
113
|
-
|
114
|
+
new_local_client_nmio(
|
114
115
|
['127.0.0.1:27017'],
|
115
116
|
:read => { :mode => :primary },
|
116
117
|
:database => SpecConfig.instance.test_db
|
@@ -122,7 +123,7 @@ describe Mongo::Client do
|
|
122
123
|
context 'when the options and cluster are equal' do
|
123
124
|
|
124
125
|
let(:other) do
|
125
|
-
|
126
|
+
new_local_client_nmio(
|
126
127
|
['127.0.0.1:27017'],
|
127
128
|
:read => { :mode => :primary },
|
128
129
|
:database => SpecConfig.instance.test_db
|
@@ -137,7 +138,7 @@ describe Mongo::Client do
|
|
137
138
|
context 'when the options are not equal' do
|
138
139
|
|
139
140
|
let(:other) do
|
140
|
-
|
141
|
+
new_local_client_nmio(
|
141
142
|
['127.0.0.1:27017'],
|
142
143
|
:read => { :mode => :secondary },
|
143
144
|
:database => SpecConfig.instance.test_db
|
@@ -152,7 +153,7 @@ describe Mongo::Client do
|
|
152
153
|
context 'when the cluster is not equal' do
|
153
154
|
|
154
155
|
let(:other) do
|
155
|
-
|
156
|
+
new_local_client_nmio(
|
156
157
|
['127.0.0.1:27010'],
|
157
158
|
:read => { :mode => :primary },
|
158
159
|
:database => SpecConfig.instance.test_db
|
@@ -168,7 +169,7 @@ describe Mongo::Client do
|
|
168
169
|
context 'when the other is not a client' do
|
169
170
|
|
170
171
|
let(:client) do
|
171
|
-
|
172
|
+
new_local_client_nmio(
|
172
173
|
['127.0.0.1:27017'],
|
173
174
|
:read => { :mode => :primary },
|
174
175
|
:database => SpecConfig.instance.test_db
|
@@ -184,7 +185,7 @@ describe Mongo::Client do
|
|
184
185
|
describe '#hash' do
|
185
186
|
|
186
187
|
let(:client) do
|
187
|
-
|
188
|
+
new_local_client_nmio(
|
188
189
|
['127.0.0.1:27017'],
|
189
190
|
:read => { :mode => :primary },
|
190
191
|
:local_threshold => 0.010,
|
@@ -193,7 +194,8 @@ describe Mongo::Client do
|
|
193
194
|
)
|
194
195
|
end
|
195
196
|
|
196
|
-
let(:default_options) { Mongo::Options::Redacted.new(
|
197
|
+
let(:default_options) { Mongo::Options::Redacted.new(
|
198
|
+
retry_writes: true, retry_reads: true, monitoring_io: false) }
|
197
199
|
|
198
200
|
let(:options) do
|
199
201
|
Mongo::Options::Redacted.new(:read => { :mode => :primary },
|
@@ -214,7 +216,7 @@ describe Mongo::Client do
|
|
214
216
|
describe '#inspect' do
|
215
217
|
|
216
218
|
let(:client) do
|
217
|
-
|
219
|
+
new_local_client_nmio(
|
218
220
|
['127.0.0.1:27017'],
|
219
221
|
:read => { :mode => :primary },
|
220
222
|
:database => SpecConfig.instance.test_db
|
@@ -228,7 +230,7 @@ describe Mongo::Client do
|
|
228
230
|
context 'when there is sensitive data in the options' do
|
229
231
|
|
230
232
|
let(:client) do
|
231
|
-
|
233
|
+
new_local_client_nmio(
|
232
234
|
['127.0.0.1:27017'],
|
233
235
|
:read => { :mode => :primary },
|
234
236
|
:database => SpecConfig.instance.test_db,
|
@@ -248,7 +250,7 @@ describe Mongo::Client do
|
|
248
250
|
context 'when there is a read preference set' do
|
249
251
|
|
250
252
|
let(:client) do
|
251
|
-
|
253
|
+
new_local_client_nmio(['127.0.0.1:27017'],
|
252
254
|
:database => SpecConfig.instance.test_db,
|
253
255
|
:read => mode,
|
254
256
|
:server_selection_timeout => 2)
|
@@ -320,7 +322,7 @@ describe Mongo::Client do
|
|
320
322
|
context 'when no mode provided' do
|
321
323
|
|
322
324
|
let(:client) do
|
323
|
-
|
325
|
+
new_local_client_nmio(['127.0.0.1:27017'],
|
324
326
|
:database => SpecConfig.instance.test_db,
|
325
327
|
:server_selection_timeout => 2)
|
326
328
|
end
|
@@ -333,7 +335,7 @@ describe Mongo::Client do
|
|
333
335
|
context 'when the read preference is printed' do
|
334
336
|
|
335
337
|
let(:client) do
|
336
|
-
|
338
|
+
new_local_client_nmio(SpecConfig.instance.addresses, options)
|
337
339
|
end
|
338
340
|
|
339
341
|
let(:options) do
|
@@ -362,7 +364,7 @@ describe Mongo::Client do
|
|
362
364
|
describe '#read_preference' do
|
363
365
|
|
364
366
|
let(:client) do
|
365
|
-
|
367
|
+
new_local_client_nmio(['127.0.0.1:27017'],
|
366
368
|
:database => SpecConfig.instance.test_db,
|
367
369
|
:read => mode,
|
368
370
|
:server_selection_timeout => 2)
|
@@ -430,7 +432,7 @@ describe Mongo::Client do
|
|
430
432
|
context 'when no mode provided' do
|
431
433
|
|
432
434
|
let(:client) do
|
433
|
-
|
435
|
+
new_local_client_nmio(['127.0.0.1:27017'],
|
434
436
|
:database => SpecConfig.instance.test_db,
|
435
437
|
:server_selection_timeout => 2)
|
436
438
|
end
|
@@ -447,7 +449,7 @@ describe Mongo::Client do
|
|
447
449
|
|
448
450
|
context 'when no option was provided to the client' do
|
449
451
|
|
450
|
-
let(:client) {
|
452
|
+
let(:client) { new_local_client_nmio(['127.0.0.1:27017'], :database => SpecConfig.instance.test_db) }
|
451
453
|
|
452
454
|
it 'does not set the write concern' do
|
453
455
|
expect(concern).to be_nil
|
@@ -459,7 +461,7 @@ describe Mongo::Client do
|
|
459
461
|
context 'when the option is acknowledged' do
|
460
462
|
|
461
463
|
let(:client) do
|
462
|
-
|
464
|
+
new_local_client_nmio(['127.0.0.1:27017'], :write => { :j => true }, :database => SpecConfig.instance.test_db)
|
463
465
|
end
|
464
466
|
|
465
467
|
it 'returns a acknowledged write concern' do
|
@@ -472,7 +474,7 @@ describe Mongo::Client do
|
|
472
474
|
context 'when the w is 0' do
|
473
475
|
|
474
476
|
let(:client) do
|
475
|
-
|
477
|
+
new_local_client_nmio(['127.0.0.1:27017'], :write => { :w => 0 }, :database => SpecConfig.instance.test_db)
|
476
478
|
end
|
477
479
|
|
478
480
|
it 'returns an unacknowledged write concern' do
|
@@ -483,7 +485,7 @@ describe Mongo::Client do
|
|
483
485
|
context 'when the w is -1' do
|
484
486
|
|
485
487
|
let(:client) do
|
486
|
-
|
488
|
+
new_local_client_nmio(['127.0.0.1:27017'], :write => { :w => -1 }, :database => SpecConfig.instance.test_db)
|
487
489
|
end
|
488
490
|
|
489
491
|
it 'raises an error' do
|
@@ -584,7 +586,9 @@ describe Mongo::Client do
|
|
584
586
|
end
|
585
587
|
|
586
588
|
let(:client) do
|
587
|
-
ClientRegistry.instance.new_local_client(
|
589
|
+
ClientRegistry.instance.new_local_client(
|
590
|
+
SpecConfig.instance.addresses, client_options
|
591
|
+
).tap do |cl|
|
588
592
|
cl.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber.clear_events!)
|
589
593
|
end
|
590
594
|
end
|
@@ -645,13 +649,13 @@ describe Mongo::Client do
|
|
645
649
|
|
646
650
|
describe '#close' do
|
647
651
|
let(:client) do
|
648
|
-
|
652
|
+
new_local_client_nmio(['127.0.0.1:27017'])
|
649
653
|
end
|
650
654
|
|
651
655
|
it 'disconnects the cluster and returns true' do
|
652
656
|
RSpec::Mocks.with_temporary_scope do
|
653
657
|
expect(client.cluster).to receive(:disconnect!).and_call_original
|
654
|
-
expect(client.close
|
658
|
+
expect(client.close).to be(true)
|
655
659
|
end
|
656
660
|
end
|
657
661
|
end
|
@@ -659,7 +663,7 @@ describe Mongo::Client do
|
|
659
663
|
describe '#reconnect' do
|
660
664
|
|
661
665
|
let(:client) do
|
662
|
-
|
666
|
+
new_local_client_nmio([ClusterConfig.instance.primary_address_str])
|
663
667
|
end
|
664
668
|
|
665
669
|
it 'replaces the cluster' do
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Cluster::PeriodicExecutor do
|
4
|
+
|
5
|
+
let(:executor) do
|
6
|
+
described_class.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#log_warn' do
|
10
|
+
it 'works' do
|
11
|
+
expect do
|
12
|
+
executor.log_warn('test warning')
|
13
|
+
end.not_to raise_error
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,214 @@
|
|
1
|
+
require 'lite_spec_helper'
|
2
|
+
|
3
|
+
xdescribe Mongo::Cluster::SrvMonitor do
|
4
|
+
describe '#scan!' do
|
5
|
+
let(:hostname) do
|
6
|
+
'test1.test.build.10gen.cc.'
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:hosts) do
|
10
|
+
[
|
11
|
+
'localhost.test.build.10gen.cc.:27017',
|
12
|
+
'localhost.test.build.10gen.cc.:27018',
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:records) do
|
17
|
+
double('records').tap do |records|
|
18
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
19
|
+
allow(records).to receive(:hosts).and_return(hosts)
|
20
|
+
allow(records).to receive(:empty?).and_return(false)
|
21
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:srv_uri) do
|
26
|
+
Mongo::URI.get("mongodb+srv://localhost.a.b")
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:cluster) do
|
30
|
+
Mongo::Cluster.new(records.hosts, Mongo::Monitoring.new, { monitoring_io: false })
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:monitoring) do
|
34
|
+
described_class.new(cluster, srv_uri: srv_uri)
|
35
|
+
end
|
36
|
+
|
37
|
+
before do
|
38
|
+
monitoring.scan!
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when a new DNS record is added' do
|
42
|
+
let(:new_hosts) do
|
43
|
+
hosts + ['test1.test.build.10gen.cc.:27019']
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:new_records) do
|
47
|
+
double('records').tap do |records|
|
48
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
49
|
+
allow(records).to receive(:hosts).and_return(new_hosts)
|
50
|
+
allow(records).to receive(:empty?).and_return(false)
|
51
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:resolver) do
|
56
|
+
double('resolver').tap do |resolver|
|
57
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'adds the new host to the cluster' do
|
62
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when a DNS record is removed' do
|
67
|
+
let(:new_hosts) do
|
68
|
+
hosts - ['test1.test.build.10gen.cc.:27018']
|
69
|
+
end
|
70
|
+
|
71
|
+
let(:new_records) do
|
72
|
+
double('records').tap do |records|
|
73
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
74
|
+
allow(records).to receive(:hosts).and_return(new_hosts)
|
75
|
+
allow(records).to receive(:empty?).and_return(false)
|
76
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
let(:resolver) do
|
81
|
+
double('resolver').tap do |resolver|
|
82
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'adds the new host to the cluster' do
|
87
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when a single DNS record is replaced' do
|
92
|
+
let(:new_hosts) do
|
93
|
+
hosts - ['test1.test.build.10gen.cc.:27018'] + ['test1.test.build.10gen.cc.:27019']
|
94
|
+
end
|
95
|
+
|
96
|
+
let(:new_records) do
|
97
|
+
double('records').tap do |records|
|
98
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
99
|
+
allow(records).to receive(:hosts).and_return(new_hosts)
|
100
|
+
allow(records).to receive(:empty?).and_return(false)
|
101
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
let(:resolver) do
|
106
|
+
double('resolver').tap do |resolver|
|
107
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'adds the new host to the cluster' do
|
112
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when all DNS records are replaced with a single record' do
|
117
|
+
let(:new_hosts) do
|
118
|
+
['test1.test.build.10gen.cc.:27019']
|
119
|
+
end
|
120
|
+
|
121
|
+
let(:new_records) do
|
122
|
+
double('records').tap do |records|
|
123
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
124
|
+
allow(records).to receive(:hosts).and_return(new_hosts)
|
125
|
+
allow(records).to receive(:empty?).and_return(false)
|
126
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
let(:resolver) do
|
131
|
+
double('resolver').tap do |resolver|
|
132
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'adds the new host to the cluster' do
|
137
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'when all DNS records are replaced with multiple records' do
|
142
|
+
let(:new_hosts) do
|
143
|
+
[
|
144
|
+
'test1.test.build.10gen.cc.:27019',
|
145
|
+
'test1.test.build.10gen.cc.:27020',
|
146
|
+
]
|
147
|
+
end
|
148
|
+
|
149
|
+
let(:new_records) do
|
150
|
+
double('records').tap do |records|
|
151
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
152
|
+
allow(records).to receive(:hosts).and_return(new_hosts)
|
153
|
+
allow(records).to receive(:empty?).and_return(false)
|
154
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
let(:resolver) do
|
159
|
+
double('resolver').tap do |resolver|
|
160
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'adds the new host to the cluster' do
|
165
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
context 'when the DNS lookup times out' do
|
170
|
+
let(:resolver) do
|
171
|
+
double('resolver').tap do |resolver|
|
172
|
+
allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'does not add or remove any hosts from the cluster' do
|
177
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'when the DNS lookup is unable to resolve the hostname' do
|
182
|
+
let(:resolver) do
|
183
|
+
double('resolver').tap do |resolver|
|
184
|
+
allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvError)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'does not add or remove any hosts from the cluster' do
|
189
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'when no DNS records are returned' do
|
194
|
+
let(:new_records) do
|
195
|
+
double('records').tap do |records|
|
196
|
+
allow(records).to receive(:hostname).and_return(hostname)
|
197
|
+
allow(records).to receive(:hosts).and_return([])
|
198
|
+
allow(records).to receive(:empty?).and_return(true)
|
199
|
+
allow(records).to receive(:min_ttl).and_return(nil)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
let(:resolver) do
|
204
|
+
double('resolver').tap do |resolver|
|
205
|
+
allow(resolver).to receive(:get_records).and_return(new_records)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
it 'does not add or remove any hosts from the cluster' do
|
210
|
+
expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|