mongo 2.9.2 → 2.10.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +1 -0
  5. data/lib/mongo/auth/user/view.rb +4 -4
  6. data/lib/mongo/bulk_write.rb +14 -8
  7. data/lib/mongo/bulk_write/result.rb +1 -1
  8. data/lib/mongo/bulk_write/result_combiner.rb +2 -2
  9. data/lib/mongo/bulk_write/transformable.rb +17 -9
  10. data/lib/mongo/client.rb +107 -16
  11. data/lib/mongo/cluster.rb +47 -25
  12. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  13. data/lib/mongo/cluster_time.rb +139 -0
  14. data/lib/mongo/collection.rb +84 -25
  15. data/lib/mongo/collection/view.rb +7 -3
  16. data/lib/mongo/collection/view/aggregation.rb +4 -4
  17. data/lib/mongo/collection/view/builder/aggregation.rb +31 -6
  18. data/lib/mongo/collection/view/builder/find_command.rb +4 -1
  19. data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
  20. data/lib/mongo/collection/view/change_stream.rb +54 -66
  21. data/lib/mongo/collection/view/iterable.rb +2 -2
  22. data/lib/mongo/collection/view/map_reduce.rb +6 -4
  23. data/lib/mongo/collection/view/readable.rb +36 -16
  24. data/lib/mongo/collection/view/writable.rb +68 -22
  25. data/lib/mongo/cursor.rb +87 -20
  26. data/lib/mongo/database.rb +47 -43
  27. data/lib/mongo/database/view.rb +54 -11
  28. data/lib/mongo/error.rb +13 -4
  29. data/lib/mongo/error/invalid_write_concern.rb +2 -2
  30. data/lib/mongo/error/operation_failure.rb +65 -11
  31. data/lib/mongo/error/parser.rb +41 -8
  32. data/lib/mongo/grid/fs_bucket.rb +26 -6
  33. data/lib/mongo/grid/stream/read.rb +9 -2
  34. data/lib/mongo/grid/stream/write.rb +21 -5
  35. data/lib/mongo/index/view.rb +3 -3
  36. data/lib/mongo/lint.rb +10 -3
  37. data/lib/mongo/operation.rb +2 -0
  38. data/lib/mongo/operation/aggregate/result.rb +19 -6
  39. data/lib/mongo/operation/collections_info.rb +1 -1
  40. data/lib/mongo/operation/get_more/result.rb +9 -0
  41. data/lib/mongo/operation/list_collections/command.rb +1 -3
  42. data/lib/mongo/operation/list_collections/op_msg.rb +1 -2
  43. data/lib/mongo/operation/parallel_scan/command.rb +4 -1
  44. data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -1
  45. data/lib/mongo/operation/result.rb +27 -4
  46. data/lib/mongo/operation/shared/executable.rb +19 -5
  47. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -2
  48. data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -9
  49. data/lib/mongo/operation/shared/polymorphic_result.rb +9 -1
  50. data/lib/mongo/operation/shared/result/aggregatable.rb +2 -2
  51. data/lib/mongo/operation/shared/sessions_supported.rb +42 -32
  52. data/lib/mongo/operation/shared/specifiable.rb +40 -0
  53. data/lib/mongo/operation/shared/unpinnable.rb +39 -0
  54. data/lib/mongo/operation/shared/write.rb +1 -1
  55. data/lib/mongo/protocol/update.rb +6 -2
  56. data/lib/mongo/retryable.rb +79 -39
  57. data/lib/mongo/server/connection.rb +10 -3
  58. data/lib/mongo/server/description.rb +25 -1
  59. data/lib/mongo/server/monitor/connection.rb +1 -1
  60. data/lib/mongo/server_selector.rb +10 -0
  61. data/lib/mongo/server_selector/selectable.rb +172 -32
  62. data/lib/mongo/session.rb +654 -581
  63. data/lib/mongo/session/session_pool.rb +1 -1
  64. data/lib/mongo/socket.rb +7 -28
  65. data/lib/mongo/socket/ssl.rb +26 -1
  66. data/lib/mongo/socket/tcp.rb +3 -0
  67. data/lib/mongo/socket/unix.rb +3 -0
  68. data/lib/mongo/uri.rb +112 -265
  69. data/lib/mongo/uri/srv_protocol.rb +4 -1
  70. data/lib/mongo/version.rb +1 -1
  71. data/lib/mongo/write_concern.rb +10 -29
  72. data/lib/mongo/write_concern/acknowledged.rb +12 -0
  73. data/lib/mongo/write_concern/base.rb +17 -13
  74. data/lib/mongo/write_concern/unacknowledged.rb +12 -0
  75. data/spec/atlas/atlas_connectivity_spec.rb +7 -37
  76. data/spec/atlas/operations_spec.rb +25 -0
  77. data/spec/integration/change_stream_examples_spec.rb +45 -31
  78. data/spec/integration/change_stream_spec.rb +305 -5
  79. data/spec/integration/client_spec.rb +44 -0
  80. data/spec/integration/command_monitoring_spec.rb +1 -0
  81. data/spec/integration/command_spec.rb +7 -1
  82. data/spec/integration/mmapv1_spec.rb +28 -0
  83. data/spec/integration/mongos_pinning_spec.rb +34 -0
  84. data/spec/integration/operation_failure_code_spec.rb +2 -2
  85. data/spec/integration/{read_concern.rb → read_concern_spec.rb} +7 -1
  86. data/spec/integration/read_preference_spec.rb +485 -0
  87. data/spec/integration/retryable_writes_spec.rb +8 -19
  88. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  89. data/spec/integration/sdam_events_spec.rb +2 -2
  90. data/spec/integration/server_description_spec.rb +14 -17
  91. data/spec/integration/server_selector_spec.rb +7 -3
  92. data/spec/integration/server_spec.rb +48 -0
  93. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  94. data/spec/integration/step_down_spec.rb +10 -4
  95. data/spec/integration/transactions_examples_spec.rb +11 -10
  96. data/spec/lite_spec_helper.rb +19 -16
  97. data/spec/mongo/auth/scram/negotiation_spec.rb +11 -8
  98. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +6 -6
  99. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +4 -4
  100. data/spec/mongo/bulk_write_spec.rb +12 -2
  101. data/spec/mongo/client_construction_spec.rb +160 -8
  102. data/spec/mongo/client_spec.rb +5 -4
  103. data/spec/mongo/cluster_spec.rb +6 -6
  104. data/spec/mongo/cluster_time_spec.rb +148 -0
  105. data/spec/mongo/collection/view/aggregation_spec.rb +34 -15
  106. data/spec/mongo/collection/view/change_stream_spec.rb +62 -3
  107. data/spec/mongo/collection/view/map_reduce_spec.rb +7 -5
  108. data/spec/mongo/collection/view/readable_spec.rb +4 -4
  109. data/spec/mongo/collection_spec.rb +331 -14
  110. data/spec/mongo/cursor_spec.rb +117 -5
  111. data/spec/mongo/database_spec.rb +240 -8
  112. data/spec/mongo/error/operation_failure_spec.rb +47 -1
  113. data/spec/mongo/error/parser_spec.rb +160 -23
  114. data/spec/mongo/operation/insert/bulk_spec.rb +2 -1
  115. data/spec/mongo/operation/result_spec.rb +27 -0
  116. data/spec/mongo/operation/update/bulk_spec.rb +1 -0
  117. data/spec/mongo/retryable_spec.rb +2 -0
  118. data/spec/mongo/server/app_metadata_spec.rb +2 -2
  119. data/spec/mongo/server/connection_spec.rb +13 -17
  120. data/spec/mongo/server/monitor/connection_spec.rb +13 -10
  121. data/spec/mongo/server_selector_spec.rb +34 -2
  122. data/spec/mongo/session/session_pool_spec.rb +14 -3
  123. data/spec/mongo/session_spec.rb +3 -3
  124. data/spec/mongo/session_transaction_spec.rb +4 -3
  125. data/spec/mongo/socket/ssl_spec.rb +19 -5
  126. data/spec/mongo/socket_spec.rb +1 -62
  127. data/spec/mongo/uri/srv_protocol_spec.rb +14 -20
  128. data/spec/mongo/uri_option_parsing_spec.rb +94 -8
  129. data/spec/mongo/uri_spec.rb +23 -10
  130. data/spec/mongo/write_concern_spec.rb +56 -3
  131. data/spec/spec_tests/change_streams_spec.rb +2 -1
  132. data/spec/spec_tests/cmap_spec.rb +1 -1
  133. data/spec/spec_tests/crud_spec.rb +12 -2
  134. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +24 -1
  135. data/spec/spec_tests/data/change_streams/change-streams.yml +172 -3
  136. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +1 -1
  137. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -2
  138. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -5
  139. data/spec/spec_tests/data/crud/read/aggregate-out.yml +0 -6
  140. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  141. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +1 -0
  142. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
  143. data/spec/spec_tests/data/crud/write/bulkWrite.yml +401 -0
  144. data/spec/spec_tests/data/crud/write/insertMany.yml +58 -2
  145. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +3 -0
  146. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +6 -1
  147. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  148. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +110 -0
  149. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +81 -0
  150. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +38 -0
  151. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +92 -0
  152. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +2 -2
  153. data/spec/spec_tests/data/transactions/abort.yml +3 -0
  154. data/spec/spec_tests/data/transactions/bulk.yml +3 -8
  155. data/spec/spec_tests/data/transactions/causal-consistency.yml +3 -8
  156. data/spec/spec_tests/data/transactions/commit.yml +3 -1
  157. data/spec/spec_tests/data/transactions/count.yml +3 -0
  158. data/spec/spec_tests/data/transactions/delete.yml +3 -0
  159. data/spec/spec_tests/data/transactions/error-labels.yml +4 -1
  160. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  161. data/spec/spec_tests/data/transactions/errors.yml +3 -0
  162. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +3 -0
  163. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +3 -0
  164. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +3 -0
  165. data/spec/spec_tests/data/transactions/insert.yml +3 -0
  166. data/spec/spec_tests/data/transactions/isolation.yml +3 -0
  167. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1671 -0
  168. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +347 -0
  169. data/spec/spec_tests/data/transactions/pin-mongos.yml +557 -0
  170. data/spec/spec_tests/data/transactions/read-concern.yml +3 -0
  171. data/spec/spec_tests/data/transactions/read-pref.yml +3 -0
  172. data/spec/spec_tests/data/transactions/reads.yml +3 -0
  173. data/spec/spec_tests/data/transactions/retryable-abort.yml +5 -2
  174. data/spec/spec_tests/data/transactions/retryable-commit.yml +4 -1
  175. data/spec/spec_tests/data/transactions/retryable-writes.yml +3 -0
  176. data/spec/spec_tests/data/transactions/run-command.yml +3 -0
  177. data/spec/spec_tests/data/transactions/transaction-options.yml +6 -0
  178. data/spec/spec_tests/data/transactions/update.yml +3 -8
  179. data/spec/spec_tests/data/transactions/write-concern.yml +348 -38
  180. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -0
  181. data/spec/spec_tests/data/transactions_api/callback-commits.yml +5 -0
  182. data/spec/spec_tests/data/transactions_api/callback-retry.yml +7 -2
  183. data/spec/spec_tests/data/transactions_api/commit-retry.yml +70 -15
  184. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +3 -0
  185. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +3 -0
  186. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +59 -109
  187. data/spec/spec_tests/data/transactions_api/commit.yml +5 -0
  188. data/spec/spec_tests/data/transactions_api/transaction-options.yml +10 -0
  189. data/spec/spec_tests/retryable_reads_spec.rb +5 -2
  190. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  191. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -3
  192. data/spec/spec_tests/sdam_spec.rb +2 -2
  193. data/spec/spec_tests/transactions_api_spec.rb +1 -67
  194. data/spec/spec_tests/transactions_spec.rb +2 -66
  195. data/spec/support/authorization.rb +4 -0
  196. data/spec/support/change_streams.rb +30 -10
  197. data/spec/support/change_streams/operation.rb +27 -0
  198. data/spec/support/client_registry.rb +44 -25
  199. data/spec/support/cluster_config.rb +25 -14
  200. data/spec/support/cluster_tools.rb +32 -10
  201. data/spec/support/command_monitoring.rb +1 -1
  202. data/spec/support/common_shortcuts.rb +30 -0
  203. data/spec/support/connection_string.rb +8 -3
  204. data/spec/support/constraints.rb +34 -0
  205. data/spec/support/crud.rb +31 -16
  206. data/spec/support/crud/context.rb +23 -0
  207. data/spec/support/crud/operation.rb +311 -14
  208. data/spec/support/crud/spec.rb +2 -1
  209. data/spec/support/crud/test.rb +24 -27
  210. data/spec/support/crud/test_base.rb +22 -0
  211. data/spec/support/crud/verifier.rb +15 -1
  212. data/spec/support/event_subscriber.rb +12 -0
  213. data/spec/support/sdam_formatter_integration.rb +12 -6
  214. data/spec/support/shared/server_selector.rb +10 -0
  215. data/spec/support/shared/session.rb +13 -12
  216. data/spec/support/spec_config.rb +32 -22
  217. data/spec/support/spec_setup.rb +2 -2
  218. data/spec/support/transactions.rb +87 -0
  219. data/spec/support/transactions/context.rb +33 -0
  220. data/spec/support/transactions/operation.rb +99 -349
  221. data/spec/support/transactions/spec.rb +1 -3
  222. data/spec/support/transactions/test.rb +110 -49
  223. data/spec/support/utils.rb +74 -1
  224. metadata +52 -10
  225. metadata.gz.sig +0 -0
  226. data/spec/support/crud/read.rb +0 -265
  227. data/spec/support/crud/write.rb +0 -284
