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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +2 -0
  6. data/lib/mongo/address.rb +4 -0
  7. data/lib/mongo/address/validator.rb +99 -0
  8. data/lib/mongo/auth.rb +7 -2
  9. data/lib/mongo/auth/user.rb +1 -7
  10. data/lib/mongo/background_thread.rb +135 -0
  11. data/lib/mongo/bulk_write/transformable.rb +3 -3
  12. data/lib/mongo/client.rb +74 -16
  13. data/lib/mongo/cluster.rb +193 -41
  14. data/lib/mongo/cluster/periodic_executor.rb +31 -43
  15. data/lib/mongo/cluster/sdam_flow.rb +26 -3
  16. data/lib/mongo/cluster/srv_monitor.rb +127 -0
  17. data/lib/mongo/collection/view/readable.rb +3 -5
  18. data/lib/mongo/collection/view/writable.rb +3 -3
  19. data/lib/mongo/cursor/builder/get_more_command.rb +1 -4
  20. data/lib/mongo/cursor/builder/kill_cursors_command.rb +5 -23
  21. data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
  22. data/lib/mongo/cursor/builder/op_kill_cursors.rb +5 -24
  23. data/lib/mongo/error.rb +1 -0
  24. data/lib/mongo/error/auth_error.rb +1 -1
  25. data/lib/mongo/error/connection_check_out_timeout.rb +7 -8
  26. data/lib/mongo/error/invalid_address.rb +24 -0
  27. data/lib/mongo/error/notable.rb +2 -2
  28. data/lib/mongo/error/operation_failure.rb +3 -3
  29. data/lib/mongo/error/pool_closed_error.rb +11 -4
  30. data/lib/mongo/event.rb +1 -1
  31. data/lib/mongo/grid/file.rb +0 -5
  32. data/lib/mongo/grid/file/chunk.rb +0 -2
  33. data/lib/mongo/grid/fs_bucket.rb +13 -15
  34. data/lib/mongo/grid/stream/write.rb +3 -9
  35. data/lib/mongo/loggable.rb +5 -1
  36. data/lib/mongo/monitoring.rb +1 -0
  37. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +7 -0
  38. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +11 -3
  39. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +11 -3
  40. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +11 -3
  41. data/lib/mongo/monitoring/event/cmap/pool_created.rb +12 -3
  42. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +62 -0
  43. data/lib/mongo/operation/shared/executable.rb +5 -10
  44. data/lib/mongo/operation/shared/sessions_supported.rb +1 -5
  45. data/lib/mongo/protocol/get_more.rb +1 -2
  46. data/lib/mongo/protocol/kill_cursors.rb +13 -6
  47. data/lib/mongo/protocol/serializers.rb +4 -20
  48. data/lib/mongo/retryable.rb +9 -34
  49. data/lib/mongo/semaphore.rb +1 -1
  50. data/lib/mongo/server.rb +113 -42
  51. data/lib/mongo/server/connection.rb +12 -5
  52. data/lib/mongo/server/connection_pool.rb +250 -40
  53. data/lib/mongo/server/connection_pool/populator.rb +58 -0
  54. data/lib/mongo/server/description.rb +9 -2
  55. data/lib/mongo/server/monitor.rb +68 -93
  56. data/lib/mongo/server/monitor/connection.rb +2 -0
  57. data/lib/mongo/server_selector/selectable.rb +13 -5
  58. data/lib/mongo/session.rb +0 -13
  59. data/lib/mongo/srv.rb +17 -0
  60. data/lib/mongo/srv/monitor.rb +96 -0
  61. data/lib/mongo/srv/resolver.rb +130 -0
  62. data/lib/mongo/srv/result.rb +126 -0
  63. data/lib/mongo/srv/warning_result.rb +35 -0
  64. data/lib/mongo/uri.rb +45 -55
  65. data/lib/mongo/uri/srv_protocol.rb +89 -42
  66. data/lib/mongo/version.rb +1 -1
  67. data/mongo.gemspec +3 -4
  68. data/spec/README.md +6 -1
  69. data/spec/enterprise_auth/kerberos_spec.rb +7 -6
  70. data/spec/integration/change_stream_examples_spec.rb +0 -4
  71. data/spec/integration/client_construction_spec.rb +14 -2
  72. data/spec/integration/connect_single_rs_name_spec.rb +2 -2
  73. data/spec/integration/connection_pool_populator_spec.rb +296 -0
  74. data/spec/integration/connection_spec.rb +31 -22
  75. data/spec/integration/cursor_reaping_spec.rb +1 -2
  76. data/spec/integration/docs_examples_spec.rb +0 -4
  77. data/spec/integration/heartbeat_events_spec.rb +17 -15
  78. data/spec/integration/reconnect_spec.rb +144 -1
  79. data/spec/integration/retryable_writes_errors_spec.rb +0 -4
  80. data/spec/integration/retryable_writes_spec.rb +36 -36
  81. data/spec/integration/sdam_error_handling_spec.rb +31 -25
  82. data/spec/integration/sdam_events_spec.rb +2 -6
  83. data/spec/integration/server_monitor_spec.rb +28 -0
  84. data/spec/integration/server_selector_spec.rb +7 -5
  85. data/spec/integration/srv_monitoring_spec.rb +360 -0
  86. data/spec/integration/step_down_spec.rb +4 -6
  87. data/spec/lite_spec_helper.rb +22 -0
  88. data/spec/mongo/address/validator_spec.rb +51 -0
  89. data/spec/mongo/auth/cr_spec.rb +1 -29
  90. data/spec/mongo/auth/ldap_spec.rb +1 -29
  91. data/spec/mongo/auth/scram/conversation_spec.rb +0 -2
  92. data/spec/mongo/auth/scram/negotiation_spec.rb +1 -1
  93. data/spec/mongo/auth/scram_spec.rb +1 -29
  94. data/spec/mongo/auth/user/view_spec.rb +1 -36
  95. data/spec/mongo/auth/user_spec.rb +0 -12
  96. data/spec/mongo/auth/x509_spec.rb +1 -29
  97. data/spec/mongo/bulk_write_spec.rb +2 -2
  98. data/spec/mongo/client_construction_spec.rb +56 -15
  99. data/spec/mongo/client_spec.rb +31 -27
  100. data/spec/mongo/cluster/periodic_executor_spec.rb +16 -0
  101. data/spec/mongo/cluster/srv_monitor_spec.rb +214 -0
  102. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -11
  103. data/spec/mongo/cluster/topology/sharded_spec.rb +12 -9
  104. data/spec/mongo/cluster/topology/single_spec.rb +20 -11
  105. data/spec/mongo/cluster_spec.rb +45 -29
  106. data/spec/mongo/collection/view/map_reduce_spec.rb +14 -9
  107. data/spec/mongo/collection/view/readable_spec.rb +0 -16
  108. data/spec/mongo/collection_spec.rb +0 -44
  109. data/spec/mongo/cursor/builder/get_more_command_spec.rb +2 -4
  110. data/spec/mongo/cursor/builder/op_get_more_spec.rb +2 -4
  111. data/spec/mongo/cursor_spec.rb +27 -7
  112. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +10 -3
  113. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +10 -3
  114. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +10 -3
  115. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +10 -3
  116. data/spec/mongo/operation/delete/op_msg_spec.rb +17 -8
  117. data/spec/mongo/operation/insert/op_msg_spec.rb +50 -35
  118. data/spec/mongo/operation/update/op_msg_spec.rb +14 -7
  119. data/spec/mongo/retryable_spec.rb +52 -31
  120. data/spec/mongo/server/app_metadata_spec.rb +0 -8
  121. data/spec/mongo/server/connection_auth_spec.rb +5 -2
  122. data/spec/mongo/server/connection_pool/populator_spec.rb +101 -0
  123. data/spec/mongo/server/connection_pool_spec.rb +256 -107
  124. data/spec/mongo/server/connection_spec.rb +22 -33
  125. data/spec/mongo/server/description_spec.rb +42 -4
  126. data/spec/mongo/server/monitor/connection_spec.rb +22 -11
  127. data/spec/mongo/server/monitor_spec.rb +66 -107
  128. data/spec/mongo/server_spec.rb +82 -60
  129. data/spec/mongo/session/session_pool_spec.rb +1 -5
  130. data/spec/mongo/session_spec.rb +0 -4
  131. data/spec/mongo/socket/ssl_spec.rb +2 -2
  132. data/spec/mongo/srv/monitor_spec.rb +211 -0
  133. data/spec/mongo/srv/result_spec.rb +54 -0
  134. data/spec/mongo/uri/srv_protocol_spec.rb +30 -15
  135. data/spec/mongo/uri_spec.rb +125 -4
  136. data/spec/spec_helper.rb +6 -0
  137. data/spec/spec_tests/auth_spec.rb +39 -0
  138. data/spec/spec_tests/cmap_spec.rb +55 -8
  139. data/spec/spec_tests/connection_string_spec.rb +6 -31
  140. data/spec/spec_tests/data/auth/connection-string.yml +297 -0
  141. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +4 -1
  142. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
  143. data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
  144. data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
  145. data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
  146. data/spec/spec_tests/data/connection_string/valid-warnings.yml +26 -30
  147. data/spec/spec_tests/data/transactions/abort.yml +3 -3
  148. data/spec/spec_tests/data/transactions/error-labels.yml +3 -3
  149. data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
  150. data/spec/spec_tests/data/uri_options/auth-options.yml +1 -1
  151. data/spec/spec_tests/max_staleness_spec.rb +7 -2
  152. data/spec/spec_tests/retryable_reads_spec.rb +0 -31
  153. data/spec/spec_tests/sdam_monitoring_spec.rb +12 -12
  154. data/spec/spec_tests/sdam_spec.rb +4 -7
  155. data/spec/spec_tests/server_selection_spec.rb +6 -2
  156. data/spec/spec_tests/transactions_spec.rb +0 -2
  157. data/spec/spec_tests/uri_options_spec.rb +4 -2
  158. data/spec/stress/connection_pool_stress_spec.rb +203 -0
  159. data/spec/stress/connection_pool_timing_spec.rb +181 -0
  160. data/spec/support/auth.rb +113 -0
  161. data/spec/support/background_thread_registry.rb +63 -0
  162. data/spec/support/client_registry.rb +11 -2
  163. data/spec/support/cluster_config.rb +65 -46
  164. data/spec/support/cluster_tools.rb +2 -2
  165. data/spec/support/cmap.rb +13 -14
  166. data/spec/support/cmap/verifier.rb +4 -5
  167. data/spec/support/command_monitoring.rb +0 -5
  168. data/spec/support/common_shortcuts.rb +101 -1
  169. data/spec/support/constraints.rb +25 -0
  170. data/spec/support/dns.rb +13 -0
  171. data/spec/support/event_subscriber.rb +0 -7
  172. data/spec/support/json_ext_formatter.rb +5 -1
  173. data/spec/support/lite_constraints.rb +22 -6
  174. data/spec/support/local_resource_registry.rb +34 -0
  175. data/spec/support/sdam_monitoring.rb +115 -0
  176. data/spec/support/spec_config.rb +20 -6
  177. data/spec/support/spec_setup.rb +2 -2
  178. data/spec/support/transactions.rb +1 -1
  179. data/spec/support/transactions/test.rb +1 -1
  180. data/spec/support/utils.rb +1 -16
  181. metadata +685 -659
  182. metadata.gz.sig +0 -0
  183. data/lib/mongo/event/description_changed.rb +0 -52
  184. data/spec/integration/bson_symbol_spec.rb +0 -34
  185. data/spec/integration/crud_spec.rb +0 -45
  186. data/spec/integration/get_more_spec.rb +0 -32
  187. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  188. data/spec/integration/retryable_errors_spec.rb +0 -265
  189. data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +0 -98
  190. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
  191. data/spec/runners/sdam/verifier.rb +0 -88
