mongo 2.8.0 → 2.9.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 (276) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +12 -0
  5. data/lib/mongo.rb +15 -1
  6. data/lib/mongo/address/ipv6.rb +0 -2
  7. data/lib/mongo/auth/scram/conversation.rb +0 -3
  8. data/lib/mongo/bulk_write/result_combiner.rb +12 -2
  9. data/lib/mongo/client.rb +59 -6
  10. data/lib/mongo/cluster.rb +19 -8
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +0 -2
  12. data/lib/mongo/cluster/reapers/socket_reaper.rb +12 -9
  13. data/lib/mongo/collection.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation.rb +5 -1
  15. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  16. data/lib/mongo/collection/view/change_stream.rb +30 -10
  17. data/lib/mongo/collection/view/iterable.rb +13 -6
  18. data/lib/mongo/collection/view/map_reduce.rb +12 -10
  19. data/lib/mongo/collection/view/readable.rb +19 -14
  20. data/lib/mongo/cursor.rb +12 -8
  21. data/lib/mongo/database.rb +10 -7
  22. data/lib/mongo/database/view.rb +18 -11
  23. data/lib/mongo/error.rb +2 -2
  24. data/lib/mongo/error/connection_check_out_timeout.rb +49 -0
  25. data/lib/mongo/error/operation_failure.rb +9 -9
  26. data/lib/mongo/error/parser.rb +25 -3
  27. data/lib/mongo/error/pool_closed_error.rb +43 -0
  28. data/lib/mongo/error/sdam_error_detection.rb +18 -0
  29. data/lib/mongo/grid/file/chunk.rb +0 -2
  30. data/lib/mongo/grid/fs_bucket.rb +26 -12
  31. data/lib/mongo/grid/stream/read.rb +36 -21
  32. data/lib/mongo/index/view.rb +11 -7
  33. data/lib/mongo/logger.rb +0 -2
  34. data/lib/mongo/monitoring.rb +31 -0
  35. data/lib/mongo/monitoring/cmap_log_subscriber.rb +53 -0
  36. data/lib/mongo/monitoring/event.rb +1 -0
  37. data/lib/mongo/monitoring/event/cmap.rb +25 -0
  38. data/lib/mongo/monitoring/event/cmap/base.rb +28 -0
  39. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +78 -0
  40. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +56 -0
  41. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +63 -0
  42. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +64 -0
  43. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +103 -0
  44. data/lib/mongo/monitoring/event/cmap/connection_created.rb +64 -0
  45. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +64 -0
  46. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +57 -0
  47. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +57 -0
  48. data/lib/mongo/monitoring/event/cmap/pool_created.rb +63 -0
  49. data/lib/mongo/monitoring/event/command_started.rb +12 -3
  50. data/lib/mongo/monitoring/publishable.rb +10 -2
  51. data/lib/mongo/operation.rb +0 -1
  52. data/lib/mongo/operation/find/legacy/result.rb +1 -0
  53. data/lib/mongo/operation/list_collections/result.rb +7 -1
  54. data/lib/mongo/operation/result.rb +10 -1
  55. data/lib/mongo/operation/shared/executable.rb +15 -0
  56. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +29 -0
  57. data/lib/mongo/operation/shared/specifiable.rb +0 -16
  58. data/lib/mongo/operation/update/legacy/result.rb +1 -0
  59. data/lib/mongo/protocol/compressed.rb +0 -2
  60. data/lib/mongo/protocol/msg.rb +25 -2
  61. data/lib/mongo/retryable.rb +171 -33
  62. data/lib/mongo/server.rb +26 -7
  63. data/lib/mongo/server/app_metadata.rb +0 -2
  64. data/lib/mongo/server/connectable.rb +8 -2
  65. data/lib/mongo/server/connection.rb +83 -13
  66. data/lib/mongo/server/connection_base.rb +1 -1
  67. data/lib/mongo/server/connection_pool.rb +439 -43
  68. data/lib/mongo/server/monitor/connection.rb +4 -1
  69. data/lib/mongo/session.rb +37 -5
  70. data/lib/mongo/session/session_pool.rb +2 -2
  71. data/lib/mongo/socket.rb +0 -2
  72. data/lib/mongo/socket/ssl.rb +0 -2
  73. data/lib/mongo/uri.rb +127 -66
  74. data/lib/mongo/uri/srv_protocol.rb +35 -13
  75. data/lib/mongo/version.rb +1 -1
  76. data/spec/README.md +190 -63
  77. data/spec/integration/change_stream_spec.rb +64 -0
  78. data/spec/integration/command_spec.rb +0 -7
  79. data/spec/integration/error_detection_spec.rb +39 -0
  80. data/spec/integration/read_concern.rb +83 -0
  81. data/spec/integration/retryable_writes_spec.rb +6 -50
  82. data/spec/integration/sdam_error_handling_spec.rb +60 -7
  83. data/spec/integration/ssl_uri_options_spec.rb +24 -0
  84. data/spec/integration/step_down_spec.rb +197 -0
  85. data/spec/lite_spec_helper.rb +4 -0
  86. data/spec/mongo/client_construction_spec.rb +42 -17
  87. data/spec/mongo/client_spec.rb +32 -1
  88. data/spec/mongo/cluster/socket_reaper_spec.rb +2 -2
  89. data/spec/mongo/cluster_spec.rb +36 -2
  90. data/spec/mongo/collection/view/aggregation_spec.rb +2 -0
  91. data/spec/mongo/collection/view/change_stream_spec.rb +28 -28
  92. data/spec/mongo/collection/view/readable_spec.rb +1 -1
  93. data/spec/mongo/collection/view_spec.rb +3 -1
  94. data/spec/mongo/cursor_spec.rb +5 -5
  95. data/spec/mongo/error/parser_spec.rb +61 -1
  96. data/spec/mongo/grid/stream/read_spec.rb +2 -2
  97. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +23 -0
  98. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +19 -0
  99. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +23 -0
  100. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +23 -0
  101. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +27 -0
  102. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +24 -0
  103. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +24 -0
  104. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +19 -0
  105. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +19 -0
  106. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +26 -0
  107. data/spec/mongo/operation/delete/bulk_spec.rb +1 -6
  108. data/spec/mongo/operation/delete/command_spec.rb +1 -1
  109. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  110. data/spec/mongo/operation/delete_spec.rb +4 -4
  111. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  112. data/spec/mongo/operation/insert/command_spec.rb +1 -1
  113. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  114. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  115. data/spec/mongo/operation/update/command_spec.rb +2 -2
  116. data/spec/mongo/operation/update/op_msg_spec.rb +2 -2
  117. data/spec/mongo/protocol/msg_spec.rb +11 -0
  118. data/spec/mongo/retryable_spec.rb +78 -25
  119. data/spec/mongo/server/connection_pool_spec.rb +661 -126
  120. data/spec/mongo/server/connection_spec.rb +55 -7
  121. data/spec/mongo/server_spec.rb +5 -0
  122. data/spec/mongo/uri/srv_protocol_spec.rb +135 -2
  123. data/spec/mongo/uri_option_parsing_spec.rb +511 -0
  124. data/spec/mongo/uri_spec.rb +42 -6
  125. data/spec/spec_helper.rb +1 -84
  126. data/spec/spec_tests/cmap_spec.rb +50 -0
  127. data/spec/spec_tests/command_monitoring_spec.rb +7 -18
  128. data/spec/spec_tests/crud_spec.rb +3 -49
  129. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +21 -0
  130. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +21 -0
  131. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +24 -0
  132. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +24 -0
  133. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +21 -0
  134. data/spec/spec_tests/data/cmap/pool-checkin.yml +18 -0
  135. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +13 -0
  136. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +28 -0
  137. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +34 -0
  138. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +31 -0
  139. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +29 -0
  140. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +26 -0
  141. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  142. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +56 -0
  143. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +27 -0
  144. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +20 -0
  145. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  146. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +94 -0
  147. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +41 -0
  148. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  149. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  150. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +149 -0
  151. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +61 -0
  152. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +149 -0
  153. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +65 -0
  154. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +153 -0
  155. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +61 -0
  156. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  157. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  158. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  159. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  160. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  161. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  162. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +148 -0
  163. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount.yml +62 -0
  164. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  165. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  166. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  167. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  168. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  169. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  170. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  171. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  172. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  173. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  174. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  175. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  176. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  177. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  178. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  179. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  180. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  181. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  182. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  183. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  184. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  185. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  186. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  187. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  188. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +60 -0
  189. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +10 -7
  190. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +15 -22
  191. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  192. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +8 -7
  193. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +5 -8
  194. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +8 -7
  195. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +5 -8
  196. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +8 -7
  197. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +5 -8
  198. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +8 -7
  199. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +5 -8
  200. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +8 -7
  201. data/spec/spec_tests/data/retryable_writes/insertMany.yml +5 -8
  202. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +10 -45
  203. data/spec/spec_tests/data/retryable_writes/insertOne.yml +5 -8
  204. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +8 -7
  205. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +5 -8
  206. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  207. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +8 -7
  208. data/spec/spec_tests/data/retryable_writes/updateOne.yml +5 -14
  209. data/spec/spec_tests/data/transactions/abort.yml +7 -2
  210. data/spec/spec_tests/data/transactions/bulk.yml +7 -2
  211. data/spec/spec_tests/data/transactions/causal-consistency.yml +11 -4
  212. data/spec/spec_tests/data/transactions/commit.yml +11 -4
  213. data/spec/spec_tests/data/transactions/count.yml +64 -0
  214. data/spec/spec_tests/data/transactions/delete.yml +7 -2
  215. data/spec/spec_tests/data/transactions/error-labels.yml +8 -2
  216. data/spec/spec_tests/data/transactions/errors.yml +7 -2
  217. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +7 -2
  218. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +7 -2
  219. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +7 -2
  220. data/spec/spec_tests/data/transactions/insert.yml +9 -2
  221. data/spec/spec_tests/data/transactions/isolation.yml +7 -2
  222. data/spec/spec_tests/data/transactions/read-concern.yml +15 -6
  223. data/spec/spec_tests/data/transactions/read-pref.yml +7 -2
  224. data/spec/spec_tests/data/transactions/reads.yml +8 -48
  225. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -2
  226. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -2
  227. data/spec/spec_tests/data/transactions/retryable-writes.yml +7 -2
  228. data/spec/spec_tests/data/transactions/run-command.yml +7 -2
  229. data/spec/spec_tests/data/transactions/transaction-options.yml +7 -2
  230. data/spec/spec_tests/data/transactions/update.yml +7 -2
  231. data/spec/spec_tests/data/transactions/write-concern.yml +7 -2
  232. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +6 -1
  233. data/spec/spec_tests/data/transactions_api/callback-commits.yml +6 -1
  234. data/spec/spec_tests/data/transactions_api/callback-retry.yml +6 -1
  235. data/spec/spec_tests/data/transactions_api/commit-retry.yml +6 -1
  236. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +6 -3
  237. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +6 -1
  238. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +6 -1
  239. data/spec/spec_tests/data/transactions_api/commit.yml +6 -1
  240. data/spec/spec_tests/data/transactions_api/transaction-options.yml +6 -1
  241. data/spec/spec_tests/retryable_reads_spec.rb +11 -0
  242. data/spec/spec_tests/retryable_writes_spec.rb +4 -69
  243. data/spec/spec_tests/transactions_api_spec.rb +42 -37
  244. data/spec/spec_tests/transactions_spec.rb +42 -33
  245. data/spec/support/authorization.rb +12 -0
  246. data/spec/support/change_streams/operation.rb +1 -1
  247. data/spec/support/client_registry.rb +20 -0
  248. data/spec/support/cluster_config.rb +16 -15
  249. data/spec/support/cluster_tools.rb +346 -0
  250. data/spec/support/cmap.rb +367 -0
  251. data/spec/support/cmap/verifier.rb +46 -0
  252. data/spec/support/command_monitoring.rb +4 -6
  253. data/spec/support/common_shortcuts.rb +6 -0
  254. data/spec/support/connection_string.rb +2 -2
  255. data/spec/support/crud.rb +171 -184
  256. data/spec/support/crud/operation.rb +43 -0
  257. data/spec/support/crud/outcome.rb +53 -0
  258. data/spec/support/crud/read.rb +102 -12
  259. data/spec/support/crud/requirement.rb +69 -0
  260. data/spec/support/crud/spec.rb +68 -0
  261. data/spec/support/crud/test.rb +141 -0
  262. data/spec/support/crud/verifier.rb +96 -18
  263. data/spec/support/crud/write.rb +18 -3
  264. data/spec/support/event_subscriber.rb +15 -0
  265. data/spec/support/primary_socket.rb +2 -2
  266. data/spec/support/spec_config.rb +89 -20
  267. data/spec/support/transactions.rb +2 -306
  268. data/spec/support/transactions/operation.rb +7 -7
  269. data/spec/support/transactions/spec.rb +28 -0
  270. data/spec/support/transactions/test.rb +191 -0
  271. data/spec/support/utils.rb +123 -0
  272. metadata +202 -9
  273. metadata.gz.sig +0 -0
  274. data/lib/mongo/server/connection_pool/queue.rb +0 -359
  275. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -353
  276. data/spec/support/transactions/verifier.rb +0 -97