@@ -13,6 +13,12 @@ require 'spec_helper'
13
13
  describe 'Retryable writes integration tests' do
14
14
  include PrimarySocket
15
15
 
16
+ require_wired_tiger_on_36
17
+
18
+ # These tests override server selector, which fails if there are multiple
19
+ # eligible servers as would be the case in a multi-shard sharded cluster
20
+ require_no_multi_shard
21
+
16
22
  before do
17
23
  authorized_collection.delete_many
18
24
  end
@@ -114,8 +120,8 @@ describe 'Retryable writes integration tests' do
114
120
  context 'when the selected server does not support retryable writes' do
115
121
 
116
122
  before do
117
- legacy_primary = double('legacy primary', :'retry_writes?' => false)
118
- allow(client.cluster).to receive(:next_primary).and_return(primary_server, legacy_primary)
123
+ legacy_primary = double('legacy primary', :retry_writes? => false)
124
+ expect(collection).to receive(:select_server).and_return(primary_server, legacy_primary)
119
125
  expect(primary_socket).to receive(:write).and_raise(error)
120
126
  end
121
127
 
@@ -688,21 +694,4 @@ describe 'Retryable writes integration tests' do
688
694
 
689
695
  it_behaves_like 'an operation that does not support retryable writes'
690
696
  end
