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
@@ -38,7 +38,8 @@ module Mongo
38
38
  # @param [ Hash ] opts The options.
39
39
  #
40
40
  # @option opts [ Integer ] :max_time_ms The maximum amount of time to allow the command
41
- # to run in milliseconds.
41
+ # to run in milliseconds. This option is deprecated, use
42
+ # :timeout_ms instead.
42
43
  # @option opts [ Hash ] :projection The fields to include or exclude in the returned doc.
43
44
  # @option opts [ Hash ] :sort The key and direction pairs by which the result set
44
45
  # will be sorted.
@@ -46,11 +47,15 @@ module Mongo
46
47
  # @option opts [ Session ] :session The session to use.
47
48
  # @option opts [ Hash | String ] :hint The index to use for this operation.
48
49
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
50
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
51
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
52
+ # The default value is unset which means the value is inherited from
53
+ # the collection or the database or the client.
49
54
  # @option opts [ Hash ] :write_concern The write concern options.
50
55
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
51
- # @option options [ Hash ] :let Mapping of variables to use in the command.
56
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
52
57
  # See the server documentation for details.
53
- # @option options [ Object ] :comment A user-provided
58
+ # @option opts [ Object ] :comment A user-provided
54
59
  # comment to attach to this command.
55
60
  #
56
61
  # @return [ BSON::Document, nil ] The document, if found.
@@ -80,7 +85,11 @@ module Mongo
80
85
  comment: opts[:comment],
81
86
  }.compact
82
87
 
83
- context = Operation::Context.new(client: client, session: session)
88
+ context = Operation::Context.new(
89
+ client: client,
90
+ session: session,
91
+ operation_timeouts: operation_timeouts(opts)
92
+ )
84
93
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
85
94
  gte_4_4 = connection.server.description.server_version_gte?('4.4')
86
95
  if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -116,9 +125,13 @@ module Mongo
116
125
  # @option opts [ Hash ] :collation The collation to use.
117
126
  # @option opts [ Hash | String ] :hint The index to use for this operation.
118
127
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
128
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
129
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
130
+ # The default value is unset which means the value is inherited from
131
+ # the collection or the database or the client.
119
132
  # @option opts [ Hash ] :write_concern The write concern options.
120
133
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
121
- # @option options [ Hash ] :let Mapping of variables to use in the command.
134
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
122
135
  # See the server documentation for details.
123
136
  #
124
137
  # @return [ BSON::Document ] The document.
@@ -136,8 +149,9 @@ module Mongo
136
149
  # @param [ BSON::Document ] document The updates.
137
150
  # @param [ Hash ] opts The options.
138
151
  #
139
- # @option options [ Integer ] :max_time_ms The maximum amount of time to allow the command
140
- # to run in milliseconds.
152
+ # @option opts [ Integer ] :max_time_ms The maximum amount of time to allow the command
153
+ # to run in milliseconds. This option is deprecated, use
154
+ # :timeout_ms instead.
141
155
  # @option opts [ Hash ] :projection The fields to include or exclude in the returned doc.
142
156
  # @option opts [ Hash ] :sort The key and direction pairs by which the result set
143
157
  # will be sorted.
@@ -149,13 +163,17 @@ module Mongo
149
163
  # @option opts [ Array ] :array_filters A set of filters specifying to which array elements
150
164
  # an update should apply.
151
165
  # @option opts [ Session ] :session The session to use.
166
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
167
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
168
+ # The default value is unset which means the value is inherited from
169
+ # the collection or the database or the client.
152
170
  # @option opts [ Hash | String ] :hint The index to use for this operation.
153
171
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
154
172
  # @option opts [ Hash ] :write_concern The write concern options.
155
173
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
156
- # @option options [ Hash ] :let Mapping of variables to use in the command.
174
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
157
175
  # See the server documentation for details.
158
- # @option options [ Object ] :comment A user-provided
176
+ # @option opts [ Object ] :comment A user-provided
159
177
  # comment to attach to this command.
160
178
  #
161
179
  # @return [ BSON::Document | nil ] The document or nil if none is found.
@@ -188,7 +206,11 @@ module Mongo
188
206
  comment: opts[:comment]
189
207
  }.compact
190
208
 
191
- context = Operation::Context.new(client: client, session: session)
209
+ context = Operation::Context.new(
210
+ client: client,
211
+ session: session,
212
+ operation_timeouts: operation_timeouts(opts)
213
+ )
192
214
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
193
215
  gte_4_4 = connection.server.description.server_version_gte?('4.4')
