mongo 2.20.1 → 2.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +2 -2
  4. data/lib/mongo/address.rb +22 -3
  5. data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
  6. data/lib/mongo/auth/base.rb +1 -1
  7. data/lib/mongo/bulk_write.rb +35 -2
  8. data/lib/mongo/client.rb +38 -6
  9. data/lib/mongo/client_encryption.rb +6 -3
  10. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
  11. data/lib/mongo/cluster/sdam_flow.rb +20 -7
  12. data/lib/mongo/cluster.rb +14 -4
  13. data/lib/mongo/collection/helpers.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  15. data/lib/mongo/collection/view/aggregation.rb +33 -99
  16. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  17. data/lib/mongo/collection/view/change_stream.rb +80 -27
  18. data/lib/mongo/collection/view/iterable.rb +76 -60
  19. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  20. data/lib/mongo/collection/view/readable.rb +79 -30
  21. data/lib/mongo/collection/view/writable.rb +109 -48
  22. data/lib/mongo/collection/view.rb +43 -3
  23. data/lib/mongo/collection.rb +158 -23
  24. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  25. data/lib/mongo/crypt/binding.rb +4 -4
  26. data/lib/mongo/crypt/context.rb +20 -14
  27. data/lib/mongo/crypt/encryption_io.rb +56 -26
  28. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  29. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  30. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  31. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  32. data/lib/mongo/csot_timeout_holder.rb +119 -0
  33. data/lib/mongo/cursor/kill_spec.rb +5 -2
  34. data/lib/mongo/cursor/nontailable.rb +27 -0
  35. data/lib/mongo/cursor.rb +86 -24
  36. data/lib/mongo/cursor_host.rb +82 -0
  37. data/lib/mongo/database/view.rb +81 -14
  38. data/lib/mongo/database.rb +88 -18
  39. data/lib/mongo/error/operation_failure.rb +209 -204
  40. data/lib/mongo/error/server_timeout_error.rb +12 -0
  41. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  42. data/lib/mongo/error/timeout_error.rb +23 -0
  43. data/lib/mongo/error.rb +2 -0
  44. data/lib/mongo/grid/fs_bucket.rb +45 -12
  45. data/lib/mongo/grid/stream/read.rb +15 -1
  46. data/lib/mongo/grid/stream/write.rb +21 -4
  47. data/lib/mongo/index/view.rb +77 -16
  48. data/lib/mongo/operation/context.rb +40 -2
  49. data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
  50. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  51. data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
  52. data/lib/mongo/operation/find/op_msg.rb +45 -0
  53. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  54. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  55. data/lib/mongo/operation/insert/result.rb +4 -2
  56. data/lib/mongo/operation/list_collections/result.rb +1 -1
  57. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  58. data/lib/mongo/operation/op_msg_base.rb +3 -1
  59. data/lib/mongo/operation/result.rb +26 -5
  60. data/lib/mongo/operation/shared/executable.rb +12 -1
  61. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  62. data/lib/mongo/operation/shared/response_handling.rb +3 -3
  63. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  64. data/lib/mongo/operation/shared/timed.rb +52 -0
  65. data/lib/mongo/operation/shared/write.rb +4 -1
  66. data/lib/mongo/operation/update/op_msg.rb +2 -1
  67. data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
  68. data/lib/mongo/operation.rb +1 -0
  69. data/lib/mongo/protocol/message.rb +1 -4
  70. data/lib/mongo/protocol/msg.rb +2 -2
  71. data/lib/mongo/retryable/read_worker.rb +69 -29
  72. data/lib/mongo/retryable/write_worker.rb +49 -18
  73. data/lib/mongo/retryable.rb +8 -2
  74. data/lib/mongo/server/connection.rb +11 -5
  75. data/lib/mongo/server/connection_base.rb +22 -2
  76. data/lib/mongo/server/connection_pool.rb +32 -14
  77. data/lib/mongo/server/description/features.rb +1 -1
  78. data/lib/mongo/server/description.rb +18 -5
  79. data/lib/mongo/server/monitor.rb +7 -4
  80. data/lib/mongo/server/pending_connection.rb +7 -3
  81. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  82. data/lib/mongo/server.rb +11 -6
  83. data/lib/mongo/server_selector/base.rb +25 -9
  84. data/lib/mongo/session.rb +78 -9
  85. data/lib/mongo/socket/ssl.rb +109 -17
  86. data/lib/mongo/socket/tcp.rb +40 -6
  87. data/lib/mongo/socket.rb +154 -25
  88. data/lib/mongo/uri/options_mapper.rb +1 -0
  89. data/lib/mongo/version.rb +1 -1
  90. data/lib/mongo.rb +1 -0
  91. data/spec/atlas/atlas_connectivity_spec.rb +4 -0
  92. data/spec/atlas/operations_spec.rb +4 -0
  93. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  94. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  95. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  96. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
  97. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  98. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  99. data/spec/integration/cursor_pinning_spec.rb +15 -60
  100. data/spec/integration/cursor_reaping_spec.rb +1 -1
  101. data/spec/integration/docs_examples_spec.rb +1 -1
  102. data/spec/integration/operation_failure_code_spec.rb +1 -1
  103. data/spec/integration/operation_failure_message_spec.rb +3 -3
  104. data/spec/integration/retryable_errors_spec.rb +2 -2
  105. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  106. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  107. data/spec/integration/server_spec.rb +4 -3
  108. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  109. data/spec/kerberos/kerberos_spec.rb +4 -0
  110. data/spec/lite_spec_helper.rb +3 -1
  111. data/spec/mongo/auth/user/view_spec.rb +1 -1
  112. data/spec/mongo/caching_cursor_spec.rb +1 -1
  113. data/spec/mongo/client_encryption_spec.rb +1 -0
  114. data/spec/mongo/client_spec.rb +158 -4
  115. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  116. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  117. data/spec/mongo/collection_spec.rb +5 -6
  118. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  119. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  120. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  121. data/spec/mongo/crypt/handle_spec.rb +1 -1
  122. data/spec/mongo/cursor_spec.rb +26 -9
  123. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  124. data/spec/mongo/operation/context_spec.rb +79 -0
  125. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  126. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  127. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  128. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  129. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  130. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  131. data/spec/mongo/query_cache_spec.rb +243 -225
  132. data/spec/mongo/retryable_spec.rb +1 -0
  133. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  134. data/spec/mongo/socket/ssl_spec.rb +0 -10
  135. data/spec/runners/change_streams/test.rb +2 -2
  136. data/spec/runners/crud/operation.rb +1 -1
  137. data/spec/runners/crud/verifier.rb +3 -1
  138. data/spec/runners/transactions/operation.rb +4 -6
  139. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  140. data/spec/runners/unified/assertions.rb +4 -0
  141. data/spec/runners/unified/change_stream_operations.rb +14 -24
  142. data/spec/runners/unified/crud_operations.rb +82 -59
  143. data/spec/runners/unified/ddl_operations.rb +38 -7
  144. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  145. data/spec/runners/unified/support_operations.rb +43 -4
  146. data/spec/runners/unified/test.rb +22 -10
  147. data/spec/runners/unified.rb +1 -1
  148. data/spec/solo/clean_exit_spec.rb +2 -0
  149. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  150. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  151. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  152. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  153. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  157. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  158. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  159. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  160. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  161. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  162. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  184. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  185. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  186. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  187. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  188. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  189. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  190. data/spec/support/cluster_tools.rb +3 -3
  191. data/spec/support/common_shortcuts.rb +2 -2
  192. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  193. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  194. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  195. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  196. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  199. data/spec/support/shared/session.rb +2 -2
  200. data/spec/support/spec_setup.rb +2 -2
  201. data/spec/support/utils.rb +3 -1
  202. metadata +78 -91
  203. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  215. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  216. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  217. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  218. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  219. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  220. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  221. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  222. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  223. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  224. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  225. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  226. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  227. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  228. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  229. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  230. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  231. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  232. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  233. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  234. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  235. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  236. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -128,6 +128,10 @@ module Mongo
