mongo 2.19.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 (356) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  3. data/Rakefile +83 -174
  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/topology/base.rb +16 -0
  13. data/lib/mongo/cluster.rb +41 -5
  14. data/lib/mongo/collection/helpers.rb +1 -1
  15. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  16. data/lib/mongo/collection/view/aggregation.rb +33 -99
  17. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  18. data/lib/mongo/collection/view/change_stream.rb +80 -27
  19. data/lib/mongo/collection/view/iterable.rb +92 -60
  20. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  21. data/lib/mongo/collection/view/readable.rb +79 -30
  22. data/lib/mongo/collection/view/writable.rb +109 -48
  23. data/lib/mongo/collection/view.rb +44 -3
  24. data/lib/mongo/collection.rb +185 -26
  25. data/lib/mongo/config.rb +2 -2
  26. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  27. data/lib/mongo/crypt/binding.rb +4 -4
  28. data/lib/mongo/crypt/context.rb +20 -14
  29. data/lib/mongo/crypt/encryption_io.rb +56 -26
  30. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  31. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  32. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  33. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  34. data/lib/mongo/csot_timeout_holder.rb +119 -0
  35. data/lib/mongo/cursor/kill_spec.rb +5 -2
  36. data/lib/mongo/cursor/nontailable.rb +27 -0
  37. data/lib/mongo/cursor.rb +86 -24
  38. data/lib/mongo/cursor_host.rb +82 -0
  39. data/lib/mongo/database/view.rb +81 -14
  40. data/lib/mongo/database.rb +88 -18
  41. data/lib/mongo/error/operation_failure.rb +209 -204
  42. data/lib/mongo/error/server_timeout_error.rb +12 -0
  43. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  44. data/lib/mongo/error/timeout_error.rb +23 -0
  45. data/lib/mongo/error/transactions_not_supported.rb +34 -0
  46. data/lib/mongo/error.rb +3 -0
  47. data/lib/mongo/grid/fs_bucket.rb +48 -9
  48. data/lib/mongo/grid/stream/read.rb +15 -1
  49. data/lib/mongo/grid/stream/write.rb +21 -4
  50. data/lib/mongo/index/view.rb +77 -16
  51. data/lib/mongo/monitoring/event/secure.rb +1 -1
  52. data/lib/mongo/operation/context.rb +40 -2
  53. data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
  54. data/lib/mongo/operation/create_search_indexes.rb +15 -0
  55. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  56. data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
  57. data/lib/mongo/operation/drop_search_index.rb +15 -0
  58. data/lib/mongo/operation/find/op_msg.rb +45 -0
  59. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  60. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  61. data/lib/mongo/operation/insert/result.rb +4 -2
  62. data/lib/mongo/operation/list_collections/result.rb +1 -1
  63. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  64. data/lib/mongo/operation/op_msg_base.rb +3 -1
  65. data/lib/mongo/operation/result.rb +26 -5
  66. data/lib/mongo/operation/shared/executable.rb +55 -28
  67. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  68. data/lib/mongo/operation/shared/response_handling.rb +25 -27
  69. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  70. data/lib/mongo/operation/shared/specifiable.rb +7 -0
  71. data/lib/mongo/operation/shared/timed.rb +52 -0
  72. data/lib/mongo/operation/shared/write.rb +4 -1
  73. data/lib/mongo/operation/update/op_msg.rb +2 -1
  74. data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
  75. data/lib/mongo/operation/update_search_index.rb +15 -0
  76. data/lib/mongo/operation.rb +4 -0
  77. data/lib/mongo/protocol/message.rb +1 -4
  78. data/lib/mongo/protocol/msg.rb +2 -2
  79. data/lib/mongo/retryable/base_worker.rb +28 -3
  80. data/lib/mongo/retryable/read_worker.rb +78 -36
  81. data/lib/mongo/retryable/write_worker.rb +59 -25
  82. data/lib/mongo/retryable.rb +8 -2
  83. data/lib/mongo/search_index/view.rb +232 -0
  84. data/lib/mongo/server/app_metadata/environment.rb +64 -9
  85. data/lib/mongo/server/app_metadata.rb +5 -4
  86. data/lib/mongo/server/connection.rb +11 -5
  87. data/lib/mongo/server/connection_base.rb +22 -2
  88. data/lib/mongo/server/connection_pool.rb +32 -14
  89. data/lib/mongo/server/description/features.rb +2 -1
  90. data/lib/mongo/server/description.rb +18 -5
  91. data/lib/mongo/server/monitor.rb +7 -4
  92. data/lib/mongo/server/pending_connection.rb +25 -8
  93. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  94. data/lib/mongo/server.rb +11 -6
  95. data/lib/mongo/server_selector/base.rb +54 -12
  96. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  97. data/lib/mongo/session/server_session.rb +3 -0
  98. data/lib/mongo/session/session_pool.rb +12 -18
  99. data/lib/mongo/session.rb +110 -9
  100. data/lib/mongo/socket/ssl.rb +131 -18
  101. data/lib/mongo/socket/tcp.rb +40 -6
  102. data/lib/mongo/socket.rb +154 -25
  103. data/lib/mongo/uri/options_mapper.rb +1 -0
  104. data/lib/mongo/uri.rb +0 -4
  105. data/lib/mongo/version.rb +1 -5
  106. data/lib/mongo.rb +2 -0
  107. data/mongo.gemspec +9 -18
  108. data/spec/atlas/atlas_connectivity_spec.rb +9 -9
  109. data/spec/atlas/operations_spec.rb +5 -5
  110. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  111. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  112. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  113. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  114. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  115. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +10 -2
  117. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  118. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +67 -20
  119. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  120. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  121. data/spec/integration/cursor_pinning_spec.rb +15 -60
  122. data/spec/integration/cursor_reaping_spec.rb +1 -1
  123. data/spec/integration/docs_examples_spec.rb +1 -1
  124. data/spec/integration/find_options_spec.rb +227 -0
  125. data/spec/integration/operation_failure_code_spec.rb +1 -1
  126. data/spec/integration/operation_failure_message_spec.rb +3 -3
  127. data/spec/integration/retryable_errors_spec.rb +2 -2
  128. data/spec/integration/retryable_reads_errors_spec.rb +196 -31
  129. data/spec/integration/retryable_writes_errors_spec.rb +156 -0
  130. data/spec/integration/sdam_error_handling_spec.rb +4 -1
  131. data/spec/integration/search_indexes_prose_spec.rb +172 -0
  132. data/spec/integration/server_spec.rb +4 -3
  133. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  134. data/spec/kerberos/kerberos_spec.rb +4 -0
  135. data/spec/lite_spec_helper.rb +34 -20
  136. data/spec/mongo/auth/user/view_spec.rb +1 -1
  137. data/spec/mongo/caching_cursor_spec.rb +1 -1
  138. data/spec/mongo/client_encryption_spec.rb +1 -0
  139. data/spec/mongo/client_spec.rb +158 -4
  140. data/spec/mongo/cluster_spec.rb +36 -0
  141. data/spec/mongo/collection/view/aggregation_spec.rb +20 -40
  142. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  143. data/spec/mongo/collection/view/explainable_spec.rb +2 -0
  144. data/spec/mongo/collection_crud_spec.rb +2 -1
  145. data/spec/mongo/collection_spec.rb +5 -6
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  147. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  148. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  149. data/spec/mongo/crypt/handle_spec.rb +1 -1
  150. data/spec/mongo/cursor_spec.rb +26 -9
  151. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  152. data/spec/mongo/operation/context_spec.rb +79 -0
  153. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  154. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  155. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  156. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  157. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  158. data/spec/mongo/operation/insert_spec.rb +1 -1
  159. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  160. data/spec/mongo/query_cache_spec.rb +243 -225
  161. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  162. data/spec/mongo/retryable_spec.rb +1 -0
  163. data/spec/mongo/server/app_metadata/environment_spec.rb +135 -0
  164. data/spec/mongo/server/app_metadata_spec.rb +12 -2
  165. data/spec/mongo/server/connection_spec.rb +26 -0
  166. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  167. data/spec/mongo/session/session_pool_spec.rb +1 -16
  168. data/spec/mongo/session_transaction_spec.rb +15 -0
  169. data/spec/mongo/socket/ssl_spec.rb +0 -10
  170. data/spec/mongo/uri_spec.rb +0 -9
  171. data/spec/runners/change_streams/test.rb +2 -2
  172. data/spec/runners/crud/operation.rb +1 -1
  173. data/spec/runners/crud/test.rb +0 -8
  174. data/spec/runners/crud/verifier.rb +3 -1
  175. data/spec/runners/crud.rb +1 -1
  176. data/spec/runners/transactions/operation.rb +4 -6
  177. data/spec/runners/transactions/test.rb +12 -3
  178. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  179. data/spec/runners/unified/assertions.rb +20 -3
  180. data/spec/runners/unified/change_stream_operations.rb +14 -24
  181. data/spec/runners/unified/crud_operations.rb +82 -47
  182. data/spec/runners/unified/ddl_operations.rb +38 -7
  183. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  184. data/spec/runners/unified/search_index_operations.rb +63 -0
  185. data/spec/runners/unified/support_operations.rb +46 -9
  186. data/spec/runners/unified/test.rb +33 -12
  187. data/spec/runners/unified.rb +1 -1
  188. data/spec/solo/clean_exit_spec.rb +2 -0
  189. data/spec/spec_helper.rb +1 -1
  190. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  191. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  192. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  193. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  194. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  195. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  196. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  197. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  198. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  199. data/spec/spec_tests/data/client_side_encryption/explain.yml +2 -2
  200. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +1 -0
  201. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +1 -0
  202. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +1 -0
  203. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +1 -0
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +1 -0
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +1 -0
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +1 -0
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +1 -0
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +1 -0
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +1 -0
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +1 -0
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +1 -0
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +1 -0
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +1 -0
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +2 -1
  215. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  216. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  217. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  218. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  219. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  220. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  221. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  222. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  223. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  224. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  225. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  226. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  227. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  228. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  229. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  230. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  231. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  232. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  233. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  234. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  235. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  236. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  237. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  238. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  239. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  240. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  241. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  242. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  243. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
  244. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
  245. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +377 -0
  246. data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
  247. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
  248. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
  249. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
  250. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
  251. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +3 -6
  252. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +3 -6
  253. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  254. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  255. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +1 -1
  256. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +7 -7
  257. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  258. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  259. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  260. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -3
  261. data/spec/spec_tests/index_management_unified_spec.rb +13 -0
  262. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  263. data/spec/spec_tests/sdam_unified_spec.rb +2 -0
  264. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  265. data/spec/spec_tests/transactions_unified_spec.rb +2 -1
  266. data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
  267. data/spec/support/certificates/atlas-ocsp.crt +117 -122
  268. data/spec/support/certificates/retrieve-atlas-cert +1 -1
  269. data/spec/support/cluster_tools.rb +3 -3
  270. data/spec/support/common_shortcuts.rb +2 -2
  271. data/spec/support/constraints.rb +6 -0
  272. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  273. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  274. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  275. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  276. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  277. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  278. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  279. data/spec/support/ocsp +1 -1
  280. data/spec/support/recording_logger.rb +27 -0
  281. data/spec/support/shared/session.rb +2 -2
  282. data/spec/support/spec_config.rb +5 -0
  283. data/spec/support/spec_setup.rb +2 -2
  284. data/spec/support/utils.rb +3 -1
  285. metadata +1329 -1368
  286. checksums.yaml.gz.sig +0 -0
  287. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  288. data/spec/shared/LICENSE +0 -20
  289. data/spec/shared/bin/get-mongodb-download-url +0 -17
  290. data/spec/shared/bin/s3-copy +0 -45
  291. data/spec/shared/bin/s3-upload +0 -69
  292. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  293. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  294. data/spec/shared/lib/mrss/constraints.rb +0 -378
  295. data/spec/shared/lib/mrss/docker_runner.rb +0 -295
  296. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  297. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  298. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  299. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  300. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  301. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  302. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  303. data/spec/shared/lib/mrss/utils.rb +0 -37
  304. data/spec/shared/share/Dockerfile.erb +0 -330
  305. data/spec/shared/share/haproxy-1.conf +0 -16
  306. data/spec/shared/share/haproxy-2.conf +0 -17
  307. data/spec/shared/shlib/config.sh +0 -27
  308. data/spec/shared/shlib/distro.sh +0 -74
  309. data/spec/shared/shlib/server.sh +0 -416
  310. data/spec/shared/shlib/set_env.sh +0 -169
  311. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -241
  312. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -422
  313. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -182
  314. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -239
  315. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -235
  316. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -252
  317. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1687
  318. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -293
  319. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -905
  320. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1684
  321. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1680
  322. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1697
  323. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -329
  324. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -424
  325. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -226
  326. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -327
  327. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -319
  328. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -336
  329. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -913
  330. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -292
  331. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -518
  332. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -911
  333. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -907
  334. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -924
  335. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -325
  336. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -424
  337. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -224
  338. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -323
  339. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -319
  340. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -338
  341. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -241
  342. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -423
  343. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -182
  344. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -239
  345. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -235
  346. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -254
  347. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -241
  348. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -422
  349. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -182
  350. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -239
  351. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -235
  352. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -254
  353. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -43
  354. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +0 -49
  355. data.tar.gz.sig +0 -0
  356. metadata.gz.sig +0 -2