691
-
692
- context 'when the operation is database#command' do
693
-
694
- let(:operation) do
695
- collection.database.command(ping: 1)
696
- end
697
-
698
- let(:expectation) do
699
- 0
700
- end
701
-
702
- let(:unsuccessful_retry_value) do
703
- 0
704
- end
705
-
706
- it_behaves_like 'an operation that does not support retryable writes'
707
- end
708
697
  end
@@ -7,7 +7,7 @@ describe 'SDAM error handling' do
7
7
 
8
8
  # These tests operate on specific servers, and don't work in a multi
9
9
  # shard cluster where multiple servers are equally eligible
10
- require_topology :replica_set
10
+ require_no_multi_shard
11
11
 
12
12
  let(:client) { authorized_client_without_any_retries }
13
13
 
@@ -17,7 +17,7 @@ describe 'SDAM events' do
17
17
  client.database.command(ismaster: 1)
18
18
  expect(subscriber.events).to be_empty
19
19
 
20
- client.close
20
+ client.close(true)
21
21
 
22
22
  expect(subscriber.events).not_to be_empty
23
23
  event = subscriber.first_event('server_closed_event')
@@ -35,7 +35,7 @@ describe 'SDAM events' do
35
35
  client.database.command(ismaster: 1)
36
36
  expect(subscriber.events).to be_empty