128
128
  # required privilege to run the command when access control is enforced
129
129
  # @option options [ Object ] :comment A user-provided
130
130
  # comment to attach to this command.
131
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
132
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
133
+ # The default value is unset which means the value is inherited from
134
+ # the database or the client.
131
135
  #
132
136
  # See https://mongodb.com/docs/manual/reference/command/listCollections/
133
137
  # for more information and usage.
@@ -136,7 +140,7 @@ module Mongo
136
140
  #
137
141
  # @since 2.0.0
138
142
  def collection_names(options = {})
139
- View.new(self).collection_names(options)
143
+ View.new(self, options).collection_names(options)
140
144
  end
141
145
 
142
146
  # Get info on all the non-system collections in the database.
@@ -156,6 +160,10 @@ module Mongo
156
160
  # required privilege to run the command when access control is enforced.
157
161
  # @option options [ Object ] :comment A user-provided
158
162
  # comment to attach to this command.
163
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
164
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
165
+ # The default value is unset which means the value is inherited from
166
+ # the database or the client.
159
167
  #
160
168
  # See https://mongodb.com/docs/manual/reference/command/listCollections/
161
169
  # for more information and usage.
@@ -165,7 +173,7 @@ module Mongo
165
173
  #
166
174
  # @since 2.0.5