@@ -34,22 +34,34 @@ describe Mongo::Cluster::Topology::ReplicaSetNoPrimary do
34
34
 
35
35
  let(:mongos) do
36
36
  Mongo::Server.new(address, cluster, monitoring, listeners,
37
- SpecConfig.instance.test_options.merge(monitoring_io: false))
37
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
38
+ ).tap do |server|
39
+ allow(server).to receive(:description).and_return(mongos_description)
40
+ end
38
41
  end
39
42
 
40
43
  let(:standalone) do
41
44
  Mongo::Server.new(address, cluster, monitoring, listeners,
42
- SpecConfig.instance.test_options.merge(monitoring_io: false))
45
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
46
+ ).tap do |server|
47
+ allow(server).to receive(:description).and_return(standalone_description)
48
+ end
43
49
  end
44
50
 
45
51
  let(:replica_set) do
46
52
  Mongo::Server.new(address, cluster, monitoring, listeners,
47
- SpecConfig.instance.test_options.merge(monitoring_io: false))
53
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
54
+ ).tap do |server|
55
+ allow(server).to receive(:description).and_return(replica_set_description)
56
+ end
48
57
  end
49
58
 
50
59
  let(:replica_set_two) do
51
60
  Mongo::Server.new(address, cluster, monitoring, listeners,
52
- SpecConfig.instance.test_options.merge(monitoring_io: false))
61
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
62
+ ).tap do |server|
63
+ allow(server).to receive(:description).and_return(replica_set_two_description)
64
+ end
53
65
  end