37
37
 
38
- client.close
38
+ client.close(true)
39
39
 
40
40
  expect(subscriber.events).not_to be_empty
41
41
  event = subscriber.first_event('topology_closed_event')
@@ -1,15 +1,21 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Server description' do
4
+ clean_slate
5
+
6
+ let(:client) { ClientRegistry.instance.global_client('authorized') }
7
+ let(:desc) do
8
+ client.cluster.next_primary.description
9
+ end
10
+
11
+ let!(:start_time) { Time.now }
12
+
4
13
  describe '#op_time' do
5
14
  require_topology :replica_set
6
15
  min_server_fcv '3.4'
7
16
 
8
- let(:client) { ClientRegistry.instance.global_client('authorized') }
9
- let(:desc) { client.cluster.servers.first.description }
10
-
11
17
  it 'is set' do
12
- client.database.command(ismaster: 1)
18
+ expect(desc).not_to be_unknown
13
19
 
14
20
  expect(desc.op_time).to be_a(BSON::Timestamp)
15
21
  end
@@ -19,30 +25,21 @@ describe 'Server description' do
19
25
  require_topology :replica_set
20
26
  min_server_fcv '3.4'
21
27
 
22
- let(:client) { ClientRegistry.instance.global_client('authorized') }
23
- let(:desc) { client.cluster.servers.first.description }
24
-
25
28
  it 'is set' do