@@ -51,7 +51,7 @@ module Mongo
51
51
  attr_reader :reduce_function
52
52
 
53
53
  # Delegate necessary operations to the view.
54
- def_delegators :view, :collection, :read, :cluster
54
+ def_delegators :view, :collection, :read, :cluster, :timeout_ms
55
55
 
56
56
  # Delegate necessary operations to the collection.
57
57
  def_delegators :collection, :database, :client
@@ -70,10 +70,18 @@ module Mongo
70
70
  # @yieldparam [ Hash ] Each matching document.
71
71
  def each
72
72
  @cursor = nil
73
- session = client.send(:get_session, @options)
73
+ session = client.get_session(@options)
74
74
  server = cluster.next_primary(nil, session)
75
- result = send_initial_query(server, session, context: Operation::Context.new(client: client, session: session))
76
- result = send_fetch_query(server, session) unless inline?
75
+ context = Operation::Context.new(client: client, session: session, operation_timeouts: view.operation_timeouts)
76
+ if server.load_balancer?
77
+ # Connection will be checked in when cursor is drained.
78
+ connection = server.pool.check_out(context: context)
79
+ result = send_initial_query_with_connection(connection, context.session, context: context)
80
+ result = send_fetch_query_with_connection(connection, session) unless inline?
81
+ else
82
+ result = send_initial_query(server, context)
83
+ result = send_fetch_query(server, session) unless inline?
84
+ end
77
85
  @cursor = Cursor.new(view, result, server, session: session)