@@ -25,9 +25,9 @@ describe 'Retryable writes integration tests' do
25
25
 
26
26
  let(:primary_connection) do
27
27
  client.database.command(ping: 1)
28
- expect(primary_server.pool.send(:queue).pool_size).to eq(1)
29
- expect(primary_server.pool.send(:queue).queue_size).to eq(1)
30
- primary_server.pool.send(:queue).queue.first
28
+ expect(primary_server.pool.size).to eq(1)
29
+ expect(primary_server.pool.available_count).to eq(1)
30
+ primary_server.pool.instance_variable_get('@available_connections').last
31
31
  end
32
32
 
33
33
  shared_examples_for 'an operation that is retried' do
@@ -284,7 +284,7 @@ describe 'Retryable writes integration tests' do
284
284
  end
285
285
 
286
286
  let!(:collection) do
287
- client[TEST_COLL, write: SpecConfig.instance.write_concern]
287
+ client[TEST_COLL]
288
288
  end
289
289
 
290
290
  before do
@@ -341,7 +341,7 @@ describe 'Retryable writes integration tests' do
341
341
  context 'when the collection has write concern acknowledged' do
342
342
 
343
343
  let!(:collection) do
344
- client[TEST_COLL, write: SpecConfig.instance.write_concern]
344
+ client[TEST_COLL, write: {w: :majority}]
345
345
  end