26
- client.database.command(ismaster: 1)
29
+ expect(desc).not_to be_unknown
27
30
 
28
31
  expect(desc.last_write_date).to be_a(Time)
29
32
  end
30
33
  end
31
34
 
32
35
  describe '#last_update_time' do
33
- before do
34
- ClientRegistry.instance.close_all_clients
35
- end
36
-
37
- let(:client) { ClientRegistry.instance.global_client('authorized') }
38
- let(:desc) { client.cluster.next_primary.description }
39
36
 
40
37
  it 'is set' do
41
- client.database.command(ismaster: 1)
38
+ expect(desc).not_to be_unknown
42
39
 
43
40
  expect(desc.last_update_time).to be_a(Time)
44
- # checked in the last 3 seconds
45
- expect(Time.now - desc.last_update_time < 3).to be true
41
+ # checked while this test was running
42
+ expect(desc.last_update_time).to be > start_time
46
43
  end
47
44
  end
48
45
  end
@@ -6,6 +6,10 @@ describe 'Server selector' do
6
6
  let(:cluster) { client.cluster }
7
7
 
8
8
  describe '#select_server' do
9
+ # These tests operate on specific servers, and don't work in a multi
10
+ # shard cluster where multiple servers are equally eligible
11
+ require_no_multi_shard
12
+
9
13
  let(:result) { selector.select_server(cluster) }
10
14
 
11
15
  it 'selects' do
@@ -13,7 +17,7 @@ describe 'Server selector' do
13
17
  end
14
18
 
15
19
  context 'no servers in the cluster' do
16
- let(:client) { Mongo::Client.new([], server_selection_timeout: 2) }
20
+ let(:client) { new_local_client_nmio([], server_selection_timeout: 2) }
17
21
 
