mongo 2.8.0 → 2.9.0.rc0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -155,18 +155,42 @@ describe Mongo::Client do
155
155
 
156
156
  context 'when providing options' do
157
157
 
158
- context 'when retry_writes is defined' do
158
+ context 'retry_writes option' do
159
+ let(:client) do
160
+ new_local_client_nmio(SpecConfig.instance.addresses, options)
161
+ end
159
162
 
160
- let(:options) do
161
- { retry_writes: true }
163
+ context 'when retry_writes is true' do
164
+
165
+ let(:options) do
166
+ { retry_writes: true }
167
+ end
168
+
169
+ it 'sets retry_writes to true' do
170
+ expect(client.options['retry_writes']).to be true
171
+ end
162
172
  end
163
173
 
164
- let(:client) do
165
- new_local_client_nmio(SpecConfig.instance.addresses, authorized_client.options.merge(options))
174
+ context 'when retry_writes is false' do
175
+
176
+ let(:options) do
177
+ { retry_writes: false }
178
+ end
179
+
180
+ it 'sets retry_writes to false' do
181
+ expect(client.options['retry_writes']).to be false
182
+ end
166
183
  end
167
184
 
168
- it 'sets the option' do
169
- expect(client.options['retry_writes']).to eq(options[:retry_writes])
185
+ context 'when retry_writes is not given' do
186
+
187
+ let(:options) do
188
+ { }
189
+ end
190
+
191
+ it 'sets retry_writes to true' do
192
+ expect(client.options['retry_writes']).to be true
193
+ end
170
194
  end
171
195
  end
172
196
 
@@ -501,7 +525,7 @@ describe Mongo::Client do
501
525
 
502
526
  let(:options) do
503
527
  {
504
- :min_pool_size => Mongo::Server::ConnectionPool::Queue::MAX_SIZE
528
+ :min_pool_size => Mongo::Server::ConnectionPool::DEFAULT_MAX_SIZE
505
529
  }
506
530
  end
507
531
 
@@ -630,7 +654,8 @@ describe Mongo::Client do
630
654
 
631
655
  let(:expected_options) do
632
656
  Mongo::Options::Redacted.new(:write => { :w => 3 },
633
- monitoring_io: false, :database => 'testdb')
657
+ monitoring_io: false, :database => 'testdb', retry_writes: true,
658
+ retry_reads: true)
634
659
  end
635
660
 
636
661
  it 'sets the options' do
@@ -731,7 +756,8 @@ describe Mongo::Client do
731
756
 
732
757
  let(:expected_options) do
733
758
  Mongo::Options::Redacted.new(:write => { :w => 3 },
734
- monitoring_io: false, :database => 'testdb')
759
+ monitoring_io: false, :database => 'testdb', retry_writes: true,
760
+ retry_reads: true)
735
761
  end
736
762
 
737
763
  it 'sets the options' do
@@ -751,7 +777,8 @@ describe Mongo::Client do
751
777
 
752
778
  let(:expected_options) do
753
779
  Mongo::Options::Redacted.new(:write => { :w => 4 },
754
- monitoring_io: false, :database => 'testdb')
780
+ monitoring_io: false, :database => 'testdb', retry_writes: true,
781
+ retry_reads: true)
755
782
  end
756
783
 
757
784
  it 'allows explicit options to take preference' do
@@ -987,16 +1014,14 @@ describe Mongo::Client do
987
1014
 
988
1015
  let(:new_options) do
989
1016
  Mongo::Options::Redacted.new(:read => { :mode => :primary },
990
- :write => { :w => 1 },
991
- monitoring_io: false,
992
- :database => SpecConfig.instance.test_db)
1017
+ :write => { :w => 1 }, monitoring_io: false,
1018
+ :database => SpecConfig.instance.test_db, retry_writes: true, retry_reads: true)
993
1019
  end
994
1020
 
995
1021
  let(:original_options) do
996
1022
  Mongo::Options::Redacted.new(:read => { :mode => :secondary },
997
- :write => { :w => 1 },
998
- monitoring_io: false,
999
- :database => SpecConfig.instance.test_db)
1023
+ :write => { :w => 1 }, monitoring_io: false,
1024
+ :database => SpecConfig.instance.test_db, retry_writes: true, retry_reads: true)
1000
1025
  end
1001
1026
 
1002
1027
  it 'returns a new client' do
@@ -193,6 +193,8 @@ describe Mongo::Client do
193
193
  )
194
194
  end
195
195
 