167
175
  def list_collections(options = {})
168
- View.new(self).list_collections(options)
176
+ View.new(self, options).list_collections(options)
169
177
  end
170
178
 
171
179
  # Get all the non-system collections that belong to this database.
@@ -181,6 +189,10 @@ module Mongo
181
189
  # required privilege to run the command when access control is enforced.
182
190
  # @option options [ Object ] :comment A user-provided
183
191
  # comment to attach to this command.
192
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
193
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
194
+ # The default value is unset which means the value is inherited from
195
+ # the database or the client.
184
196
  #
185
197
  # See https://mongodb.com/docs/manual/reference/command/listCollections/
186
198
  # for more information and usage.
@@ -202,6 +214,10 @@ module Mongo
202
214
  #
203
215
  # @option opts :read [ Hash ] The read preference for this command.
204
216
  # @option opts :session [ Session ] The session to use for this command.
217
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
218
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
219
+ # The default value is unset which means the value is inherited from
220
+ # the database or the client.
205
221
  # @option opts :execution_options [ Hash ] Options to pass to the code that
206
222
  # executes this command. This is an internal option and is subject to
207
223
  # change.
@@ -223,7 +239,7 @@ module Mongo
223
239
  Lint.validate_underscore_read_preference(txn_read_pref)
224
240
  selector = ServerSelector.get(txn_read_pref)
225
241
 
226
- client.send(:with_session, opts) do |session|
242
+ client.with_session(opts) do |session|
227
243
  server = selector.select_server(cluster, nil, session)
228
244
  op = Operation::Command.new(
229
245
  :selector => operation,
@@ -233,7 +249,11 @@ module Mongo
233
249
  )
234
250
 
235
251
  op.execute(server,
236
- context: Operation::Context.new(client: client, session: session),
252
+ context: Operation::Context.new(
253
+ client: client,
254
+ session: session,
255
+ operation_timeouts: operation_timeouts(opts)
256
+ ),
237
257
  options: execution_opts)
238
258
  end
239
259
  end
@@ -245,6 +265,12 @@ module Mongo
245
265
  #
246
266
  # @option opts :read [ Hash ] The read preference for this command.
247
267
  # @option opts :session [ Session ] The session to use for this command.
268
+ # @option opts [ Object ] :comment A user-provided
269
+ # comment to attach to this command.
270
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
271
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
272
+ # The default value is unset which means the value is inherited from
273
+ # the database or the client.
248
274
  #
249
275
  # @return [ Hash ] The result of the command execution.
250
276
  # @api private
@@ -258,15 +284,20 @@ module Mongo
258
284
  Lint.validate_underscore_read_preference(txn_read_pref)
259
285
  preference = ServerSelector.get(txn_read_pref)
260
286
 
261
- client.send(:with_session, opts) do |session|
262
- read_with_retry(session, preference) do |server|
287
+ client.with_session(opts) do |session|
288
+ context = Operation::Context.new(
289
+ client: client,
290
+ session: session,
291
+ operation_timeouts: operation_timeouts(opts)
292
+ )
293
+ read_with_retry(session, preference, context) do |server|
263
294
  Operation::Command.new(
264
295
  selector: operation.dup,
265
296
  db_name: name,
266
297
  read: preference,
267
298
  session: session,
268
299
  comment: opts[:comment],
269
- ).execute(server, context: Operation::Context.new(client: client, session: session))
300
+ ).execute(server, context: context)
270
301
  end
271
302
  end
272
303
  end
@@ -279,14 +310,18 @@ module Mongo
279
310
  # @param [ Hash ] options The options for the operation.
280
311
  #
281
312
  # @option options [ Session ] :session The session to use for the operation.
282
- # @option opts [ Hash ] :write_concern The write concern options.
313
+ # @option options [ Hash ] :write_concern The write concern options.
314
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
315
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
316
+ # The default value is unset which means the value is inherited from
317
+ # the database or the client.
283
318
  #