18
22
  it 'raises NoServerAvailable with a message explaining the situation' do
19
23
  expect do
@@ -35,7 +39,7 @@ describe 'Server selector' do
35
39
  context 'there is a known primary' do
36
40
  before do
37
41
  client.cluster.next_primary
38
- client.close
42
+ client.close(true)
39
43
  expect(client.cluster.connected?).to be false
40
44
  end
41
45
 
@@ -47,7 +51,7 @@ describe 'Server selector' do
47
51
  context 'there is no known primary' do
48
52
  before do
49
53
  primary_server = client.cluster.next_primary
50
- client.close
54
+ client.close(true)
51
55
  expect(client.cluster.connected?).to be false
52
56
  primary_server.unknown!
53
57
  end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Server' do
4
+ let(:client) { authorized_client }
5
+
6
+ let(:server) { client.cluster.next_primary }
7
+
8
+ let(:collection) { client['collection'] }
9
+ let(:view) { Mongo::Collection::View.new(collection) }
10
+
11
+ describe 'operations when client/cluster are disconnected' do
12
+ # Server versions lower than 3.4 use the legacy find result
13
+ min_server_fcv '3.4'
14
+
15
+ context 'normal server' do
16
+ it 'can be used for reads' do
17
+ result = view.send(:send_initial_query, server)
18
+ expect(result).to be_a(Mongo::Operation::Find::Result)
19
+ end
20
+ end
21
+
22
+ context 'known server in disconnected cluster' do
23
+ before do
24
+ client.close
25
+ expect(server).not_to be_unknown
26
+ end
27
+
28
+ it 'can be used for reads' do
29
+ result = view.send(:send_initial_query, server)
30
+ expect(result).to be_a(Mongo::Operation::Find::Result)
31
+ end
32
+ end
33
+
34
+ context 'unknown server in disconnected cluster' do
35
+ before do
36
+ client.close
37
+ server.unknown!
38
+ expect(server).to be_unknown
39
+ end
40
+
41
+ it 'can be used for reads' do
42
+ result = view.send(:send_initial_query, server)
43
+ # Driver falls back to the oldest MongoDB protocol
44
+ expect(result).to be_a(Mongo::Operation::Find::Legacy::Result)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -19,7 +19,7 @@ describe 'SSL connections with URI options' do
19
19
  end
20
20
 
21
21
  it 'successfully connects and runs an operation' do
22
- client = Mongo::Client.new(uri)
22
+ client = new_local_client(uri)
23
23
  expect { client[:foo].count_documents({}) }.not_to raise_error
24
24
  end
25
25
  end
@@ -3,12 +3,19 @@ require 'spec_helper'
3
3
  describe 'Step down behavior' do
4
4
  require_topology :replica_set
5
5
 
6
- =begin Uncommenting this will reduce the runtime of the test, but the spec currently does not allow us to do it
6
+ # This setup reduces the runtime of the test and makes execution more
7
+ # reliable. The spec as written requests a simple brute force step down,
8
+ # but this causes intermittent failures.
7
9
  before(:all) do
8
10
  # These before/after blocks are run even if the tests themselves are
9
11
  # skipped due to server version not being appropriate
10
12
  if ClusterConfig.instance.fcv_ish >= '4.2' && ClusterConfig.instance.topology == :replica_set
11
- ClusterTools.instance.set_election_timeout(1)
13
+ # It seems that a short election timeout can cause unintended elections,
14
+ # which makes the server close connections which causes the driver to
15
+ # reconnect which then fails the step down test.
16
+ # The election timeout here is greater than the catch up period and
17
+ # step down timeout specified in cluster tools.
18
+ ClusterTools.instance.set_election_timeout(5)
12
19
  ClusterTools.instance.set_election_handoff(false)
13
20
  end
14
21
  end
@@ -20,7 +27,6 @@ describe 'Step down behavior' do
20
27
  ClusterTools.instance.reset_priorities
21
28
  end
22
29
  end