196
+ let(:default_options) { Mongo::Options::Redacted.new(retry_writes: true, retry_reads: true) }
197
+
196
198
  let(:options) do
197
199
  Mongo::Options::Redacted.new(:read => { :mode => :primary },
198
200
  :local_threshold => 0.010,
@@ -201,7 +203,7 @@ describe Mongo::Client do
201
203
  end
202
204
 
203
205
  let(:expected) do
204
- [client.cluster, options].hash
206
+ [client.cluster, default_options.merge(options)].hash
205
207
  end
206
208
 
207
209
  it 'returns a hash of the cluster and options' do
@@ -494,6 +496,35 @@ describe Mongo::Client do
494
496
  end
495
497
  end
496
498
 
499
+ [
500
+ [:max_read_retries, 1],
501
+ [:read_retry_interval, 5],
502
+ [:max_write_retries, 1],
503
+ ].each do |opt, default|
504
+ describe "##{opt}" do
505
+ let(:client_options) { {} }
506
+
507
+ let(:client) do
508
+ Mongo::Client.new(['127.0.0.1:27017'], {monitoring_io: false}.update(client_options))
509
+ end
510
+
511
+ it "defaults to #{default}" do
512
+ expect(default).not_to be nil
513
+ expect(client.options[opt]).to be nil
514
+ expect(client.send(opt)).to eq(default)
515
+ end
516
+
517
+ context 'specified on client' do
518
+ let(:client_options) { {opt => 2} }
519
+
520
+ it 'inherits from client' do
521
+ expect(client.options[opt]).to eq(2)
522
+ expect(client.send(opt)).to eq(2)
523
+ end
524
+ end
525
+ end
526
+ end
527
+
497
528
  describe '#database_names' do
498
529
 
499
530
  it 'returns a list of database names' do
@@ -21,11 +21,11 @@ describe Mongo::Cluster::SocketReaper do
21
21
 
22
22
  before do
23
23
  cluster.servers.each do |s|
24
- expect(s.pool).to receive(:close_stale_sockets!).and_call_original
24
+ expect(s.pool).to receive(:close_idle_sockets).and_call_original
25
25
  end
26
26
  end
27
27
 
28
- it 'calls close_stale_sockets on each connection pool in the cluster' do
28
+ it 'calls close_idle_sockets on each connection pool in the cluster' do
29
29
  reaper.execute
30
30
  end
31
31
  end
@@ -640,14 +640,48 @@ describe Mongo::Cluster do
640
640
  end
641
641
  end
642
642
 
643
+ [
644
+ [:max_read_retries, 1],
645
+ [:read_retry_interval, 5],
646
+ ].each do |opt, default|
647
+ describe "##{opt}" do
648
+ let(:client_options) { {} }
649
+
650
+ let(:client) do
651
+ Mongo::Client.new(['127.0.0.1:27017'], {monitoring_io: false}.update(client_options))
652
+ end
653
+
654
+ let(:cluster) do
655
+ client.cluster
656
+ end
657
+
658
+ it "defaults to #{default}" do
659
+ expect(default).not_to be nil
660
+ expect(client.options[opt]).to be nil
661
+ expect(cluster.send(opt)).to eq(default)
662
+ end
663
+
664
+ context 'specified on client' do
665
+ let(:client_options) { {opt => 2} }
666
+
667
+ it 'inherits from client' do
668
+ expect(client.options[opt]).to eq(2)
669
+ expect(cluster.send(opt)).to eq(2)
670
+ end
671
+ end
672
+ end
673
+ end
674
+
643
675
  describe '#summary' do
676
+ let(:default_address) { SpecConfig.instance.addresses.first }
677
+
644
678
  context 'cluster has unknown servers' do
645
679
  it 'includes unknown servers' do
646
680
  cluster.servers_list.each do |server|
647
681
  expect(server).to be_unknown
648
682
  end
649
683
 
650
- expect(cluster.summary).to match(/Server address=localhost/)
684
+ expect(cluster.summary).to match(/Server address=#{default_address}/)
651
685
  end
652
686
  end
653
687
 
@@ -664,7 +698,7 @@ describe Mongo::Cluster do
664
698
  expect(server).not_to be_unknown
665
699
  end
666
700
 
667
- expect(cluster.summary).to match(/Server address=localhost/)
701
+ expect(cluster.summary).to match(/Server address=#{default_address}/)
668
702
  end
669
703
  end
670
704
  end
@@ -219,6 +219,8 @@ describe Mongo::Collection::View::Aggregation do
219
219
  end
220
220
 
221
221
  describe '#explain' do
222
+ # Broken on 4.2 - https://jira.mongodb.org/browse/RUBY-1788
223
+ max_server_version '4.0'
222
224
 
223
225
  it 'executes an explain' do
224
226
  expect(aggregation.explain).to_not be_empty
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  describe Mongo::Collection::View::ChangeStream do
4
4
  min_server_fcv '3.6'
5
5
  require_topology :replica_set
6
+ max_example_run_time 7
6
7
 
7
8
  let(:pipeline) do
8
9
  []
@@ -16,8 +17,16 @@ describe Mongo::Collection::View::ChangeStream do
16
17
  {}
17
18
  end
18
19
 
20
+ let(:client) do
21
+ authorized_client_without_any_retry_reads
22
+ end
23
+
24
+ let(:collection) do
25
+ client['mcv-change-stream']
26
+ end
27
+
19
28
  let(:view) do
20
- Mongo::Collection::View.new(authorized_collection, {}, view_options)
29
+ Mongo::Collection::View.new(collection, {}, view_options)
21
30
  end
22
31
 
23
32
  let(:change_stream) do
@@ -30,8 +39,8 @@ describe Mongo::Collection::View::ChangeStream do
30
39
  end
31
40
 
32
41
  let!(:sample_resume_token) do
33
- stream = authorized_collection.watch
34
- authorized_collection.insert_one(a: 1)
42
+ stream = collection.watch
43
+ collection.insert_one(a: 1)
35
44
  doc = stream.to_enum.next
36
45
  stream.close
37
46
  doc[:_id]
@@ -61,7 +70,7 @@ describe Mongo::Collection::View::ChangeStream do
61
70
  end
62
71
 
63
72
  before do
64
- authorized_collection.delete_many
73
+ collection.delete_many
65
74
  end
66
75
 
67
76
  after do
@@ -172,7 +181,8 @@ describe Mongo::Collection::View::ChangeStream do
172
181
  context 'when the collection has a readConcern' do
173
182
 
174
183
  let(:collection) do
175
- authorized_collection.with(read_concern: { level: 'majority' })
184
+ client['mcv-change-stream'].with(
185
+ read_concern: { level: 'majority' })
176
186
  end
177
187
 
178
188
  let(:view) do
@@ -242,10 +252,6 @@ describe Mongo::Collection::View::ChangeStream do
242
252
  client.start_session
243
253
  end
244
254
 
245
- let(:client) do
246
- authorized_client
247
- end
248
-
249
255
  it 'raises an error' do
250
256
  expect(operation_result.class).to eq(Mongo::Error::OperationFailure)
251
257
  end
@@ -281,14 +287,10 @@ describe Mongo::Collection::View::ChangeStream do
281
287
 
282
288
  let(:operation) do
283
289
  change_stream
284
- authorized_collection.insert_one(a: 1)
290
+ collection.insert_one(a: 1)
285
291
  change_stream.to_enum.next
286
292
  end
287
293
 
288
- let(:client) do
289
- authorized_client
290
- end
291
-
292
294
  context 'when the session is created from the same client used for the operation' do
293
295
 
294
296
  let(:session) do
@@ -327,7 +329,7 @@ describe Mongo::Collection::View::ChangeStream do
327
329
  context 'when a session from another client is provided' do
328
330
 
329
331
  let(:session) do
330
- another_authorized_client.start_session
332
+ another_authorized_client.with(retry_reads: false).start_session
331
333
  end
332
334
 
333
335
  let(:operation_result) do
@@ -390,7 +392,7 @@ describe Mongo::Collection::View::ChangeStream do
390
392
 
391
393
  before do
392
394
  change_stream
393
- authorized_collection.insert_one(a: 1)
395
+ collection.insert_one(a: 1)
394
396
  enum.next
395
397
  change_stream.close
396
398
  end
@@ -438,7 +440,7 @@ describe Mongo::Collection::View::ChangeStream do
438
440
 
439
441
  before do
440
442
  change_stream
441
- authorized_collection.insert_one(a: 1)
443
+ collection.insert_one(a: 1)
442
444
  end
443
445
 
444
446
  context 'pre-4.1 server' do
@@ -467,8 +469,6 @@ describe Mongo::Collection::View::ChangeStream do
467
469
  context 'when an error is encountered the first time the command is run' do
468
470
  include PrimarySocket
469
471
 
470
- let(:client) { authorized_collection.client }
471
-
472
472
  before do
473
473
  expect(primary_socket).to receive(:write).and_raise(error).once
474
474
  end
@@ -482,7 +482,7 @@ describe Mongo::Collection::View::ChangeStream do
482
482
  before do
483
483
  expect(view.send(:server_selector)).to receive(:select_server).twice.and_call_original
484
484
  change_stream
485
- authorized_collection.insert_one(a: 1)
485
+ collection.insert_one(a: 1)
486
486
  end
487
487
 
488
488
  it 'runs the command again while using the same read preference and caches the resume token' do
@@ -497,7 +497,7 @@ describe Mongo::Collection::View::ChangeStream do
497
497
  end
498
498
 
499
499
  let(:session) do
500
- authorized_client.start_session
500
+ client.start_session
501
501
  end
502
502
 
503
503
  before do
@@ -576,7 +576,7 @@ describe Mongo::Collection::View::ChangeStream do
576
576
  end
577
577
 
578
578
  let(:session) do
579
- authorized_client.start_session
579
+ client.start_session
580
580
  end
581
581
 
582
582
  before do
@@ -601,9 +601,9 @@ describe Mongo::Collection::View::ChangeStream do
601
601
 
602
602
  before do
603
603
  change_stream
604
- authorized_collection.insert_one(a: 1)
604
+ collection.insert_one(a: 1)
605
605
  enum.next
606
- authorized_collection.insert_one(a: 2)
606
+ collection.insert_one(a: 2)
607
607
  expect(cursor).to receive(:get_more).once.and_raise(error)
608
608
  expect(cursor).to receive(:kill_cursors).and_call_original
609
609
  expect(Mongo::Operation::Aggregate).to receive(:new).and_call_original
@@ -629,7 +629,7 @@ describe Mongo::Collection::View::ChangeStream do
629
629
  end
630
630
 
631
631
  let(:session) do
632
- authorized_client.start_session
632
+ client.start_session
633
633
  end
634
634
 
635
635
  before do
@@ -685,9 +685,9 @@ describe Mongo::Collection::View::ChangeStream do
685
685
 
686
686
  before do
687
687
  change_stream
688
- authorized_collection.insert_one(a: 1)
688
+ collection.insert_one(a: 1)
689
689
  enum.next
690
- authorized_collection.insert_one(a: 2)
690
+ collection.insert_one(a: 2)
691
691
  expect(cursor).to receive(:get_more).and_raise(Mongo::Error::MissingResumeToken)
692
692
  expect(cursor).to receive(:kill_cursors).and_call_original
693
693
  expect(Mongo::Operation::Aggregate).not_to receive(:new)
@@ -710,7 +710,7 @@ describe Mongo::Collection::View::ChangeStream do
710
710
  end
711
711
 
712
712
  let(:session) do
713
- authorized_client.start_session
713
+ client.start_session
714
714
  end
715
715
 
716
716
  before do
@@ -192,7 +192,7 @@ describe Mongo::Collection::View::Readable do
192
192
 
193
193
  let(:command) do
194
194
  operation
195
- EventSubscriber.started_events.find { |cmd| cmd.command_name == 'mapreduce' }.command
195
+ EventSubscriber.started_events.find { |cmd| cmd.command_name == 'mapReduce' }.command
196
196
  end
197
197
 
198
198
  it_behaves_like 'an operation supporting causally consistent reads'
@@ -141,7 +141,9 @@ describe Mongo::Collection::View do
141
141
 
142
142
  before do
143
143
  view.to_enum.next
144
- cursor.instance_variable_set(:@cursor_id, 1) unless find_command_enabled?
144
+ if ClusterConfig.instance.fcv_ish < '3.2'
145
+ cursor.instance_variable_set(:@cursor_id, 1)
146
+ end
145
147
  end
146
148
 
147
149
  it 'sends a kill cursors command for the cursor' do
@@ -110,13 +110,13 @@ describe Mongo::Cursor do
110
110
  before do
111
111
  expect(cursor).to receive(:get_more_operation).and_return(op).ordered
112
112
  expect(op).to receive(:execute).and_raise(Mongo::Error::SocketError).ordered
113
- expect(cursor).to receive(:get_more_operation).and_call_original.ordered
114
113
  end
115
114
 
116
- it 'iterates the documents' do
117
- cursor.each do |doc|
118
- expect(doc).to have_key('field')
119
- end
115
+ it 'raises the error' do
116
+ expect do
117
+ cursor.each do |doc|
118
+ end
119
+ end.to raise_error(Mongo::Error::SocketError)
120
120
  end
121
121
  end
122
122