54
66
 
55
67
  let(:mongos_description) do
@@ -74,13 +86,6 @@ describe Mongo::Cluster::Topology::ReplicaSetNoPrimary do
74
86
  'setName' => 'test', 'ok' => 1 })
75
87
  end
76
88
 
77
- before do
78
- mongos.monitor.instance_variable_set(:@description, mongos_description)
79
- standalone.monitor.instance_variable_set(:@description, standalone_description)
80
- replica_set.monitor.instance_variable_set(:@description, replica_set_description)
81
- replica_set_two.monitor.instance_variable_set(:@description, replica_set_two_description)
82
- end
83
-
84
89
  context 'when a replica set name is provided' do
85
90
 
86
91
  let(:topology) do
@@ -36,17 +36,26 @@ describe Mongo::Cluster::Topology::Sharded do
36
36
 
37
37
  let(:mongos) do
38
38
  Mongo::Server.new(address, cluster, monitoring, listeners,
39
- SpecConfig.instance.test_options.merge(monitoring_io: false))
39
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
40
+ ).tap do |server|
41
+ allow(server).to receive(:description).and_return(mongos_description)
42
+ end
40
43
  end
41
44
 
42
45
  let(:standalone) do
43
46
  Mongo::Server.new(address, cluster, monitoring, listeners,
44
- SpecConfig.instance.test_options.merge(monitoring_io: false))
47
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
48
+ ).tap do |server|
49
+ allow(server).to receive(:description).and_return(standalone_description)
50
+ end
45
51
  end