23
- =end
24
30
 
25
31
  let(:event_subscriber) { EventSubscriber.new }
26
32
 
@@ -70,7 +76,7 @@ describe 'Step down behavior' do
70
76
  expect(connection_created_events).not_to be_empty
71
77
 
72
78
  current_primary = subscribed_client.cluster.next_primary
73
- ClusterTools.instance.force_step_down
79
+ ClusterTools.instance.change_primary
74
80
 
75
81
  EventSubscriber.clear_events!
76
82
 
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'Transactions examples' do
4
+ require_wired_tiger
4
5
  require_transaction_support
5
6
 
6
7
  let(:hr) do
@@ -44,8 +45,8 @@ describe 'Transactions examples' do
44
45
  session.commit_transaction
45
46
  puts 'Transaction committed.'
46
47
  rescue Mongo::Error => e
47
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
48
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation..."
48
+ if e.label?('UnknownTransactionCommitResult')
49
+ puts "UnknownTransactionCommitResult, retrying commit operation..."
49
50
  retry
50
51
  else
51
52
  puts 'Error during commit ...'
@@ -80,9 +81,9 @@ describe 'Transactions examples' do
80
81
  rescue Mongo::Error => e
81
82
 
82
83
  puts 'Transaction aborted. Caught exception during transaction.'
83
- raise unless e.label?(Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL)
84
+ raise unless e.label?('TransientTransactionError')
84
85
 
85
- puts "#{Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL}, retrying transaction ..."
86
+ puts "TransientTransactionError, retrying transaction ..."
86
87
  retry
87
88
  end
88
89
  end
@@ -110,8 +111,8 @@ describe 'Transactions examples' do
110
111
  session.commit_transaction
111
112
  puts 'Transaction committed.'
112
113
  rescue Mongo::Error=> e
113
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
114
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation..."
114
+ if e.label?('UnknownTransactionCommitResult')
115
+ puts "UnknownTransactionCommitResult, retrying commit operation..."
115
116
  retry
116
117
  else
117
118
  puts 'Error during commit ...'
@@ -154,8 +155,8 @@ describe 'Transactions examples' do
154
155
  yield session # performs transaction
155
156
  rescue Mongo::Error => e
156
157
  puts 'Transaction aborted. Caught exception during transaction.'
157
- raise unless e.label?(Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL)
158
- puts "#{Mongo::Error::TRANSIENT_TRANSACTION_ERROR_LABEL}, retrying transaction ..."
158
+ raise unless e.label?('TransientTransactionError')
159
+ puts "TransientTransactionError, retrying transaction ..."
159
160
  retry
160
161
  end
161
162
  end
@@ -165,8 +166,8 @@ describe 'Transactions examples' do
165
166
  session.commit_transaction
166
167
  puts 'Transaction committed.'
167
168
  rescue Mongo::Error => e
168
- if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
169
- puts "#{Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL}, retrying commit operation ..."
169
+ if e.label?('UnknownTransactionCommitResult')
170
+ puts "UnknownTransactionCommitResult, retrying commit operation ..."
170
171
  retry
171
172
  else
172
173
  puts 'Error during commit ...'
@@ -1,24 +1,27 @@
1
1
  COVERAGE_MIN = 90
2
2
  CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
3
- SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam/**/*.yml")
4
- SDAM_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam_monitoring/*.yml")
5
- SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection_rtt/*.yml")
6
- SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection/**/*.yml")
7
- MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/max_staleness/**/*.yml")
8
- CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud/**/*.yml")
9
- RETRYABLE_WRITES_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_writes/**/*.yml")
3
+
4
+ SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam/**/*.yml").sort
5
+ SDAM_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/sdam_monitoring/*.yml").sort
6
+ SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection_rtt/*.yml").sort
7
+ SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_selection/**/*.yml").sort
8
+ MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/max_staleness/**/*.yml").sort
9
+ CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud/**/*.yml").sort
10
+ CRUD2_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud_v2/**/*.yml").sort
11
+ RETRYABLE_WRITES_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_writes/**/*.yml").sort
10
12
  RETRYABLE_READS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_reads/**/*.yml").sort