78
86
  if block_given?
79
87
  @cursor.each do |doc|
@@ -279,9 +287,9 @@ module Mongo
279
287
  out.respond_to?(:keys) && out.keys.first.to_s.downcase == INLINE
280
288
  end
281
289
 
282
- def send_initial_query(server, session, context:)
290
+ def send_initial_query(server, context)
283
291
  server.with_connection do |connection|
284
- send_initial_query_with_connection(connection, session, context: context)
292
+ send_initial_query_with_connection(connection, context.session, context: context)
285
293
  end
286
294
  end
287
295
 
@@ -305,7 +313,7 @@ module Mongo
305
313
  Builder::MapReduce.new(map_function, reduce_function, view, options.merge(session: session)).command_specification
306
314
  end
307
315
 
308
- def fetch_query_op(server, session)
316
+ def fetch_query_op(session)
309
317
  spec = {
310
318
  coll_name: out_collection_name,
311
319
  db_name: out_database_name,
@@ -319,7 +327,16 @@ module Mongo
319
327
  end
320
328
 
321
329
  def send_fetch_query(server, session)
322
- fetch_query_op(server, session).execute(server, context: Operation::Context.new(client: client, session: session))
330
+ fetch_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
331
+ end
332
+
333
+ def send_fetch_query_with_connection(connection, session)
334
+ fetch_query_op(
335
+ session
336
+ ).execute_with_connection(
337
+ connection,
338
+ context: Operation::Context.new(client: client, session: session)
339
+ )
323
340
  end
324
341
  end
325
342
  end
@@ -47,12 +47,13 @@ module Mongo
47
47
  # @option options [ Hash ] :let Mapping of variables to use in the pipeline.
48
48
  # See the server documentation for details.
49
49
  # @option options [ Integer ] :max_time_ms The maximum amount of time in
50
- # milliseconds to allow the aggregation to run.
51
- # @option options [ true, false ] :use_cursor Indicates whether the command
52
- # will request that the server provide results using a cursor. Note that
53
- # as of server version 3.6, aggregations always provide results using a
54
- # cursor and this option is therefore not valid.
50
+ # milliseconds to allow the aggregation to run. This option is deprecated, use
51
+ # :timeout_ms instead.
55
52
  # @option options [ Session ] :session The session to use.
53
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
54
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
55
+ # The default value is unset which means the value is inherited from
56
+ # the collection or the database or the client.
56
57
  #
57
58
  # @return [ Aggregation ] The aggregation object.
58
59
  #
@@ -157,6 +158,10 @@ module Mongo
157
158
  # @option opts [ Mongo::Session ] :session The session to use for the operation.
158
159
  # @option opts [ Object ] :comment A user-provided
159
160
  # comment to attach to this command.
161
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
162
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
163
+ # The default value is unset which means the value is inherited from
164
+ # the collection or the database or the client.
160
165
  #
161
166
  # @return [ Integer ] The document count.
162
167
  #
@@ -182,7 +187,12 @@ module Mongo
182
187
  read_pref = opts[:read] || read_preference
183
188
  selector = ServerSelector.get(read_pref || server_selector)
184
189
  with_session(opts) do |session|
185
- read_with_retry(session, selector) do |server|
190
+ context = Operation::Context.new(
191
+ client: client,
192
+ session: session,
193
+ operation_timeouts: operation_timeouts(opts)
194
+ )
195
+ read_with_retry(session, selector, context) do |server|
186
196
  Operation::Count.new(
187
197
  selector: cmd,
188
198
  db_name: database.name,
@@ -193,7 +203,10 @@ module Mongo
193
203
  # string key. Note that this isn't documented as valid usage.
194
204
  collation: opts[:collation] || opts['collation'] || collation,
195
205
  comment: opts[:comment],
196
- ).execute(server, context: Operation::Context.new(client: client, session: session))
206
+ ).execute(
207
+ server,
208
+ context: context
209
+ )
197
210
  end.n.to_i