46
52
 
47
53
  let(:replica_set) do
48
54
  Mongo::Server.new(address, cluster, monitoring, listeners,
49
- SpecConfig.instance.test_options.merge(monitoring_io: false))
55
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
56
+ ).tap do |server|
57
+ allow(server).to receive(:description).and_return(replica_set_description)
58
+ end
50
59
  end
51
60
 
52
61
  let(:mongos_description) do
@@ -81,12 +90,6 @@ describe Mongo::Cluster::Topology::Sharded do
81
90
 
82
91
  describe '.servers' do
83
92
 
84
- before do
85
- mongos.monitor.instance_variable_set(:@description, mongos_description)
86
- standalone.monitor.instance_variable_set(:@description, standalone_description)
87
- replica_set.monitor.instance_variable_set(:@description, replica_set_description)
88
- end
89
-
90
93
  let(:servers) do
91
94
  topology.servers([ mongos, standalone, replica_set ])
92
95
  end
@@ -37,19 +37,35 @@ describe Mongo::Cluster::Topology::Single do
37
37
  describe '.servers' do
38
38
 
39
39
  let(:mongos) do
40
- Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
40
+ Mongo::Server.new(address, cluster, monitoring, listeners,
41
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
42
+ ).tap do |server|
43
+ allow(server).to receive(:description).and_return(mongos_description)
44
+ end
41
45
  end
42
46
 
43
47
  let(:standalone) do
44
- Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
48
+ Mongo::Server.new(address, cluster, monitoring, listeners,
49
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
50
+ ).tap do |server|
51
+ allow(server).to receive(:description).and_return(standalone_description)
52
+ end
45
53
  end
46
54
 
47
55
  let(:standalone_two) do
48
- Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
56
+ Mongo::Server.new(address, cluster, monitoring, listeners,
57
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
58
+ ).tap do |server|
59
+ allow(server).to receive(:description).and_return(standalone_description)
60
+ end
49
61
  end