346
346
 
347
347
  it_behaves_like 'operation that is retried when server supports retryable writes'
@@ -355,15 +355,6 @@ describe 'Retryable writes integration tests' do
355
355
 
356
356
  it_behaves_like 'an operation that is not retried'
357
357
  end
358
-
359
- context 'when the collection has write concern not set' do
360
-
361
- let!(:collection) do
362
- client[TEST_COLL]
363
- end
364
-
365
- it_behaves_like 'operation that is retried when server supports retryable writes'
366
- end
367
358
  end
368
359
 
369
360
  context 'when the client has retry_writes set to false' do
@@ -375,42 +366,7 @@ describe 'Retryable writes integration tests' do
375
366
  context 'when the collection has write concern acknowledged' do
376
367
 
377
368
  let!(:collection) do
378
- client[TEST_COLL, write: SpecConfig.instance.write_concern]
379
- end
380
-
381
- it_behaves_like 'an operation that is not retried'
382
- end
383
-
384
- context 'when the collection has write concern unacknowledged' do
385
-
386
- let!(:collection) do
387
- client[TEST_COLL, write: { w: 0 }]
388
- end
389
-
390
- it_behaves_like 'an operation that is not retried'
391
- end
392
-
393
- context 'when the collection has write concern not set' do
394
-
395
- let!(:collection) do
396
- client[TEST_COLL]
397
- end
398
-
399
- it_behaves_like 'an operation that is not retried'
400
- end
401
- end
402
-
403
- context 'when the client has retry_writes not set' do
404
- require_no_retry_writes
405
-
406
- let!(:client) do
407
- authorized_client
408
- end
409
-
410
- context 'when the collection has write concern acknowledged' do
411
-
412
- let!(:collection) do
413
- client[TEST_COLL, write: SpecConfig.instance.write_concern]
369
+ client[TEST_COLL, write: {w: :majority}]
414
370
  end
