mongo 2.10.5 → 2.11.0.rc0
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/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
|