198
211
  end
199
212
  end
@@ -210,12 +223,17 @@ module Mongo
210
223
  # MongoDB to use a specific index for the query. Requires server version 3.6+.
211
224
  # @option opts :limit [ Integer ] Max number of docs to count.
212
225
  # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the
213
- # command to run.
226
+ # command to run. This option is deprecated, use
227
+ # :timeout_ms instead.
214
228
  # @option opts [ Hash ] :read The read preference options.
215
229
  # @option opts [ Hash ] :collation The collation to use.
216
230
  # @option opts [ Mongo::Session ] :session The session to use for the operation.
217
231
  # @option ops [ Object ] :comment A user-provided
218
232
  # comment to attach to this command.
233
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
234
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
235
+ # The default value is unset which means the value is inherited from
236
+ # the collection or the database or the client.
219
237
  #
220
238
  # @return [ Integer ] The document count.
221
239
  #
@@ -227,7 +245,7 @@ module Mongo
227
245
  pipeline << { :'$limit' => opts[:limit] } if opts[:limit]
228
246
  pipeline << { :'$group' => { _id: 1, n: { :'$sum' => 1 } } }
229
247
 
230
- opts = opts.slice(:hint, :max_time_ms, :read, :collation, :session, :comment)
248
+ opts = opts.slice(:hint, :max_time_ms, :read, :collation, :session, :comment, :timeout_ms)
231
249
  opts[:collation] ||= collation
