mongo 2.20.1 → 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 (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
@@ -134,8 +134,12 @@ module Mongo
134
134
  # and *:nearest*.
135
135
  # - *:tag_sets* -- an array of hashes.
136
136
  # - *:local_threshold*.
137
- # @option opts [ Session ] :session The session to use for the operation.
138
- # @option opts [ Integer ] :size The size of the capped collection.
137
+ # @option options [ Session ] :session The session to use for the operation.
138
+ # @option options [ Integer ] :size The size of the capped collection.
139
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
140
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
141
+ # The default value is unset which means the value is inherited from
142
+ # the database or the client.
139
143
  # @option opts [ Hash ] :time_series Create a time-series collection.
140
144
  # The hash may have the following items:
141
145
  # - *:timeField* -- The name of the field which contains the date in each
@@ -163,6 +167,7 @@ module Mongo
163
167
  @database = database
164
168
  @name = name.to_s.freeze
165
169
  @options = options.dup
170
+ @timeout_ms = options.delete(:timeout_ms)
166
171
  =begin WriteConcern object support
167
172
  if @options[:write_concern].is_a?(WriteConcern::Base)
168
173
  # Cache the instance so that we do not needlessly reconstruct it.
@@ -401,7 +406,10 @@ module Mongo
401
406
  self.write_concern
402
407
  end
403
408
 
404
- context = Operation::Context.new(client: client, session: session)
409
+ context = Operation::Context.new(
410
+ client: client,
411
+ session: session
412
+ )
405
413
  maybe_create_qe_collections(opts[:encrypted_fields], client, session) do |encrypted_fields|
406
414
  Operation::Create.new(
407
415
  selector: operation,
@@ -413,7 +421,10 @@ module Mongo
413
421
  collation: options[:collation] || options['collation'],
414
422
  encrypted_fields: encrypted_fields,
415
423
  validator: options[:validator],
416
- ).execute(next_primary(nil, session), context: context)
424
+ ).execute(
425
+ next_primary(nil, session),
426
+ context: context
427
+ )
417
428
  end
418
429
  end
419
430
  end
@@ -432,12 +443,16 @@ module Mongo
432
443
  # @option opts [ Hash ] :write_concern The write concern options.
433
444
  # @option opts [ Hash | nil ] :encrypted_fields Encrypted fields hash that
434
445
  # was provided to `create` collection helper.
446
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
447
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
448
+ # The default value is unset which means the value is inherited from
449
+ # the collection or the database or the client.
435
450
  #
436
451
  # @return [ Result ] The result of the command.
437
452
  #
438
453
  # @since 2.0.0
439
454
  def drop(opts = {})
440
- client.send(:with_session, opts) do |session|
455
+ client.with_session(opts) do |session|
441
456
  maybe_drop_emm_collections(opts[:encrypted_fields], client, session) do
442
457
  temp_write_concern = write_concern
443
458
  write_concern = if opts[:write_concern]
@@ -445,7 +460,11 @@ module Mongo
445
460
  else
446
461
  temp_write_concern
447
462
  end
