mongo 2.20.2 → 2.21.0

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +11 -11
  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 +113 -30
  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 +15 -4
  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/ocsp_verifier_spec.rb +99 -30
  103. data/spec/integration/operation_failure_code_spec.rb +1 -1
  104. data/spec/integration/operation_failure_message_spec.rb +3 -3
  105. data/spec/integration/reconnect_spec.rb +2 -8
  106. data/spec/integration/retryable_errors_spec.rb +2 -2
  107. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  108. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  109. data/spec/integration/server_spec.rb +4 -3
  110. data/spec/integration/srv_monitoring_spec.rb +3 -2
  111. data/spec/integration/srv_spec.rb +4 -0
  112. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  113. data/spec/kerberos/kerberos_spec.rb +4 -0
  114. data/spec/lite_spec_helper.rb +3 -1
  115. data/spec/mongo/auth/user/view_spec.rb +1 -1
  116. data/spec/mongo/caching_cursor_spec.rb +1 -1
  117. data/spec/mongo/client_encryption_spec.rb +1 -0
  118. data/spec/mongo/client_spec.rb +158 -4
  119. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  120. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  121. data/spec/mongo/collection_spec.rb +5 -6
  122. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  123. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  124. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  125. data/spec/mongo/crypt/handle_spec.rb +1 -1
  126. data/spec/mongo/cursor_spec.rb +26 -9
  127. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  128. data/spec/mongo/operation/context_spec.rb +79 -0
  129. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  130. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  131. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  132. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  133. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  134. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  135. data/spec/mongo/query_cache_spec.rb +243 -225
  136. data/spec/mongo/retryable_spec.rb +1 -0
  137. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  138. data/spec/mongo/socket/ssl_spec.rb +0 -10
  139. data/spec/runners/change_streams/test.rb +2 -2
  140. data/spec/runners/crud/operation.rb +1 -1
  141. data/spec/runners/crud/verifier.rb +3 -1
  142. data/spec/runners/transactions/operation.rb +4 -6
  143. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  144. data/spec/runners/unified/assertions.rb +4 -0
  145. data/spec/runners/unified/change_stream_operations.rb +14 -24
  146. data/spec/runners/unified/crud_operations.rb +82 -59
  147. data/spec/runners/unified/ddl_operations.rb +38 -7
  148. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  149. data/spec/runners/unified/support_operations.rb +43 -4
  150. data/spec/runners/unified/test.rb +22 -10
  151. data/spec/runners/unified.rb +1 -1
  152. data/spec/solo/clean_exit_spec.rb +2 -0
  153. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  157. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  158. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  159. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  160. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  161. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  162. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  184. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  185. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  186. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  187. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  188. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  189. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  190. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  191. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  192. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  193. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  194. data/spec/support/cluster_tools.rb +3 -3
  195. data/spec/support/common_shortcuts.rb +39 -21
  196. data/spec/support/constraints.rb +0 -10
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  199. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  200. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  201. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  202. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  203. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  204. data/spec/support/dns.rb +16 -0
  205. data/spec/support/shared/session.rb +2 -2
  206. data/spec/support/spec_setup.rb +2 -2
  207. data/spec/support/utils.rb +3 -1
  208. metadata +91 -153
  209. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  210. data/spec/shared/CANDIDATE.md +0 -28
  211. data/spec/shared/LICENSE +0 -20
  212. data/spec/shared/bin/get-mongodb-download-url +0 -17
  213. data/spec/shared/bin/s3-copy +0 -45
  214. data/spec/shared/bin/s3-upload +0 -69
  215. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  216. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  217. data/spec/shared/lib/mrss/constraints.rb +0 -378
  218. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  219. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  220. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  221. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  222. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  223. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  224. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  225. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  226. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  227. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  228. data/spec/shared/lib/mrss/utils.rb +0 -37
  229. data/spec/shared/lib/tasks/candidate.rake +0 -64
  230. data/spec/shared/share/Dockerfile.erb +0 -251
  231. data/spec/shared/share/haproxy-1.conf +0 -16
  232. data/spec/shared/share/haproxy-2.conf +0 -17
  233. data/spec/shared/shlib/config.sh +0 -27
  234. data/spec/shared/shlib/distro.sh +0 -84
  235. data/spec/shared/shlib/server.sh +0 -423
  236. data/spec/shared/shlib/set_env.sh +0 -110
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  247. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  248. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  249. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  250. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  251. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  252. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  253. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  254. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  255. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  256. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  257. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  258. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  259. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  260. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  261. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  262. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  263. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  264. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  265. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  266. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  267. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  268. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  269. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  270. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  271. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  272. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  273. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  274. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  275. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  276. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  277. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  278. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  279. 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