415
371
 
416
372
  it_behaves_like 'an operation that is not retried'
@@ -6,7 +6,7 @@ describe 'SDAM error handling' do
6
6
  end
7
7
 
8
8
  describe 'when there is an error during an operation' do
9
- let(:client) { authorized_client }
9
+ let(:client) { authorized_client_without_any_retries }
10
10
 
11
11
  before do
12
12
  wait_for_all_servers(client.cluster)
@@ -58,6 +58,47 @@ describe 'SDAM error handling' do
58
58
  end
59
59
  end
60
60
 
61
+ shared_examples_for 'clears connection pool' do
62
+ it 'clears connection pool' do
63
+ generation = server.pool.generation
64
+ operation
65
+ new_generation = server.pool.generation
66
+ expect(new_generation).to eq(generation + 1)
67
+ end
68
+ end
69
+
70
+ shared_examples_for 'does not clear connection pool' do
71
+ it 'does not clear connection pool' do
72
+ generation = server.pool.generation
73
+ operation
74
+ new_generation = server.pool.generation
75
+ expect(new_generation).to eq(generation)
76
+ end
77
+ end
78
+
79
+ shared_examples_for 'not master or node recovering' do
80
+ it_behaves_like 'marks server unknown'
81
+ it_behaves_like 'requests server scan'
82
+
83
+ context 'server 4.2 or higher' do
84
+ min_server_fcv '4.2'
85
+
86
+ it_behaves_like 'does not clear connection pool'
87
+ end
88
+
89
+ context 'server 4.0 or lower' do
90
+ max_server_version '4.0'
91
+
92
+ it_behaves_like 'clears connection pool'
93
+ end
94
+ end
95
+
96
+ shared_examples_for 'node shutting down' do
97
+ it_behaves_like 'marks server unknown'
98
+ it_behaves_like 'requests server scan'
99
+ it_behaves_like 'clears connection pool'
100
+ end
101
+
61
102
  context 'not master error' do