232
250
 
233
251
  first = aggregate(pipeline, opts).first
@@ -247,6 +265,10 @@ module Mongo
247
265
  # @option opts [ Hash ] :read The read preference options.
248
266
  # @option opts [ Object ] :comment A user-provided
249
267
  # comment to attach to this command.
268
+ # @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
269
+ # Must be a non-negative integer. An explicit value of 0 means infinite.
270
+ # The default value is unset which means the value is inherited from
271
+ # the collection or the database or the client.
250
272
  #
251
273
  # @return [ Integer ] The document count.
252
274
  #
@@ -267,8 +289,12 @@ module Mongo
267
289
  read_pref = opts[:read] || read_preference
268
290
  selector = ServerSelector.get(read_pref || server_selector)
269
291
  with_session(opts) do |session|
270
- read_with_retry(session, selector) do |server|
271
- context = Operation::Context.new(client: client, session: session)
292
+ context = Operation::Context.new(
293
+ client: client,
294
+ session: session,
295
+ operation_timeouts: operation_timeouts(opts)
296
+ )
297
+ read_with_retry(session, selector, context) do |server|
272
298
  cmd = { count: collection.name }
273
299
  cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
274
300
  if read_concern
@@ -284,7 +310,7 @@ module Mongo
284
310
  result.n.to_i