50
62
 
51
63
  let(:replica_set) do
52
- Mongo::Server.new(address, cluster, monitoring, listeners, SpecConfig.instance.test_options)
64
+ Mongo::Server.new(address, cluster, monitoring, listeners,
65
+ SpecConfig.instance.test_options.merge(monitoring_io: false)
66
+ ).tap do |server|
67
+ allow(server).to receive(:description).and_return(replica_set_description)
68
+ end
53
69
  end
54
70
 
55
71
  let(:mongos_description) do
@@ -67,13 +83,6 @@ describe Mongo::Cluster::Topology::Single do
67
83
  'setName' => 'testing' })
68
84
  end
69
85
 
70
- before do
71
- mongos.monitor.instance_variable_set(:@description, mongos_description)
72
- standalone.monitor.instance_variable_set(:@description, standalone_description)
73
- standalone_two.monitor.instance_variable_set(:@description, standalone_description)
74
- replica_set.monitor.instance_variable_set(:@description, replica_set_description)
75
- end
76
-
77
86
  let(:servers) do
78
87
  topology.servers([ mongos, standalone, standalone_two, replica_set ])
79
88
  end
@@ -7,9 +7,10 @@ describe Mongo::Cluster do
7
7
  end
8
8
 
9
9
  let(:cluster_with_semaphore) do
10
- described_class.new(SpecConfig.instance.addresses, monitoring,
11
- SpecConfig.instance.test_options.merge(
12
- server_selection_semaphore: Mongo::Semaphore.new))
10
+ register_cluster(
11
+ described_class.new(SpecConfig.instance.addresses, monitoring,
12
+ SpecConfig.instance.test_options.merge(
13
+ server_selection_semaphore: Mongo::Semaphore.new)))
13
14
  end
14
15
 
15
16
  let(:cluster_without_io) do
@@ -19,25 +20,6 @@ describe Mongo::Cluster do
19
20
 
20
21
  let(:cluster) { cluster_without_io }
21
22
 
22
- describe 'initialize' do
23
-
24
- context 'when there are duplicate addresses' do
25
-
26
- let(:addresses) do
27
- SpecConfig.instance.addresses + SpecConfig.instance.addresses
28
- end
29
- let(:cluster_with_dup_addresses) do
30
- described_class.new(addresses, monitoring, SpecConfig.instance.test_options.merge(
31
- server_selection_semaphore: Mongo::Semaphore.new))
32
- end
33
-
34
- it 'does not raise an exception' do
35
- expect { cluster_with_dup_addresses }.not_to raise_error
36
- end
37
- end
38
-
39
- end
40
-
41
23
  describe '#==' do
42
24
 
43
25
  context 'when the other is a cluster' do
@@ -167,8 +149,15 @@ describe Mongo::Cluster do
167
149
  cluster.instance_variable_get(:@servers)
168
150
  end
169
151
 
152
+ let(:server) { known_servers.first }
153
+
154
+ let(:monitor) do
155
+ double('monitor')
156
+ end
157
+
170
158
  before do
171
- expect(known_servers.first).to receive(:scan!).and_call_original
159
+ expect(server).to receive(:monitor).at_least(:once).and_return(monitor)
160
+ expect(monitor).to receive(:scan!)
172
161
  end
173
162
 
174
163
  it 'returns true' do
@@ -278,6 +267,27 @@ describe Mongo::Cluster do
278
267
  expect(cluster.servers[0].address.seed).to_not eq('a')
279
268
  end
280
269
  end
270
+
271
+ context 'topology is Sharded' do
272
+
273
+ let(:topology) do
274
+ Mongo::Cluster::Topology::Single.new({}, cluster)
275
+ end
276
+
277
+ before do
278
+ cluster.add('a')
279
+ end
280
+
281
+ it 'creates server with nil last_scan' do
282
+ server = cluster.servers_list.detect do |server|
283
+ server.address.seed == 'a'
284
+ end
285
+
286
+ expect(server).not_to be nil
287
+
288
+ expect(server.last_scan).to be nil
289
+ end
290
+ end
281
291
  end
282
292
 
283
293
  describe '#disconnect!' do
@@ -349,11 +359,11 @@ describe Mongo::Cluster do
349
359
  describe '#remove' do