284
319
  # @return [ Result ] The result of the command.
285
320
  #
286
321
  # @since 2.0.0
287
322
  def drop(options = {})
288
323
  operation = { :dropDatabase => 1 }
289
- client.send(:with_session, options) do |session|
324
+ client.with_session(options) do |session|
290
325
  write_concern = if options[:write_concern]
291
326
  WriteConcern.get(options[:write_concern])
292
327
  else
@@ -297,7 +332,14 @@ module Mongo
297
332
  db_name: name,
298
333
  write_concern: write_concern,
299
334
  session: session
300
- }).execute(next_primary(nil, session), context: Operation::Context.new(client: client, session: session))
335
+ }).execute(
336
+ next_primary(nil, session),
337
+ context: Operation::Context.new(
338
+ client: client,
339
+ session: session,
340
+ operation_timeouts: operation_timeouts(options)
341
+ )
342
+ )
301
343
  end
302
344
  end
303
345
 
@@ -309,6 +351,10 @@ module Mongo
309
351
  # @param [ Mongo::Client ] client The driver client.
310
352
  # @param [ String, Symbol ] name The name of the database.
311
353
  # @param [ Hash ] options The options.
354
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
355
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
356
+ # The default value is unset which means the value is inherited from
357
+ # the client.
312
358
  #
313
359
  # @raise [ Mongo::Database::InvalidName ] If the name is nil.
314
360
  #
@@ -388,20 +434,21 @@ module Mongo
388
434
  # @option options [ Hash ] :collation The collation to use.
389
435
  # @option options [ Object ] :comment A user-provided
390
436
  # comment to attach to this command.
437
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
438
+ # allow the query to run, in milliseconds. This option is deprecated, use
439
+ # :timeout_ms instead.
440
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
441
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
442
+ # The default value is unset which means the value is inherited from
443
+ # the database or the client.
391
444
  # @option options [ String ] :hint The index to use for the aggregation.
392
- # @option options [ Integer ] :max_time_ms The maximum amount of time in
393
- # milliseconds to allow the aggregation to run.
394
- # @option options [ true, false ] :use_cursor Indicates whether the command
395
- # will request that the server provide results using a cursor. Note that
396
- # as of server version 3.6, aggregations always provide results using a
397
- # cursor and this option is therefore not valid.
398
445
  # @option options [ Session ] :session The session to use.
399
446
  #
400
447
  # @return [ Collection::View::Aggregation ] The aggregation object.
401
448
  #
402
449
  # @since 2.10.0
403
450
  def aggregate(pipeline, options = {})
404
- View.new(self).aggregate(pipeline, options)
451
+ View.new(self, options).aggregate(pipeline, options)
405
452
  end
406
453
 
407
454
  # As of version 3.6 of the MongoDB server, a ``$changeStream`` pipeline stage is supported
@@ -471,7 +518,7 @@ module Mongo
471
518
  # @since 2.6.0
472
519
  def watch(pipeline = [], options = {})
473
520
  view_options = options.dup
474
- view_options[:await_data] = true if options[:max_await_time_ms]
521
+ view_options[:cursor_type] = :tailable_await if options[:max_await_time_ms]
475
522
 
476
523
  Mongo::Collection::View::ChangeStream.new(
477
524
  Mongo::Collection::View.new(collection("#{COMMAND}.aggregate"), {}, view_options),
@@ -497,5 +544,28 @@ module Mongo
497
544
  database = Database.new(client, client.options[:database], client.options)
498
545
  client.instance_variable_set(:@database, database)
499
546
  end
547
+
548
+ # @return [ Integer | nil ] Operation timeout that is for this database or
549
+ # for the corresponding client.
550
+ #
551
+ # @api private
552
+ def timeout_ms
553
+ options[:timeout_ms] || client.timeout_ms
554
+ end
555
+
556
+ # @return [ Hash ] timeout_ms value set on the operation level (if any),
557
+ # and/or timeout_ms that is set on collection/database/client level (if any).
558
+ #
559
+ # @api private
560
+ def operation_timeouts(opts)
561
+ # TODO: We should re-evaluate if we need two timeouts separately.
562
+ {}.tap do |result|
563
+ if opts[:timeout_ms].nil?
564
+ result[:inherited_timeout_ms] = timeout_ms
565
+ else
566
+ result[:operation_timeout_ms] = opts.delete(:timeout_ms)
567
+ end
568
+ end
569
+ end
500
570
  end
501
571
  end