285
311
  end
286
312
  end
287
- rescue Error::OperationFailure => exc
313
+ rescue Error::OperationFailure::Family => exc
288
314
  if exc.code == 26
289
315
  # NamespaceNotFound
290
316
  # This should only happen with the aggregation pipeline path
@@ -331,7 +357,12 @@ module Mongo
331
357
  read_pref = opts[:read] || read_preference
332
358
  selector = ServerSelector.get(read_pref || server_selector)
333
359
  with_session(opts) do |session|
334
- read_with_retry(session, selector) do |server|
360
+ context = Operation::Context.new(
361
+ client: client,
362
+ session: session,
363
+ operation_timeouts: operation_timeouts(opts)
364
+ )
365
+ read_with_retry(session, selector, context) do |server|
335
366
  Operation::Distinct.new(
336
367
  selector: cmd,
337
368
  db_name: database.name,
@@ -342,7 +373,10 @@ module Mongo
342
373
  # For some reason collation was historically accepted as a
343
374
  # string key. Note that this isn't documented as valid usage.
344
375
  collation: opts[:collation] || opts['collation'] || collation,
345
- ).execute(server, context: Operation::Context.new(client: client, session: session))
376
+ ).execute(
377
+ server,
378
+ context: context
379
+ )
346
380
  end.first['values']
347
381
  end
348
382
  end
@@ -627,6 +661,15 @@ module Mongo
627
661
  configure(:cursor_type, type)
628
662
  end
629
663
 
664
+ # The per-operation timeout in milliseconds. Must a positive integer.
665
+ #
666
+ # @param [ Integer ] timeout_ms Timeout value.
667
+ #
668
+ # @return [ Integer, View ] Either the timeout_ms value or a new +View+.
669
+ def timeout_ms(timeout_ms = nil)
670
+ configure(:timeout_ms, timeout_ms)
671
+ end
672
+
630
673
  # @api private
631
674
  def read_concern
632
675
  if options[:session] && options[:session].in_transaction?
@@ -656,24 +699,10 @@ module Mongo
656
699
  end
657
700
  end
658
701
 
659
- private
660
-
661
- def collation(doc = nil)
662
- configure(:collation, doc)
663
- end
664
-
665
- def server_selector
666
- @server_selector ||= if options[:session] && options[:session].in_transaction?
667
- ServerSelector.get(read_preference || client.server_selector)
668
- else
669
- ServerSelector.get(read_preference || collection.server_selector)
670
- end
671
- end
672
-
673
702
  def parallel_scan(cursor_count, options = {})
674
703
  if options[:session]
675
704
  # The session would be overwritten by the one in +options+ later.
676
- session = client.send(:get_session, @options)
705
+ session = client.get_session(@options)
677
706
  else
678
707
  session = nil
679
708
  end
@@ -707,11 +736,31 @@ module Mongo
707
736
  session: session,
708
737
  connection_global_id: result.connection_global_id,
709
738
  )
710
- result = op.execute(server, context: context)
739
+ result = if server.load_balancer?
740
+ # Connection will be checked in when cursor is drained.
741
+ connection = server.pool.check_out(context: context)
742
+ op.execute_with_connection(connection, context: context)
743
+ else
744
+ op.execute(server, context: context)
745
+ end
711
746
  Cursor.new(self, result, server, session: session)
712
747
  end
713
748
  end
714
749
 
750
+ private
751
+
752
+ def collation(doc = nil)
753
+ configure(:collation, doc)
754
+ end
755
+
756
+ def server_selector
757
+ @server_selector ||= if options[:session] && options[:session].in_transaction?
758
+ ServerSelector.get(read_preference || client.server_selector)
759
+ else
760
+ ServerSelector.get(read_preference || collection.server_selector)
761
+ end
762
+ end
763
+
715
764
  def validate_doc!(doc)
716
765
  raise Error::InvalidDocument.new unless doc.respond_to?(:keys)
717
766
  end
@@ -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?