350
360
 
351
361
  let(:address_a) do
352
- Mongo::Address.new('127.0.0.1:27017')
362
+ Mongo::Address.new('127.0.0.1:25555')
353
363
  end
354
364
 
355
365
  let(:address_b) do
356
- Mongo::Address.new('127.0.0.1:27018')
366
+ Mongo::Address.new('127.0.0.1:25556')
357
367
  end
358
368
 
359
369
  let(:monitoring) do
@@ -361,11 +371,15 @@ describe Mongo::Cluster do
361
371
  end
362
372
 
363
373
  let(:server_a) do
364
- Mongo::Server.new(address_a, cluster, monitoring, Mongo::Event::Listeners.new)
374
+ register_server(
375
+ Mongo::Server.new(address_a, cluster, monitoring, Mongo::Event::Listeners.new,
376
+ monitor: false))
365
377
  end
366
378
 
367
379
  let(:server_b) do
368
- Mongo::Server.new(address_b, cluster, monitoring, Mongo::Event::Listeners.new)
380
+ register_server(
381
+ Mongo::Server.new(address_b, cluster, monitoring, Mongo::Event::Listeners.new,
382
+ monitor: false))
369
383
  end
370
384
 
371
385
  let(:servers) do
@@ -378,7 +392,7 @@ describe Mongo::Cluster do
378
392
 
379
393
  before do
380
394
  cluster.instance_variable_set(:@servers, servers)
381
- cluster.remove('127.0.0.1:27017')
395
+ cluster.remove('127.0.0.1:25555')
382
396
  end
383
397
 
384
398
  it 'removes the host from the list of servers' do
@@ -393,7 +407,9 @@ describe Mongo::Cluster do
393
407
  describe '#next_primary' do
394
408
 
395
409
  let(:cluster) do
396
- authorized_client.cluster
410
+ # We use next_primary to wait for server selection, and this is
411
+ # also the method we are testing.
412
+ authorized_client.tap { |client| client.cluster.next_primary }.cluster
397
413
  end
398
414
 
399
415
  let(:primary_candidates) do
@@ -576,13 +576,20 @@ describe Mongo::Collection::View::MapReduce do
576
576
  end
577
577
 
578
578
  context 'when the server is not a valid for writing' do
579
+ clean_slate
580
+
581
+ before do
582
+ stop_monitoring(authorized_client)
583
+ end
579
584
 
580
585
  it 'reroutes the operation to a primary' do
581
- allow(map_reduce).to receive(:valid_server?).and_return(false)
582
- expect(Mongo::Logger.logger).to receive(:warn).once do |msg|
583
- expect(msg).to include('Rerouting the MapReduce operation to the primary server')
586
+ RSpec::Mocks.with_temporary_scope do
587
+ allow(map_reduce).to receive(:valid_server?).and_return(false)
588
+ expect(Mongo::Logger.logger).to receive(:warn).once do |msg|
589
+ expect(msg).to include('Rerouting the MapReduce operation to the primary server')
590
+ end
591
+ map_reduce.to_a
584
592
  end
585
- map_reduce.to_a
586
593
  end
587
594
 
588
595
  context 'when the view has a write concern' do
@@ -649,12 +656,10 @@ describe Mongo::Collection::View::MapReduce do
649
656
  end
650
657
 
651
658
  context 'when the server is a valid for writing' do
659
+ clean_slate
660
+
652
661
  before do
653
- # We are inspecting server state - kill monitor threads so that
654
- # server state is not changed in background due to intermittent
655
- # connectivity issues in Evergreen
656
- ClientRegistry.instance.close_all_clients
657
- authorized_collection.client.cluster.disconnect!
662
+ stop_monitoring(authorized_client)
658
663
  end
659
664
 
660
665
  it 'does not reroute the operation to a primary' do
@@ -368,10 +368,6 @@ describe Mongo::Collection::View::Readable do
368
368
 
369
369
  context 'when the collection has a read preference set' do
370
370
 
371
- after do
372
- client.close(true)
373
- end
374
-
375
371
  let(:client) do
376
372
  # Set a timeout in case the collection read_preference does get used.
377
373
  # Otherwise, the test will hang for 30 seconds.