62
103
  let(:exception_message) do
63
104
  /not master/
@@ -67,21 +108,31 @@ describe 'SDAM error handling' do
67
108
  make_not_master_reply
68
109
  end
69
110
 
70
- it_behaves_like 'marks server unknown'
71
- it_behaves_like 'requests server scan'
111
+ it_behaves_like 'not master or node recovering'
72
112
  end
73
113
 
74
- context 'node is recovering error' do
114
+ context 'node recovering error' do
75
115
  let(:exception_message) do
76
- /shutdown in progress/
116
+ /DueToStepDown/
77
117
  end
78
118
 
79
119
  let(:reply) do
80
120
  make_node_recovering_reply
81
121
  end
82
122
 
83
- it_behaves_like 'marks server unknown'
84
- it_behaves_like 'requests server scan'
123
+ it_behaves_like 'not master or node recovering'
124
+ end
125
+
126
+ context 'node shutting down error' do
127
+ let(:exception_message) do
128
+ /shutdown in progress/
129
+ end
130
+
131
+ let(:reply) do
132
+ make_node_shutting_down_reply
133
+ end
134
+
135
+ it_behaves_like 'node shutting down'
85
136
  end
86
137
 
87
138
  context 'network error' do
@@ -100,6 +151,7 @@ describe 'SDAM error handling' do
100
151
 
101
152
  it_behaves_like 'marks server unknown'
102
153
  it_behaves_like 'does not request server scan'
154
+ it_behaves_like 'clears connection pool'
103
155
  end
104
156
 
105
157
  context 'network timeout error' do
@@ -109,6 +161,7 @@ describe 'SDAM error handling' do
109
161
 
110
162
  it_behaves_like 'does not mark server unknown'
111
163
  it_behaves_like 'does not request server scan'
164
+ it_behaves_like 'does not clear connection pool'
112
165
  end
113
166
  end
114
167
  end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SSL connections with URI options' do