11
- COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml")
12
- CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml")
13
- URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml")
14
- DNS_SEEDLIST_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/dns_seedlist_discovery/*.yml")
15
- GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml")
16
- TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml")
17
- TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml")
18
- CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml")
19
- CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml")
13
+ COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml").sort
14
+ CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml").sort
15
+ URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml").sort
16
+ DNS_SEEDLIST_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/dns_seedlist_discovery/*.yml").sort
17
+ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml").sort
18
+ TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml").sort
19
+ TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml").sort
20
+ CHANGE_STREAMS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/change_streams/*.yml").sort
21
+ CMAP_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/cmap/*.yml").sort
20
22
 
21
23
  require 'mongo'
24
+ require 'pp'
22
25
 
23
26
  unless ENV['CI']
24
27
  begin
@@ -1,11 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
+ # This test should set cleanup: false on all clients, because due to
4
+ # https://jira.mongodb.org/browse/RUBY-1772 we may be getting connections
5
+ # established after the client is closed which screws up our assertions on
6
+ # the auth calls. When 1772 is fixed, the cleanup should happen on existing
7
+ # connections and thus should no longer interfere with auth assertions.
8
+
3
9
  describe 'SCRAM-SHA auth mechanism negotiation' do
4
10
  min_server_fcv '4.0'
5
-
6
- before(:all) do
7
- ClientRegistry.instance.close_all_clients
8
- end
11
+ clean_slate
9
12
 
10
13
  URI_OPTION_MAP = {
11
14
  :auth_source => 'authsource',
@@ -13,7 +16,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
13
16
  }
14
17
 
15
18
  let(:create_user!) do
16
- ClientRegistry.instance.global_client('root_authorized_admin').tap do |client|
19
+ root_authorized_admin_client.tap do |client|
17
20
  users = client.database.users
18
21
  if users.info(user.name).any?
19
22
  users.remove(user.name)
@@ -24,7 +27,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
24
27
  roles: ['root'],
25
28
  mechanisms: server_user_auth_mechanisms,
26
29
  )
27
- client.close
30
+ client.close(true)
28
31
  end
29
32
  end
30
33
 
@@ -49,7 +52,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
49
52
 
50
53
  new_local_client(
51
54
  SpecConfig.instance.addresses,
52
- SpecConfig.instance.test_options.merge(opts)
55
+ SpecConfig.instance.test_options.merge(opts).update(cleanup: false)
53
56
  )
54
57
  end
55
58
 
@@ -332,7 +335,7 @@ describe 'SCRAM-SHA auth mechanism negotiation' do
332
335
  end
333
336
 
334
337
  let(:client) do
335
- new_local_client(uri, SpecConfig.instance.ssl_options)
338
+ new_local_client(uri, SpecConfig.instance.ssl_options.merge(cleanup: false))
336
339
  end
337
340
 
338
341
  context 'when the user exists' do
@@ -150,8 +150,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
150
150
  [
151
151
  {
152
152
  replace_one: [
153
- { 'q' => { _id: 0 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false },
154
- { 'q' => { _id: 1 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false }
153
+ { 'q' => { _id: 0 }, 'u' => { name: 'test' }, },
154
+ { 'q' => { _id: 1 }, 'u' => { name: 'test' }, },
155
155
  ]
156
156
  }
157
157
  ]
@@ -192,8 +192,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
192
192
  [
193
193
  {
194
194
  update_one: [
195
- { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
196
- { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
195
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, },
196
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, },
197
197
  ]
198
198
  }
199
199
  ]
@@ -234,8 +234,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
234
234
  [
235
235
  {
236
236
  update_many: [
237
- { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
238
- { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
237
+ { 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, },
238
+ { 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, },
239
239
  ]
240
240
  }
241
241
  ]