194
216
  if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -216,13 +238,17 @@ module Mongo
216
238
  #
217
239
  # @option opts [ Hash ] :collation The collation to use.
218
240
  # @option opts [ Session ] :session The session to use.
241
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
242
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
243
+ # The default value is unset which means the value is inherited from
244
+ # the collection or the database or the client.
219
245
  # @option opts [ Hash | String ] :hint The index to use for this operation.
220
246
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
221
247
  # @option opts [ Hash ] :write_concern The write concern options.
222
248
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
223
- # @option options [ Hash ] :let Mapping of variables to use in the command.
249
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
224
250
  # See the server documentation for details.
225
- # @option options [ Object ] :comment A user-provided
251
+ # @option opts [ Object ] :comment A user-provided
226
252
  # comment to attach to this command.
227
253
  #
228
254
  # @return [ Result ] The response from the database.
@@ -244,8 +270,11 @@ module Mongo
244
270
  hint: opts[:hint],
245
271
  collation: opts[:collation] || opts['collation'] || collation,
246
272
  }.compact
247
-
248
- context = Operation::Context.new(client: client, session: session)
273
+ context = Operation::Context.new(
274
+ client: client,
275
+ session: session,
276
+ operation_timeouts: operation_timeouts(opts)
277
+ )
249
278
  nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
250
279
  gte_4_4 = connection.server.description.server_version_gte?('4.4')
251
280
  if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -274,15 +303,19 @@ module Mongo
274
303
  # @param [ Hash ] opts The options.
275
304
  #
276
305
  # @option opts [ Hash ] :collation The collation to use.
277
- # @option opts [ Session ] :session The session to use.
306
+ # @option opts [ Object ] :comment A user-provided
307
+ # comment to attach to this command.
278
308
  # @option opts [ Hash | String ] :hint The index to use for this operation.
279
309
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
310
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
311
+ # See the server documentation for details.
312
+ # @option opts [ Session ] :session The session to use.
313
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
314
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
315
+ # The default value is unset which means the value is inherited from
316
+ # the collection or the database or the client.
280
317
  # @option opts [ Hash ] :write_concern The write concern options.
281
318
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
282
- # @option options [ Hash ] :let Mapping of variables to use in the command.
283
- # See the server documentation for details.
284
- # @option options [ Object ] :comment A user-provided
285
- # comment to attach to this command.
286
319
  #
287
320
  # @return [ Result ] The response from the database.
288
321
  #
@@ -304,7 +337,11 @@ module Mongo
304
337
  collation: opts[:collation] || opts['collation'] || collation,
305
338
  }.compact
306
339
 
307
- context = Operation::Context.new(client: client, session: session)
340
+ context = Operation::Context.new(
341
+ client: client,
342
+ session: session,
343
+ operation_timeouts: operation_timeouts(opts)
344
+ )
308
345
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
309
346
  gte_4_4 = connection.server.description.server_version_gte?('4.4')
310
347
  if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -334,20 +371,24 @@ module Mongo
334
371
  # @param [ Hash ] replacement The replacement document.
335
372
  # @param [ Hash ] opts The options.
336
373
  #
337
- # @option opts [ true, false ] :upsert Whether to upsert if the
338
- # document doesn't exist.
339
374
  # @option opts [ true, false ] :bypass_document_validation Whether or
340
375
  # not to skip document level validation.
341
376
  # @option opts [ Hash ] :collation The collation to use.
342
- # @option opts [ Session ] :session The session to use.
377
+ # @option opts [ Object ] :comment A user-provided
378
+ # comment to attach to this command.
343
379
  # @option opts [ Hash | String ] :hint The index to use for this operation.
344
380
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
381
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
382
+ # See the server documentation for details.
383
+ # @option opts [ Session ] :session The session to use.
384
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
385
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
386
+ # The default value is unset which means the value is inherited from
387
+ # the collection or the database or the client.
345
388
  # @option opts [ Hash ] :write_concern The write concern options.
389
+ # @option opts [ true, false ] :upsert Whether to upsert if the
390
+ # document doesn't exist.
346
391
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
347
- # @option options [ Hash ] :let Mapping of variables to use in the command.
348
- # See the server documentation for details.
349
- # @option options [ Object ] :comment A user-provided
350
- # comment to attach to this command.
351
392
  #
352
393
  # @return [ Result ] The response from the database.
353
394
  #