4
+ # SpecConfig currently creates clients exclusively through non-URI options. Because we don't
5
+ # currently have a way to create what the URI would look like for a given client, it's simpler
6
+ # just to test the that TLS works when configured from a URI on a standalone server without auth
7
+ # required, since that allows us to build the URI more easily.
8
+ require_no_auth
9
+ require_topology :single
10
+ require_ssl
11
+
12
+ let(:hosts) do
13
+ SpecConfig.instance.addresses.join(',')
14
+ end
15
+
16
+ let(:uri) do
17
+ "mongodb://#{hosts}/?tls=true&tlsInsecure=true&tlsCertificateKeyFile=#{SpecConfig.instance.client_cert_key_pem}"
18
+ end
19
+
20
+ it 'successfully connects and runs an operation' do
21
+ client = Mongo::Client.new(uri)
22
+ expect { client[:foo].count_documents({}) }.not_to raise_error
23
+ end
24
+ end
@@ -0,0 +1,197 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Step down behavior' do
4
+ require_topology :replica_set
5
+
6
+ =begin Uncommenting this will reduce the runtime of the test, but the spec currently does not allow us to do it
7
+ before(:all) do
8
+ # These before/after blocks are run even if the tests themselves are
9
+ # skipped due to server version not being appropriate
10
+ if ClusterConfig.instance.fcv_ish >= '4.2' && ClusterConfig.instance.topology == :replica_set
11
+ ClusterTools.instance.set_election_timeout(1)
12
+ ClusterTools.instance.set_election_handoff(false)
13
+ end
14
+ end
15
+
16
+ after(:all) do
17
+ if ClusterConfig.instance.fcv_ish >= '4.2' && ClusterConfig.instance.topology == :replica_set
18
+ ClusterTools.instance.set_election_timeout(10)
19
+ ClusterTools.instance.set_election_handoff(true)
20
+ ClusterTools.instance.reset_priorities
21
+ end
22
+ end
23
+ =end
24
+
25
+ let(:event_subscriber) { EventSubscriber.new }
26
+
27
+ let(:test_client) do
28
+ authorized_client_without_any_retries.with(server_selection_timeout: 20).tap do |client|
29
+ client.subscribe(Mongo::Monitoring::CONNECTION_POOL, event_subscriber)
30
+ end
31
+ end
32
+
33
+ let(:collection) { test_client['step-down'].with(write: write_concern) }
34
+
35
+ let(:admin_support_client) do
36
+ ClientRegistry.instance.global_client('root_authorized').use('admin')
37
+ end
38
+
39
+ describe 'getMore iteration' do
40
+ min_server_fcv '4.2'
41
+
42
+ let(:subscribed_client) do
43
+ test_client.tap do |client|
44
+ client.subscribe(Mongo::Monitoring::COMMAND, EventSubscriber)
45
+ client.subscribe(Mongo::Monitoring::CONNECTION_POOL, EventSubscriber)
46
+ end
47
+ end
48
+
49
+ let(:collection) { subscribed_client['step-down'] }
50
+
51
+ before do
52
+ collection.insert_many([{test: 1}] * 100)
53
+ end
54
+
55
+ let(:view) { collection.find({test: 1}, batch_size: 10) }
56
+ let(:enum) { view.to_enum }
57
+
58
+ it 'continues through step down' do
59
+
60
+ subscribed_client.cluster.next_primary.pool.clear
61
+ event_subscriber.clear_events!
62
+
63
+ # get the first item
64
+ item = enum.next
65
+ expect(item['test']).to eq(1)
66
+
67
+ connection_created_events = EventSubscriber.published_events.select do |event|
68
+ event.is_a?(Mongo::Monitoring::Event::Cmap::ConnectionCreated)
69
+ end
70
+ expect(connection_created_events).not_to be_empty
71
+
72
+ current_primary = subscribed_client.cluster.next_primary
73
+ ClusterTools.instance.force_step_down
74
+
75
+ EventSubscriber.clear_events!
76
+
77
+ # exhaust the batch
78
+ 9.times do
79
+ enum.next
80
+ end
81
+
82
+ # this should issue a getMore
83
+ item = enum.next
84
+ expect(item['test']).to eq(1)
85
+
86
+ get_more_events = EventSubscriber.started_events.select do |event|
87
+ event.command['getMore']
88
+ end
89
+
90
+ expect(get_more_events.length).to eq(1)
91
+
92
+ # getMore should have been sent on the same connection as find
93
+ connection_created_events = EventSubscriber.published_events.select do |event|
94
+ event.is_a?(Mongo::Monitoring::Event::Cmap::ConnectionCreated)
95
+ end
96
+ expect(connection_created_events).to be_empty
97
+ end
98
+
99
+ after do
100
+ # The tests normally operate with a low server selection timeout,
101
+ # but since this test caused a cluster election we may need to wait
102
+ # longer for the cluster to reestablish itself.
103
+ # To keep all other tests' timeouts low, wait for primary to be
104
+ # elected at the end of this test
105
+ test_client.cluster.servers.each do |server|
106
+ server.unknown!
107
+ end
108
+ test_client.cluster.next_primary
109
+
110
+ # Since we are changing which server is primary, close all clients
111
+ # to prevent subsequent tests setting fail points on servers which
112
+ # are not primary
113
+ ClientRegistry.instance.close_all_clients
114
+ end
115
+ end
116
+
117
+ describe 'writes on connections' do
118
+ min_server_fcv '4.0'
119
+
120
+ let(:server) do
121
+ client = test_client.with(app_name: rand)
122
+ client['test'].insert_one(test: 1)
123
+ client.cluster.next_primary
124
+ end
125
+
126
+ let(:fail_point) do
127
+ { configureFailPoint: 'failCommand', data: {
128
+ # There is currently no way to turn write retries on not master
129
+ # errors off - therefore set the number of fails to 2
130
+ failCommands: ['insert'], errorCode: fail_point_code, }, mode: {times: 2} }
131
+ end
132
+
133
+ before do
134
+ collection.find
135
+ admin_support_client.command(fail_point)
136
+ end
137
+
138
+ after do
139
+ admin_support_client.command(configureFailPoint: 'failCommand', mode: 'off')
140
+ end
141
+
142
+ describe 'not master - 4.2' do
143
+ min_server_fcv '4.2'
144
+
145
+ let(:write_concern) { {:w => 1} }
146
+
147
+ # not master
148
+ let(:fail_point_code) { 10107 }
149
+
150
+ it 'keeps connection open' do
151
+ event_subscriber.clear_events!
152
+
153
+ expect do
154
+ collection.insert_one(test: 1)
155
+ end.to raise_error(Mongo::Error::OperationFailure, /10107/)
156
+
157
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(0)
158
+ end
159
+ end
160
+
161
+ describe 'not master - 4.0' do
162
+ max_server_version '4.0'
163
+
164
+ let(:write_concern) { {:w => 1} }
165
+
166
+ # not master
167
+ let(:fail_point_code) { 10107 }
168
+
169
+ it 'closes the connection' do
170
+ event_subscriber.clear_events!
171
+
172
+ expect do
173
+ collection.insert_one(test: 1)
174
+ end.to raise_error(Mongo::Error::OperationFailure, /10107/)
175
+
176
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1)
177
+ end
178
+ end
179
+
180
+ describe 'node shutting down' do
181
+ let(:write_concern) { {:w => 1} }
182
+
183
+ # interrupted at shutdown
184
+ let(:fail_point_code) { 11600 }
185
+
186
+ it 'closes the connection' do
187
+ event_subscriber.clear_events!
188
+
189
+ expect do
190
+ collection.insert_one(test: 1)
191
+ end.to raise_error(Mongo::Error::OperationFailure, /11600/)
192
+
193
+ expect(event_subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared).count).to eq(1)
194
+ end
195
+ end
196
+ end
197
+ end
@@ -7,6 +7,7 @@ SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/server_select
7
7
  MAX_STALENESS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/max_staleness/**/*.yml")
