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.
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