@@ -374,7 +415,11 @@ module Mongo
374
415
  update_doc['upsert'] = true
375
416
  end
376
417
 
377
- context = Operation::Context.new(client: client, session: session)
418
+ context = Operation::Context.new(
419
+ client: client,
420
+ session: session,
421
+ operation_timeouts: operation_timeouts(opts)
422
+ )
378
423
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
379
424
  gte_4_2 = connection.server.description.server_version_gte?('4.2')
380
425
  if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -404,22 +449,26 @@ module Mongo
404
449
  # @param [ Hash | Array<Hash> ] spec The update document or pipeline.
405
450
  # @param [ Hash ] opts The options.
406
451
  #
407
- # @option opts [ true, false ] :upsert Whether to upsert if the
408
- # document doesn't exist.
452
+ # @option opts [ Array ] :array_filters A set of filters specifying to
453
+ # which array elements an update should apply.
409
454
  # @option opts [ true, false ] :bypass_document_validation Whether or
410
455
  # not to skip document level validation.
411
456
  # @option opts [ Hash ] :collation The collation to use.
412
- # @option opts [ Array ] :array_filters A set of filters specifying to
413
- # which array elements an update should apply.
414
- # @option opts [ Session ] :session The session to use.
457
+ # @option opts [ Object ] :comment A user-provided
458
+ # comment to attach to this command.
415
459
  # @option opts [ Hash | String ] :hint The index to use for this operation.
416
460
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
461
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
462
+ # See the server documentation for details.
463
+ # @option opts [ Session ] :session The session to use.
464
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
465
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
466
+ # The default value is unset which means the value is inherited from
467
+ # the collection or the database or the client.
468
+ # @option opts [ true, false ] :upsert Whether to upsert if the
469
+ # document doesn't exist.
417
470
  # @option opts [ Hash ] :write_concern The write concern options.
418
471
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
419
- # @option options [ Hash ] :let Mapping of variables to use in the command.
420
- # See the server documentation for details.
421
- # @option options [ Object ] :comment A user-provided
422
- # comment to attach to this command.
423
472
  #
424
473
  # @return [ Result ] The response from the database.
425
474
  #
@@ -447,7 +496,11 @@ module Mongo
447
496
  update_doc['upsert'] = true
448
497
  end
449
498
 
450
- context = Operation::Context.new(client: client, session: session)
499
+ context = Operation::Context.new(
500
+ client: client,
501
+ session: session,
502
+ operation_timeouts: operation_timeouts(opts)
503
+ )
451
504
  nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
452
505
  gte_4_2 = connection.server.description.server_version_gte?('4.2')
453
506
  if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -476,22 +529,26 @@ module Mongo
476
529
  # @param [ Hash | Array<Hash> ] spec The update document or pipeline.
477
530
  # @param [ Hash ] opts The options.
478
531
  #
479
- # @option opts [ true, false ] :upsert Whether to upsert if the
480
- # document doesn't exist.
532
+ # @option opts [ Array ] :array_filters A set of filters specifying to
533
+ # which array elements an update should apply.
481
534
  # @option opts [ true, false ] :bypass_document_validation Whether or
482
535
  # not to skip document level validation.
483
536
  # @option opts [ Hash ] :collation The collation to use.
484
- # @option opts [ Array ] :array_filters A set of filters specifying to
485
- # which array elements an update should apply.
486
- # @option opts [ Session ] :session The session to use.
537
+ # @option opts [ Object ] :comment A user-provided
538
+ # comment to attach to this command.
487
539
  # @option opts [ Hash | String ] :hint The index to use for this operation.
488
540
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
541
+ # @option opts [ Hash ] :let Mapping of variables to use in the command.
542
+ # See the server documentation for details.
543
+ # @option opts [ Session ] :session The session to use.
544
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
545
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
546
+ # The default value is unset which means the value is inherited from
547
+ # the collection or the database or the client.
548
+ # @option opts [ true, false ] :upsert Whether to upsert if the
549
+ # document doesn't exist.
489
550
  # @option opts [ Hash ] :write_concern The write concern options.
490
551
  # Can be :w => Integer, :fsync => Boolean, :j => Boolean.
491
- # @option options [ Hash ] :let Mapping of variables to use in the command.
492
- # See the server documentation for details.
493
- # @option options [ Object ] :comment A user-provided
494
- # comment to attach to this command.
495
552
  #
496
553
  # @return [ Result ] The response from the database.
497
554
  #
@@ -518,7 +575,11 @@ module Mongo
518
575
  update_doc['upsert'] = true