8
8
  CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/crud/**/*.yml")
9
9
  RETRYABLE_WRITES_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_writes/**/*.yml")
10
+ RETRYABLE_READS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_reads/**/*.yml").sort
10
11
  COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml")
11
12
  CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml")
12
13
  URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml")
@@ -15,6 +16,7 @@ GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml")
15
16
  TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml")
16
17
  TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml")
17
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")
18
20
 
19
21
  if ENV['DRIVERS_TOOLS']
20
22
  CLIENT_CERT_PEM = ENV['DRIVER_TOOLS_CLIENT_CERT_PEM']
@@ -68,6 +70,7 @@ require 'support/server_selection'
68
70
  require 'support/sdam_monitoring'
69
71
  require 'support/crud'
70
72
  require 'support/command_monitoring'
73
+ require 'support/cmap'
71
74
  require 'support/connection_string'
72
75
  require 'support/gridfs'
73
76
  require 'support/transactions'
@@ -77,6 +80,7 @@ require 'support/client_registry'
77
80
  require 'support/client_registry_macros'
78
81
  require 'support/json_ext_formatter'
79
82
  require 'support/sdam_formatter_integration'
83
+ require 'support/utils'
80
84
 
81
85
  if SpecConfig.instance.mri?
82
86
  require 'timeout_interrupt'