448
- context = Operation::Context.new(client: client, session: session)
463
+ context = Operation::Context.new(
464
+ client: client,
465
+ session: session,
466
+ operation_timeouts: operation_timeouts(opts)
467
+ )
449
468
  operation = Operation::Drop.new({
450
469
  selector: { :drop => name },
451
470
  db_name: database.name,
@@ -481,8 +500,9 @@ module Mongo
481
500
  # this command.
482
501
  # @option options [ :tailable, :tailable_await ] :cursor_type The type of cursor to use.
483
502
  # @option options [ Integer ] :limit The max number of docs to return from the query.
484
- # @option options [ Integer ] :max_time_ms
485
- # The maximum amount of time to allow the query to run, in milliseconds.
503
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
504
+ # allow the query to run, in milliseconds. This option is deprecated, use
505
+ # :timeout_ms instead.
486
506
  # @option options [ Hash ] :modifiers A document containing meta-operators modifying the
487
507
  # output or behavior of a query.
488
508
  # @option options [ true | false ] :no_cursor_timeout The server normally times out idle
@@ -496,6 +516,13 @@ module Mongo
496
516
  # @option options [ Integer ] :skip The number of docs to skip before returning results.
497
517
  # @option options [ Hash ] :sort The key and direction pairs by which the result set
498
518
  # will be sorted.
519
+ # @option options [ :cursor_lifetime | :iteration ] :timeout_mode How to interpret
520
+ # :timeout_ms (whether it applies to the lifetime of the cursor, or per
521
+ # iteration).
522
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
523
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
524
+ # The default value is unset which means the value is inherited from
525
+ # the collection or the database or the client.
499
526
  # @option options [ Hash ] :let Mapping of variables to use in the command.
500
527
  # See the server documentation for details.
501
528
  #
@@ -526,13 +553,14 @@ module Mongo
526
553
  # @option options [ String ] :hint The index to use for the aggregation.
527
554
  # @option options [ Hash ] :let Mapping of variables to use in the pipeline.
528
555
  # See the server documentation for details.
529
- # @option options [ Integer ] :max_time_ms The maximum amount of time in
530
- # milliseconds to allow the aggregation to run.
531
- # @option options [ true | false ] :use_cursor Indicates whether the command
532
- # will request that the server provide results using a cursor. Note that
533
- # as of server version 3.6, aggregations always provide results using a
534
- # cursor and this option is therefore not valid.
556
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
557
+ # allow the query to run, in milliseconds. This option is deprecated, use
558
+ # :timeout_ms instead.
535
559
  # @option options [ Session ] :session The session to use.
560
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
561
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
562
+ # The default value is unset which means the value is inherited from
563
+ # the collection or the database or the client.
536
564
  #
537
565
  # @return [ View::Aggregation ] The aggregation object.
538
566
  #
@@ -600,6 +628,13 @@ module Mongo
600
628
  # events included with this flag set are: createIndexes, dropIndexes,
601
629
  # modify, create, shardCollection, reshardCollection,
602
630
  # refineCollectionShardKey.
631
+ # @option options [ :cursor_lifetime | :iteration ] :timeout_mode How to interpret
632
+ # :timeout_ms (whether it applies to the lifetime of the cursor, or per
633
+ # iteration).
634
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
635
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
636
+ # The default value is unset which means the value is inherited from
637
+ # the collection or the database or the client.
603
638
  #
604
639
  # @note A change stream only allows 'majority' read concern.
605
640
  # @note This helper method is preferable to running a raw aggregation with
@@ -610,7 +645,7 @@ module Mongo
610
645
  # @since 2.5.0
611
646
  def watch(pipeline = [], options = {})
612
647
  view_options = options.dup
613
- view_options[:await_data] = true if options[:max_await_time_ms]
648
+ view_options[:cursor_type] = :tailable_await if options[:max_await_time_ms]
614
649
  View::ChangeStream.new(View.new(self, {}, view_options), pipeline, nil, options)
615
650
  end
616
651
 
@@ -624,13 +659,19 @@ module Mongo
624
659
  #
625
660
  # @option options [ Hash ] :hint The index to use.
626
661
  # @option options [ Integer ] :limit The maximum number of documents to count.
627
- # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command to run.
662
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
663
+ # allow the query to run, in milliseconds. This option is deprecated, use
664
+ # :timeout_ms instead.
628
665
  # @option options [ Integer ] :skip The number of documents to skip before counting.
629
666
  # @option options [ Hash ] :read The read preference options.
630
667
  # @option options [ Hash ] :collation The collation to use.
631
668
  # @option options [ Session ] :session The session to use.
632
669
  # @option options [ Object ] :comment A user-provided
633
670
  # comment to attach to this command.
671
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
672
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
673
+ # The default value is unset which means the value is inherited from
674
+ # the collection or the database or the client.
634
675
  #
635
676
  # @return [ Integer ] The document count.
636
677
  #
@@ -667,6 +708,10 @@ module Mongo
667
708
  # @option options [ Session ] :session The session to use.
668
709
  # @option options [ Object ] :comment A user-provided
669
710
  # comment to attach to this command.
711
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
712
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
713
+ # The default value is unset which means the value is inherited from
714
+ # the collection or the database or the client.
670
715
  #
671
716
  # @return [ Integer ] The document count.
672
717
  #
@@ -688,6 +733,10 @@ module Mongo
688
733
  # @option options [ Hash ] :read The read preference options.
689
734
  # @option options [ Object ] :comment A user-provided
690
735
  # comment to attach to this command.
736
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
737
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
738
+ # The default value is unset which means the value is inherited from
739
+ # the collection or the database or the client.
691
740
  #
692
741
  # @return [ Integer ] The document count.
693
742
  #
@@ -705,10 +754,16 @@ module Mongo
705
754
  # @param [ Hash ] filter The documents from which to retrieve the distinct values.
706
755
  # @param [ Hash ] options The distinct command options.
707
756
  #
708
- # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command to run.
757
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
758
+ # allow the query to run, in milliseconds. This option is deprecated, use
759
+ # :timeout_ms instead.
709
760
  # @option options [ Hash ] :read The read preference options.
710
761
  # @option options [ Hash ] :collation The collation to use.
711
762
  # @option options [ Session ] :session The session to use.
763
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
764
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
765
+ # The default value is unset which means the value is inherited from
766
+ # the collection or the database or the client.
712
767
  #
713
768
  # @return [ Array<Object> ] The list of distinct values.
714
769
  #
@@ -781,6 +836,10 @@ module Mongo
781
836
  # @option opts [ Object ] :comment A user-provided comment to attach to
782
837
  # this command.
783
838
  # @option opts [ Session ] :session The session to use for the operation.
839
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
840
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
841
+ # The default value is unset which means the value is inherited from
842
+ # the collection or the database or the client.
784
843
  # @option opts [ Hash ] :write_concern The write concern options.
785
844
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
786
845
  #
@@ -801,7 +860,11 @@ module Mongo
801
860
  raise ArgumentError, "Document to be inserted cannot be nil"
802
861
  end
803
862
 
804
- context = Operation::Context.new(client: client, session: session)
863
+ context = Operation::Context.new(
864
+ client: client,
865
+ session: session,
866
+ operation_timeouts: operation_timeouts(opts)
867
+ )
805
868
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
806
869
  Operation::Insert.new(
807
870
  :documents => [ document ],
@@ -834,6 +897,10 @@ module Mongo
834
897
  # @option options [ true | false ] :ordered Whether the operations
835
898
  # should be executed in order.
836
899
  # @option options [ Session ] :session The session to use for the operation.
900
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
901
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
902
+ # The default value is unset which means the value is inherited from
903
+ # the collection or the database or the client.
837
904
  # @option options [ Hash ] :write_concern The write concern options.
838
905
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
839
906
  #
@@ -862,6 +929,10 @@ module Mongo
862
929
  # @option options [ true | false ] :bypass_document_validation Whether or
863
930
  # not to skip document level validation.
864
931
  # @option options [ Session ] :session The session to use for the set of operations.
932
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
933
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
934
+ # The default value is unset which means the value is inherited from
935
+ # the collection or the database or the client.
865
936
  # @option options [ Hash ] :let Mapping of variables to use in the command.
866
937
  # See the server documentation for details.
867
938
  #
@@ -884,6 +955,10 @@ module Mongo
884
955
  # @option options [ Session ] :session The session to use.
885
956
  # @option options [ Hash | String ] :hint The index to use for this operation.
886
957
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
958
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
959
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
960
+ # The default value is unset which means the value is inherited from
961
+ # the collection or the database or the client.
887
962
  # @option options [ Hash ] :let Mapping of variables to use in the command.
888
963
  # See the server documentation for details.
889
964
  #
@@ -906,6 +981,10 @@ module Mongo
906
981
  # @option options [ Session ] :session The session to use.
907
982
  # @option options [ Hash | String ] :hint The index to use for this operation.
908
983
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
984
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
985
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
986
+ # The default value is unset which means the value is inherited from
987
+ # the collection or the database or the client.
909
988
  # @option options [ Hash ] :let Mapping of variables to use in the command.
910
989
  # See the server documentation for details.
911
990
  #
@@ -928,15 +1007,23 @@ module Mongo
928
1007
  # @param [ Integer ] cursor_count The max number of cursors to return.
929
1008
  # @param [ Hash ] options The parallel scan command options.
930
1009
  #
931
- # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command
932
- # to run in milliseconds.
1010
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
1011
+ # allow the query to run, in milliseconds. This option is deprecated, use
1012
+ # :timeout_ms instead.
933
1013
  # @option options [ Session ] :session The session to use.
1014
+ # @option options [ :cursor_lifetime | :iteration ] :timeout_mode How to interpret
1015
+ # :timeout_ms (whether it applies to the lifetime of the cursor, or per
1016
+ # iteration).
1017
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1018
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1019
+ # The default value is unset which means the value is inherited from
1020
+ # the collection or the database or the client.
934
1021
  #
935
1022
  # @return [ Array<Cursor> ] An array of cursors.
936
1023
  #
937
1024
  # @since 2.1
938
1025
  def parallel_scan(cursor_count, options = {})
939
- find({}, options).send(:parallel_scan, cursor_count, options)
1026
+ find({}, options).parallel_scan(cursor_count, options)
940
1027
  end
941
1028
 
942
1029
  # Replaces a single document in the collection with the new document.
@@ -954,6 +1041,10 @@ module Mongo
954
1041
  # not to skip document level validation.
955
1042
  # @option options [ Hash ] :collation The collation to use.
956
1043
  # @option options [ Session ] :session The session to use.
1044
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1045
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1046
+ # The default value is unset which means the value is inherited from
1047
+ # the collection or the database or the client.
957
1048
  # @option options [ Hash | String ] :hint The index to use for this operation.
958
1049
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
959
1050
  # @option options [ Hash ] :let Mapping of variables to use in the command.
@@ -983,6 +1074,10 @@ module Mongo
983
1074
  # @option options [ Array ] :array_filters A set of filters specifying to which array elements
984
1075
  # an update should apply.
985
1076
  # @option options [ Session ] :session The session to use.
1077
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1078
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1079
+ # The default value is unset which means the value is inherited from
1080
+ # the collection or the database or the client.
986
1081
  # @option options [ Hash | String ] :hint The index to use for this operation.
987
1082
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
988
1083
  # @option options [ Hash ] :let Mapping of variables to use in the command.
@@ -1012,6 +1107,10 @@ module Mongo
1012
1107
  # @option options [ Array ] :array_filters A set of filters specifying to which array elements
1013
1108
  # an update should apply.
1014
1109
  # @option options [ Session ] :session The session to use.
1110
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1111
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1112
+ # The default value is unset which means the value is inherited from
1113
+ # the collection or the database or the client.
1015
1114
  # @option options [ Hash | String ] :hint The index to use for this operation.
1016
1115
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
1017
1116
  # @option options [ Hash ] :let Mapping of variables to use in the command.
@@ -1033,8 +1132,9 @@ module Mongo
1033
1132
  # @param [ Hash ] filter The filter to use.
1034
1133
  # @param [ Hash ] options The options.
1035
1134
  #
1036
- # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command
1037
- # to run in milliseconds.
1135
+ # @option options [ Integer ] :max_time_ms The maximum amount of time to
1136
+ # allow the query to run, in milliseconds. This option is deprecated, use
1137
+ # :timeout_ms instead.
1038
1138
  # @option options [ Hash ] :projection The fields to include or exclude in the returned doc.
1039
1139
  # @option options [ Hash ] :sort The key and direction pairs by which the result set
1040
1140
  # will be sorted.
@@ -1042,6 +1142,10 @@ module Mongo
1042
1142
  # Defaults to the collection's write concern.
1043
1143
  # @option options [ Hash ] :collation The collation to use.
1044
1144
  # @option options [ Session ] :session The session to use.
1145
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1146
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1147
+ # The default value is unset which means the value is inherited from
1148
+ # the collection or the database or the client.
1045
1149
  # @option options [ Hash | String ] :hint The index to use for this operation.
1046
1150
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
1047
1151
  # @option options [ Hash ] :let Mapping of variables to use in the command.
@@ -1086,6 +1190,10 @@ module Mongo
1086
1190
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
1087
1191
  # @option options [ Hash ] :let Mapping of variables to use in the command.
1088
1192
  # See the server documentation for details.
1193
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1194
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1195
+ # The default value is unset which means the value is inherited from
1196
+ # the collection or the database or the client.
1089
1197
  #
1090
1198
  # @return [ BSON::Document ] The document.
1091
1199
  #
@@ -1122,6 +1230,10 @@ module Mongo
1122
1230
  # @option options [ Session ] :session The session to use.
1123
1231
  # @option options [ Hash | String ] :hint The index to use for this operation.
1124
1232
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
1233
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
1234
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
1235
+ # The default value is unset which means the value is inherited from
1236
+ # the collection or the database or the client.
1125
1237
  # @option options [ Hash ] :let Mapping of variables to use in the command.
1126
1238
  # See the server documentation for details.
1127
1239
  #
@@ -1152,5 +1264,28 @@ module Mongo
1152
1264
  def system_collection?
1153
1265
  name.start_with?('system.')
1154
1266
  end
1267
+
1268
+ # @return [ Integer | nil ] Operation timeout that is for this database or
1269
+ # for the corresponding client.
1270
+ #
1271
+ # @api private
1272
+ def timeout_ms
1273
+ @timeout_ms || database.timeout_ms
1274
+ end
1275
+
1276
+ # @return [ Hash ] timeout_ms value set on the operation level (if any),
1277
+ # and/or timeout_ms that is set on collection/database/client level (if any).
1278
+ #
1279
+ # @api private
1280
+ def operation_timeouts(opts = {})
1281
+ # TODO: We should re-evaluate if we need two timeouts separately.
1282
+ {}.tap do |result|
1283
+ if opts[:timeout_ms].nil?
1284
+ result[:inherited_timeout_ms] = timeout_ms
1285
+ else
1286
+ result[:operation_timeout_ms] = opts.delete(:timeout_ms)
1287
+ end
1288
+ end
1289
+ end
1155
1290
  end
1156
1291
  end
@@ -119,8 +119,6 @@ module Mongo
119
119
  @options[:extra_options][:crypt_shared_lib_required]
120
120
 
121
121
  unless @options[:extra_options][:crypt_shared_lib_required] || @crypt_handle.crypt_shared_lib_available? || @options[:bypass_query_analysis]
122
- # Set server selection timeout to 1 to prevent the client waiting for a
123
- # long timeout before spawning mongocryptd
124
122
  @mongocryptd_client = Client.new(
125
123
  @options[:extra_options][:mongocryptd_uri],
126
124
  monitoring_io: @options[:client].options[:monitoring_io],
@@ -189,13 +187,13 @@ module Mongo
189
187
  # @param [ Hash ] command The command to be encrypted.
190
188
  #
191
189
  # @return [ BSON::Document ] The encrypted command.
192
- def encrypt(database_name, command)
190
+ def encrypt(database_name, command, timeout_holder)
193
191
  AutoEncryptionContext.new(
194
192
  @crypt_handle,
195
193
  @encryption_io,
196
194
  database_name,
197
195
  command
198
- ).run_state_machine
196
+ ).run_state_machine(timeout_holder)
199
197
  end
200
198
 
201
199
  # Decrypt a database command.
@@ -203,12 +201,12 @@ module Mongo
203
201
  # @param [ Hash ] command The command with encrypted fields.
204
202
  #
205
203
  # @return [ BSON::Document ] The decrypted command.
206
- def decrypt(command)
204
+ def decrypt(command, timeout_holder)
207
205
  AutoDecryptionContext.new(
208
206
  @crypt_handle,
209
207
  @encryption_io,
210
208
  command
211
- ).run_state_machine
209
+ ).run_state_machine(timeout_holder)
212
210
  end
213
211
 
214
212
  # Close the resources created by the AutoEncrypter.
@@ -1699,9 +1699,9 @@ module Mongo
1699
1699
  # @!method self.mongocrypt_ctx_setopt_algorithm_range(ctx, opts)
1700
1700
  # @api private
1701
1701
  #
1702
- # Set options for explicit encryption with the "rangePreview" algorithm.
1702
+ # Set options for explicit encryption with the "range" algorithm.
1703
1703
  #
1704
- # @note The RangePreview algorithm is experimental only. It is not intended for
1704
+ # @note The Range algorithm is experimental only. It is not intended for
1705
1705
  # public use.
1706
1706
  #
1707
1707
  # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
@@ -1718,9 +1718,9 @@ module Mongo
1718
1718
  :bool
1719
1719
  )
1720
1720
 
1721
- # Set options for explicit encryption with the "rangePreview" algorithm.
1721
+ # Set options for explicit encryption with the "range" algorithm.
1722
1722
  #
1723
- # @note The RangePreview algorithm is experimental only. It is not intended for
1723
+ # @note The Range algorithm is experimental only. It is not intended for
1724
1724
  # public use.
1725
1725
  #
1726
1726
  # @param [ Mongo::Crypt::Context ] context
@@ -64,7 +64,10 @@ module Mongo
64
64
  end
65
65
 
66
66
  # Runs the mongocrypt_ctx_t state machine and handles
67
- # all I/O on behalf of libmongocrypt
67
+ # all I/O on behalf of
68
+ #
69
+ # @param [ CsotTimeoutHolder ] timeout_holder CSOT timeouts for the
70
+ # operation the state.
68
71
  #
69
72
  # @return [ BSON::Document ] A BSON document representing the outcome
70
73
  # of the state machine. Contents can differ depending on how the
@@ -75,8 +78,9 @@ module Mongo
75
78
  #
76
79
  # This method is not currently unit tested. It is integration tested
77
80
  # in spec/integration/explicit_encryption_spec.rb
78
- def run_state_machine
81
+ def run_state_machine(timeout_holder)
79
82
  while true
83
+ timeout_ms = timeout_holder.remaining_timeout_ms!
80
84
  case state
81
85
  when :error
82
86
  Binding.check_ctx_status(self)
@@ -88,7 +92,7 @@ module Mongo
88
92
  when :need_mongo_keys
89
93
  filter = Binding.ctx_mongo_op(self)
90
94
 
91
- @encryption_io.find_keys(filter).each do |key|
95
+ @encryption_io.find_keys(filter, timeout_ms: timeout_ms).each do |key|
92
96
  mongocrypt_feed(key) if key
93
97
  end
94
98
 
@@ -96,14 +100,14 @@ module Mongo
96
100
  when :need_mongo_collinfo
97
101
  filter = Binding.ctx_mongo_op(self)
98
102
 
99
- result = @encryption_io.collection_info(@db_name, filter)
103
+ result = @encryption_io.collection_info(@db_name, filter, timeout_ms: timeout_ms)
100
104
  mongocrypt_feed(result) if result
101
105
 
102
106
  mongocrypt_done
103
107
  when :need_mongo_markings
104
108
  cmd = Binding.ctx_mongo_op(self)
105
109
 
106
- result = @encryption_io.mark_command(cmd)
110
+ result = @encryption_io.mark_command(cmd, timeout_ms: timeout_ms)
107
111
  mongocrypt_feed(result)
108
112
 
109
113
  mongocrypt_done
@@ -118,7 +122,7 @@ module Mongo
118
122
  when :need_kms_credentials
119
123
  Binding.ctx_provide_kms_providers(
120
124
  self,
121
- retrieve_kms_credentials.to_document
125
+ retrieve_kms_credentials(timeout_holder).to_document
122
126
  )
123
127
  else
124
128
  raise Error::CryptError.new(
@@ -147,13 +151,15 @@ module Mongo
147
151
  # Retrieves KMS credentials for providers that are configured
148
152
  # for automatic credentials retrieval.
149
153
  #
154
+ # @param [ CsotTimeoutHolder ] timeout_holder CSOT timeout.
155
+ #
150
156
  # @return [ Crypt::KMS::Credentials ] Credentials for the configured
151
157
  # KMS providers.
152
- def retrieve_kms_credentials
158
+ def retrieve_kms_credentials(timeout_holder)
153
159
  providers = {}
154
160
  if kms_providers.aws&.empty?
155
161
  begin
156
- aws_credentials = Mongo::Auth::Aws::CredentialsRetriever.new.credentials
162
+ aws_credentials = Mongo::Auth::Aws::CredentialsRetriever.new.credentials(timeout_holder)
157
163
  rescue Auth::Aws::CredentialsNotFound
158
164
  raise Error::CryptError.new(
159
165
  "Could not locate AWS credentials (checked environment variables, ECS and EC2 metadata)"
@@ -162,10 +168,10 @@ module Mongo
162
168
  providers[:aws] = aws_credentials.to_h
163
169
  end
164
170
  if kms_providers.gcp&.empty?
165
- providers[:gcp] = { access_token: gcp_access_token }
171
+ providers[:gcp] = { access_token: gcp_access_token(timeout_holder) }
166
172
  end
167
173
  if kms_providers.azure&.empty?
168
- providers[:azure] = { access_token: azure_access_token }
174
+ providers[:azure] = { access_token: azure_access_token(timeout_holder) }
169
175
  end
170
176
  KMS::Credentials.new(providers)
171
177
  end
@@ -175,8 +181,8 @@ module Mongo
175
181
  # @return [ String ] A GCP access token.
176
182
  #
177
183
  # @raise [ Error::CryptError ] If the GCP access token could not be
178
- def gcp_access_token
179
- KMS::GCP::CredentialsRetriever.fetch_access_token
184
+ def gcp_access_token(timeout_holder)
185
+ KMS::GCP::CredentialsRetriever.fetch_access_token(timeout_holder)
180
186
  rescue KMS::CredentialsNotFound => e
181
187
  raise Error::CryptError.new(
182
188
  "Could not locate GCP credentials: #{e.class}: #{e.message}"
@@ -189,9 +195,9 @@ module Mongo
189
195
  #
190
196
  # @raise [ Error::CryptError ] If the Azure access token could not be
191
197
  # retrieved.
192
- def azure_access_token
198
+ def azure_access_token(timeout_holder)
193
199
  if @cached_azure_token.nil? || @cached_azure_token.expired?
194
- @cached_azure_token = KMS::Azure::CredentialsRetriever.fetch_access_token
200
+ @cached_azure_token = KMS::Azure::CredentialsRetriever.fetch_access_token(timeout_holder: timeout_holder)
195
201
  end
196
202
  @cached_azure_token.access_token
197
203
  rescue KMS::CredentialsNotFound => e