519
576
  end
520
577
 
521
- context = Operation::Context.new(client: client, session: session)
578
+ context = Operation::Context.new(
579
+ client: client,
580
+ session: session,
581
+ operation_timeouts: operation_timeouts(opts)
582
+ )
522
583
  write_with_retry(write_concern, context: context) do |connection, txn_num, context|
523
584
  gte_4_2 = connection.server.description.server_version_gte?('4.2')
524
585
  if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
@@ -63,10 +63,10 @@ module Mongo
63
63
  :client,
64
64
  :cluster,
65
65
  :database,
66
+ :nro_write_with_retry,
66
67
  :read_with_retry,
67
68
  :read_with_retry_cursor,
68
69
  :write_with_retry,
69
- :nro_write_with_retry,
70
70
  :write_concern_with_session
71
71
 
72
72
  # Delegate to the cluster for the next primary.
@@ -74,6 +74,12 @@ module Mongo
74
74
 
75
75
  alias :selector :filter
76
76
 
77
+ # @return [ Integer | nil | The timeout_ms value that was passed as an
78
+ # option to the view.
79
+ #
80
+ # @api private
81
+ attr_reader :operation_timeout_ms
82
+
77
83
  # Compare two +View+ objects.
78
84
  #
79
85
  # @example Compare the view with another object.
@@ -151,15 +157,26 @@ module Mongo
151
157
  # document more than once. Deprecated as of MongoDB server version 4.0.
152
158
  # @option options [ Hash ] :sort The key and direction pairs used to sort
153
159
  # the results.
160
+ # @option options [ :cursor_lifetime | :iteration ] :timeout_mode How to interpret
161
+ # :timeout_ms (whether it applies to the lifetime of the cursor, or per
162
+ # iteration).
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 collection or the database or the client.
154
167
  #
155
168
  # @since 2.0.0
156
169
  def initialize(collection, filter = {}, options = {})
157
170
  validate_doc!(filter)
158
- @collection = collection
159
171
 
160
172
  filter = BSON::Document.new(filter)
161
173
  options = BSON::Document.new(options)
162
174
 
175
+ @collection = collection
176
+ @operation_timeout_ms = options.delete(:timeout_ms)
177
+
178
+ validate_timeout_mode!(options)
179
+
163
180
  # This is when users pass $query in filter and other modifiers
164
181
  # alongside?
165
182
  query = filter.delete(:$query)
@@ -171,6 +188,14 @@ module Mongo
171
188
  @options = Operation::Find::Builder::Modifiers.map_driver_options(modifiers).merge!(options).freeze
172
189
  end
173
190
 
191
+ # The timeout_ms value to use for this operation; either specified as an
192
+ # option to the view, or inherited from the collection.
193
+ #
194
+ # @return [ Integer | nil ] the timeout_ms for this operation
195
+ def timeout_ms
196
+ operation_timeout_ms || collection.timeout_ms
197
+ end
198
+
174
199
  # Get a human-readable string representation of +View+.
175
200
  #
176
201
  # @example Get the inspection.
@@ -196,6 +221,20 @@ module Mongo
196
221
  WriteConcern.get(options[:write_concern] || options[:write] || collection.write_concern)
197
222
  end
198
223
 
224
+ # @return [ Hash ] timeout_ms value set on the operation level (if any),
225
+ # and/or timeout_ms that is set on collection/database/client level (if any).
226
+ #
227
+ # @api private
228
+ def operation_timeouts(opts = {})
229
+ {}.tap do |result|
230
+ if opts[:timeout_ms] || operation_timeout_ms
231
+ result[:operation_timeout_ms] = opts[:timeout_ms] || operation_timeout_ms
232
+ else
233
+ result[:inherited_timeout_ms] = collection.timeout_ms
234
+ end
235
+ end
236
+ end
237
+
199
238
  private
200
239
 
201
240
  def initialize_copy(other)
@@ -205,13 +244,14 @@ module Mongo
205
244
  end
206
245
 
207
246
  def new(options)
247
+ options = options.merge(timeout_ms: operation_timeout_ms) if operation_timeout_ms
208
248
  View.new(collection, filter, options)
209
249
  end
210
250
 
211
251
  def view; self; end
212
252
 
213
253
  def with_session(opts = {}, &block)
214
- client.send(:with_session, @options.merge(opts), &block)
254
+ client.with_session(@options.merge(opts), &block)
215
255
  end
216
256
  end
217
257
  end