@@ -437,10 +433,6 @@ describe Mongo::Collection::View::Readable do
437
433
  context 'when the collection does not have a read preference set' do
438
434
  require_topology :single, :replica_set
439
435
 
440
- after do
441
- client.close(true)
442
- end
443
-
444
436
  let(:client) do
445
437
  authorized_client.with(server_selection_timeout: 1)
446
438
  end
@@ -755,10 +747,6 @@ describe Mongo::Collection::View::Readable do
755
747
  authorized_collection.insert_many(documents)
756
748
  end
757
749
 
758
- after do
759
- client.close(true)
760
- end
761
-
762
750
  let(:client) do
763
751
  # Set a timeout in case the collection read_preference does get used.
764
752
  # Otherwise, the test will hang for 30 seconds.
@@ -818,10 +806,6 @@ describe Mongo::Collection::View::Readable do
818
806
  allow(view.collection.client.cluster).to receive(:single?).and_return(false)
819
807
  end
820
808
 
821
- after do
822
- client.close(true)
823
- end
824
-
825
809
  let(:client) do
826
810
  authorized_client.with(server_selection_timeout: 1)
827
811
  end
@@ -945,30 +945,6 @@ describe Mongo::Collection do
945
945
  it_behaves_like 'a failed operation using a session'
946
946
  end
947
947
  end
948
-
949
- context 'when collation has a strength' do
950
- min_server_fcv '3.4'
951
-
952
- let(:band_collection) do
953
- described_class.new(database, :bands)
954
- end
955
-
956
- before do
957
- band_collection.delete_many
958
- band_collection.insert_many([{ name: "Depeche Mode" }, { name: "New Order" }])
959
- end
960
-
961
- let(:options) do
962
- { collation: { locale: 'en_US', strength: 2 } }
963
- end
964
- let(:band_result) do
965
- band_collection.find({ name: 'DEPECHE MODE' }, options)
966
- end
967
-
968
- it 'finds Capitalize from UPPER CASE' do
969
- expect(band_result.count_documents).to eq(1)
970
- end
971
- end
972
948
  end
973
949
 
974
950
  describe '#drop' do
@@ -1513,10 +1489,6 @@ describe Mongo::Collection do
1513
1489
  expect(custom_collection.count).to eq(1)
1514
1490
  end
1515
1491
 
1516
- after do
1517
- custom_client.close(true)
1518
- end
1519
-
1520
1492
  it 'inserts with the custom id' do
1521
1493
  expect(custom_collection.count).to eq(1)
1522
1494
  expect(custom_collection.find.first[:_id]).to eq(1)
@@ -1564,10 +1536,6 @@ describe Mongo::Collection do
1564
1536
  client[TEST_COLL].insert_many(documents)
1565
1537
  end
1566
1538
 
1567
- after do
1568
- client.close(true)
1569
- end
1570
-
1571
1539
  let(:insert_events) do
1572
1540
  EventSubscriber.started_events.select { |e| e.command_name == 'insert' }
1573
1541
  end
@@ -1777,10 +1745,6 @@ describe Mongo::Collection do
1777
1745
  custom_collection.insert_one({ name: 'testing' })
1778
1746
  end
1779
1747
 
1780
- after do
1781
- custom_client.close(true)
1782
- end
1783
-
1784
1748
  it 'inserts with the custom id' do
1785
1749
  expect(custom_collection.find.first[:_id]).to eq(1)
1786
1750
  end
@@ -2859,10 +2823,6 @@ describe Mongo::Collection do
2859
2823
  allow(collection.client.cluster).to receive(:single?).and_return(false)
2860
2824
  end
2861
2825
 
2862
- after do
2863
- client.close(true)
2864
- end
2865
-
2866
2826
  let(:client) do
2867
2827
  authorized_client.with(server_selection_timeout: 0.2)
2868
2828
  end
@@ -4011,10 +3971,6 @@ describe Mongo::Collection do
4011
3971
  client[TEST_COLL].update_one({ a: 1 }, {'$set' => { 'name' => '1'*16777149 }})
4012
3972
  end
4013
3973
 
4014
- after do
4015
- client.close(true)
4016
- end
4017
-
4018
3974
  let(:update_events) do
4019
3975
  EventSubscriber.started_events.select { |e| e.command_name == 'update' }
4020
3976
  end