mongo 2.20.0 → 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 (296) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  3. data/Rakefile +59 -23
  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/config.rb +2 -2
  25. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  26. data/lib/mongo/crypt/binding.rb +4 -4
  27. data/lib/mongo/crypt/context.rb +20 -14
  28. data/lib/mongo/crypt/encryption_io.rb +56 -26
  29. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  30. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  31. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  32. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  33. data/lib/mongo/csot_timeout_holder.rb +119 -0
  34. data/lib/mongo/cursor/kill_spec.rb +5 -2
  35. data/lib/mongo/cursor/nontailable.rb +27 -0
  36. data/lib/mongo/cursor.rb +86 -24
  37. data/lib/mongo/cursor_host.rb +82 -0
  38. data/lib/mongo/database/view.rb +81 -14
  39. data/lib/mongo/database.rb +88 -18
  40. data/lib/mongo/error/operation_failure.rb +209 -204
  41. data/lib/mongo/error/server_timeout_error.rb +12 -0
  42. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  43. data/lib/mongo/error/timeout_error.rb +23 -0
  44. data/lib/mongo/error.rb +2 -0
  45. data/lib/mongo/grid/fs_bucket.rb +45 -12
  46. data/lib/mongo/grid/stream/read.rb +15 -1
  47. data/lib/mongo/grid/stream/write.rb +21 -4
  48. data/lib/mongo/index/view.rb +77 -16
  49. data/lib/mongo/operation/context.rb +40 -2
  50. data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
  51. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  52. data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
  53. data/lib/mongo/operation/find/op_msg.rb +45 -0
  54. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  55. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  56. data/lib/mongo/operation/insert/result.rb +4 -2
  57. data/lib/mongo/operation/list_collections/result.rb +1 -1
  58. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  59. data/lib/mongo/operation/op_msg_base.rb +3 -1
  60. data/lib/mongo/operation/result.rb +26 -5
  61. data/lib/mongo/operation/shared/executable.rb +12 -1
  62. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  63. data/lib/mongo/operation/shared/response_handling.rb +3 -3
  64. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  65. data/lib/mongo/operation/shared/timed.rb +52 -0
  66. data/lib/mongo/operation/shared/write.rb +4 -1
  67. data/lib/mongo/operation/update/op_msg.rb +2 -1
  68. data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
  69. data/lib/mongo/operation.rb +1 -0
  70. data/lib/mongo/protocol/message.rb +1 -4
  71. data/lib/mongo/protocol/msg.rb +2 -2
  72. data/lib/mongo/retryable/base_worker.rb +28 -3
  73. data/lib/mongo/retryable/read_worker.rb +76 -35
  74. data/lib/mongo/retryable/write_worker.rb +53 -22
  75. data/lib/mongo/retryable.rb +8 -2
  76. data/lib/mongo/server/connection.rb +11 -5
  77. data/lib/mongo/server/connection_base.rb +22 -2
  78. data/lib/mongo/server/connection_pool.rb +32 -14
  79. data/lib/mongo/server/description/features.rb +1 -1
  80. data/lib/mongo/server/description.rb +18 -5
  81. data/lib/mongo/server/monitor.rb +7 -4
  82. data/lib/mongo/server/pending_connection.rb +25 -8
  83. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  84. data/lib/mongo/server.rb +11 -6
  85. data/lib/mongo/server_selector/base.rb +25 -9
  86. data/lib/mongo/session.rb +78 -9
  87. data/lib/mongo/socket/ssl.rb +131 -18
  88. data/lib/mongo/socket/tcp.rb +40 -6
  89. data/lib/mongo/socket.rb +154 -25
  90. data/lib/mongo/uri/options_mapper.rb +1 -0
  91. data/lib/mongo/version.rb +1 -5
  92. data/lib/mongo.rb +1 -0
  93. data/mongo.gemspec +8 -11
  94. data/spec/atlas/atlas_connectivity_spec.rb +4 -0
  95. data/spec/atlas/operations_spec.rb +4 -0
  96. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  97. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  98. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  99. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +67 -20
  100. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  101. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  102. data/spec/integration/cursor_pinning_spec.rb +15 -60
  103. data/spec/integration/cursor_reaping_spec.rb +1 -1
  104. data/spec/integration/docs_examples_spec.rb +1 -1
  105. data/spec/integration/operation_failure_code_spec.rb +1 -1
  106. data/spec/integration/operation_failure_message_spec.rb +3 -3
  107. data/spec/integration/retryable_errors_spec.rb +2 -2
  108. data/spec/integration/retryable_reads_errors_spec.rb +35 -23
  109. data/spec/integration/sdam_error_handling_spec.rb +4 -1
  110. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  111. data/spec/integration/server_spec.rb +4 -3
  112. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  113. data/spec/kerberos/kerberos_spec.rb +4 -0
  114. data/spec/lite_spec_helper.rb +3 -11
  115. data/spec/mongo/auth/user/view_spec.rb +1 -1
  116. data/spec/mongo/caching_cursor_spec.rb +1 -1
  117. data/spec/mongo/client_encryption_spec.rb +1 -0
  118. data/spec/mongo/client_spec.rb +158 -4
  119. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  120. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  121. data/spec/mongo/collection_crud_spec.rb +1 -0
  122. data/spec/mongo/collection_spec.rb +5 -6
  123. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  124. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  125. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  126. data/spec/mongo/crypt/handle_spec.rb +1 -1
  127. data/spec/mongo/cursor_spec.rb +26 -9
  128. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  129. data/spec/mongo/operation/context_spec.rb +79 -0
  130. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  131. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  132. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  133. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  134. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  135. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  136. data/spec/mongo/query_cache_spec.rb +243 -225
  137. data/spec/mongo/retryable_spec.rb +1 -0
  138. data/spec/mongo/server/connection_spec.rb +22 -0
  139. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  140. data/spec/mongo/socket/ssl_spec.rb +0 -10
  141. data/spec/runners/change_streams/test.rb +2 -2
  142. data/spec/runners/crud/operation.rb +1 -1
  143. data/spec/runners/crud/verifier.rb +3 -1
  144. data/spec/runners/transactions/operation.rb +4 -6
  145. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  146. data/spec/runners/unified/assertions.rb +4 -0
  147. data/spec/runners/unified/change_stream_operations.rb +14 -24
  148. data/spec/runners/unified/crud_operations.rb +82 -59
  149. data/spec/runners/unified/ddl_operations.rb +38 -7
  150. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  151. data/spec/runners/unified/support_operations.rb +43 -4
  152. data/spec/runners/unified/test.rb +22 -10
  153. data/spec/runners/unified.rb +1 -1
  154. data/spec/solo/clean_exit_spec.rb +2 -0
  155. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  157. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  158. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  159. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  160. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  161. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  162. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  163. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  164. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +1 -0
  165. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +1 -0
  166. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +1 -0
  167. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +1 -0
  168. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +1 -0
  169. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +1 -0
  170. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +1 -0
  171. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +1 -0
  172. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +1 -0
  173. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +1 -0
  174. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +1 -0
  175. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +1 -0
  176. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +1 -0
  177. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +1 -0
  178. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +2 -1
  179. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  184. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  185. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  186. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  187. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  188. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  189. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  190. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  191. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  192. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  193. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  194. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  195. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  196. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  197. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  198. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  199. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  200. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  201. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  202. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  203. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  204. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  205. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
  206. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
  207. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  208. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  209. data/spec/spec_tests/transactions_unified_spec.rb +2 -1
  210. data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
  211. data/spec/support/certificates/atlas-ocsp.crt +117 -122
  212. data/spec/support/certificates/retrieve-atlas-cert +1 -1
  213. data/spec/support/cluster_tools.rb +3 -3
  214. data/spec/support/common_shortcuts.rb +2 -2
  215. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  216. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  217. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  218. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  219. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  220. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  221. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  222. data/spec/support/shared/session.rb +2 -2
  223. data/spec/support/spec_setup.rb +2 -2
  224. data/spec/support/utils.rb +3 -1
  225. metadata +88 -173
  226. checksums.yaml.gz.sig +0 -0
  227. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  228. data/spec/shared/LICENSE +0 -20
  229. data/spec/shared/bin/get-mongodb-download-url +0 -17
  230. data/spec/shared/bin/s3-copy +0 -45
  231. data/spec/shared/bin/s3-upload +0 -69
  232. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  233. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  234. data/spec/shared/lib/mrss/constraints.rb +0 -378
  235. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  236. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  237. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  238. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  239. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  240. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  241. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  242. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  243. data/spec/shared/lib/mrss/utils.rb +0 -37
  244. data/spec/shared/share/Dockerfile.erb +0 -281
  245. data/spec/shared/share/haproxy-1.conf +0 -16
  246. data/spec/shared/share/haproxy-2.conf +0 -17
  247. data/spec/shared/shlib/config.sh +0 -27
  248. data/spec/shared/shlib/distro.sh +0 -74
  249. data/spec/shared/shlib/server.sh +0 -417
  250. data/spec/shared/shlib/set_env.sh +0 -146
  251. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -241
  252. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -422
  253. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -182
  254. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -239
  255. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -235
  256. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -252
  257. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1687
  258. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -293
  259. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -905
  260. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1684
  261. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1680
  262. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1697
  263. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -329
  264. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -424
  265. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -226
  266. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -327
  267. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -319
  268. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -336
  269. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -913
  270. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -292
  271. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -518
  272. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -911
  273. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -907
  274. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -924
  275. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -325
  276. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -424
  277. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -224
  278. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -323
  279. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -319
  280. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -338
  281. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -241
  282. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -423
  283. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -182
  284. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -239
  285. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -235
  286. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -254
  287. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -241
  288. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -422
  289. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -182
  290. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -239
  291. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -235
  292. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -254
  293. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -43
  294. data/spec/support/faas/app/aws_lambda/mongodb/Gemfile.lock +0 -19
  295. data.tar.gz.sig +0 -0
  296. metadata.gz.sig +0 -3
data/lib/mongo/socket.rb CHANGED
@@ -192,27 +192,24 @@ module Mongo
192
192
  # socket.read(4096)
193
193
  #
194
194
  # @param [ Integer ] length The number of bytes to read.
195
- # @param [ Numeric ] timeout The timeout to use for each chunk read.
195
+ # @param [ Numeric ] socket_timeout The timeout to use for each chunk read,
196
+ # mutually exclusive to +timeout+.
197
+ # @param [ Numeric ] timeout The total timeout to the whole read operation,
198
+ # mutually exclusive to +socket_timeout+.
196
199
  #
197
200
  # @raise [ Mongo::SocketError ] If not all data is returned.
198
201
  #
199
202
  # @return [ Object ] The data from the socket.
200
203
  #
201
204
  # @since 2.0.0
202
- def read(length, timeout: nil)
203
- map_exceptions do
204
- data = read_from_socket(length, timeout: timeout)
205
- unless (data.length > 0 || length == 0)
206
- raise IOError, "Expected to read > 0 bytes but read 0 bytes"
207
- end
208
- while data.length < length
209
- chunk = read_from_socket(length - data.length, timeout: timeout)
210
- unless (chunk.length > 0 || length == 0)
211
- raise IOError, "Expected to read > 0 bytes but read 0 bytes"
212
- end
213
- data << chunk
214
- end
215
- data
205
+ def read(length, socket_timeout: nil, timeout: nil)
206
+ if !socket_timeout.nil? && !timeout.nil?
207
+ raise ArgumentError, 'Both timeout and socket_timeout cannot be set'
208
+ end
209
+ if !socket_timeout.nil? || timeout.nil?
210
+ read_without_timeout(length, socket_timeout)
211
+ else
212
+ read_with_timeout(length, timeout)
216
213
  end
217
214
  end
218
215
 
@@ -233,15 +230,16 @@ module Mongo
233
230
  # Writes data to the socket instance.
234
231
  #
235
232
  # @param [ Array<Object> ] args The data to be written.
233
+ # @param [ Numeric ] timeout The total timeout to the whole write operation.
236
234
  #
237
235
  # @return [ Integer ] The length of bytes written to the socket.
238
236
  #
239
237
  # @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error during the write.
240
238
  #
241
239
  # @since 2.0.0
242
- def write(*args)
240
+ def write(*args, timeout: nil)
243
241
  map_exceptions do
244
- do_write(*args)
242
+ do_write(*args, timeout: timeout)
245
243
  end
246
244
  end
247
245
 
@@ -254,7 +252,7 @@ module Mongo
254
252
  true
255
253
  end
256
254
 
257
- # For backwards compatibilty only, do not use.
255
+ # For backwards compatibility only, do not use.
258
256
  #
259
257
  # @return [ true ] Always true.
260
258
  #
@@ -265,18 +263,76 @@ module Mongo
265
263
 
266
264
  private
267
265
 
268
- def read_from_socket(length, timeout: nil)
266
+ # Reads the +length+ bytes from the socket, the read operation duration is
267
+ # limited to +timeout+ second.
268
+ #
269
+ # @param [ Integer ] length The number of bytes to read.
270
+ # @param [ Numeric ] timeout The total timeout to the whole read operation.
271
+ #
272
+ # @return [ Object ] The data from the socket.
273
+ def read_with_timeout(length, timeout)
274
+ deadline = Utils.monotonic_time + timeout
275
+ map_exceptions do
276
+ String.new.tap do |data|
277
+ while data.length < length
278
+ socket_timeout = deadline - Utils.monotonic_time
279
+ if socket_timeout <= 0
280
+ raise Mongo::Error::TimeoutError
281
+ end
282
+ chunk = read_from_socket(length - data.length, socket_timeout: socket_timeout, csot: true)
283
+ unless chunk.length > 0
284
+ raise IOError, "Expected to read > 0 bytes but read 0 bytes"
285
+ end
286
+ data << chunk
287
+ end
288
+ end
289
+ end
290
+ end
291
+
292
+ # Reads the +length+ bytes from the socket. The read operation may involve
293
+ # multiple socket reads, each read is limited to +timeout+ second,
294
+ # if the parameter is provided.
295
+ #
296
+ # @param [ Integer ] length The number of bytes to read.
297
+ # @param [ Numeric ] socket_timeout The timeout to use for each chunk read.
298
+ #
299
+ # @return [ Object ] The data from the socket.
300
+ def read_without_timeout(length, socket_timeout = nil)
301
+ map_exceptions do
302
+ String.new.tap do |data|
303
+ while data.length < length
304
+ chunk = read_from_socket(length - data.length, socket_timeout: socket_timeout)
305
+ unless chunk.length > 0
306
+ raise IOError, "Expected to read > 0 bytes but read 0 bytes"
307
+ end
308
+ data << chunk
309
+ end
310
+ end
311
+ end
312
+ end
313
+
314
+
315
+ # Reads the +length+ bytes from the socket. The read operation may involve
316
+ # multiple socket reads, each read is limited to +timeout+ second,
317
+ # if the parameter is provided.
318
+ #
319
+ # @param [ Integer ] length The number of bytes to read.
320
+ # @param [ Numeric ] :socket_timeout The timeout to use for each chunk read.
321
+ # @param [ true | false ] :csot Whether the CSOT timeout is set for the operation.
322
+ #
323
+ # @return [ Object ] The data from the socket.
324
+ def read_from_socket(length, socket_timeout: nil, csot: false)
269
325
  # Just in case
270
326
  if length == 0
271
327
  return ''.force_encoding('BINARY')
272
328
  end
273
329
 
274
- _timeout = timeout || self.timeout
330
+ _timeout = socket_timeout || self.timeout
275
331
  if _timeout
276
332
  if _timeout > 0
277
333
  deadline = Utils.monotonic_time + _timeout
278
334
  elsif _timeout < 0
279
- raise Errno::ETIMEDOUT, "Negative timeout #{_timeout} given to socket"
335
+ raise_timeout_error!("Negative timeout #{_timeout} given to socket", csot)
280
336
  end
281
337
  end
282
338
 
@@ -331,7 +387,7 @@ module Mongo
331
387
  if deadline
332
388
  select_timeout = deadline - Utils.monotonic_time
333
389
  if select_timeout <= 0
334
- raise Errno::ETIMEDOUT, "Took more than #{_timeout} seconds to receive data"
390
+ raise_timeout_error!("Took more than #{_timeout} seconds to receive data", csot)
335
391
  end
336
392
  end
337
393
  pipe = options[:pipe]
@@ -373,11 +429,11 @@ module Mongo
373
429
  if deadline
374
430
  select_timeout = deadline - Utils.monotonic_time
375
431
  if select_timeout <= 0
376
- raise Errno::ETIMEDOUT, "Took more than #{_timeout} seconds to receive data"
432
+ raise_timeout_error!("Took more than #{_timeout} seconds to receive data", csot)
377
433
  end
378
434
  end
379
435
  elsif rv.nil?
380
- raise Errno::ETIMEDOUT, "Took more than #{_timeout} seconds to receive data (select call timed out)"
436
+ raise_timeout_error!("Took more than #{_timeout} seconds to receive data (select call timed out)", csot)
381
437
  end
382
438
  retry
383
439
  end
@@ -402,9 +458,23 @@ module Mongo
402
458
  # sholud map exceptions.
403
459
  #
404
460
  # @param [ Array<Object> ] args The data to be written.
461
+ # @param [ Numeric ] :timeout The total timeout to the whole write operation.
462
+ #
463
+ # @return [ Integer ] The length of bytes written to the socket.
464
+ def do_write(*args, timeout: nil)
465
+ if timeout.nil?
466
+ write_without_timeout(*args)
467
+ else
468
+ write_with_timeout(*args, timeout: timeout)
469
+ end
470
+ end
471
+
472
+ # Writes data to to the socket.
473
+ #
474
+ # @param [ Array<Object> ] args The data to be written.
405
475
  #
406
476
  # @return [ Integer ] The length of bytes written to the socket.
407
- def do_write(*args)
477
+ def write_without_timeout(*args)
408
478
  # This method used to forward arguments to @socket.write in a
409
479
  # single call like so:
410
480
  #
@@ -428,6 +498,57 @@ module Mongo
428
498
  end
429
499
  end
430
500
 
501
+ # Writes data to to the socket, the write duration is limited to +timeout+.
502
+ #
503
+ # @param [ Array<Object> ] args The data to be written.
504
+ # @param [ Numeric ] :timeout The total timeout to the whole write operation.
505
+ #
506
+ # @return [ Integer ] The length of bytes written to the socket.
507
+ def write_with_timeout(*args, timeout:)
508
+ raise ArgumentError, 'timeout cannot be nil' if timeout.nil?
509
+ raise_timeout_error!("Negative timeout #{timeout} given to socket", true) if timeout < 0
510
+
511
+ written = 0
512
+ args.each do |buf|
513
+ buf = buf.to_s
514
+ i = 0
515
+ while i < buf.length
516
+ chunk = buf[i...(i + WRITE_CHUNK_SIZE)]
517
+ written += write_chunk(chunk, timeout)
518
+ i += WRITE_CHUNK_SIZE
519
+ end
520
+ end
521
+ written
522
+ end
523
+
524
+ def write_chunk(chunk, timeout)
525
+ deadline = Utils.monotonic_time + timeout
526
+ written = 0
527
+ begin
528
+ written += @socket.write_nonblock(chunk[written..-1])
529
+ rescue IO::WaitWritable, Errno::EINTR
530
+ select_timeout = deadline - Utils.monotonic_time
531
+ rv = Kernel.select(nil, [@socket], nil, select_timeout)
532
+ if BSON::Environment.jruby?
533
+ # Ignore the return value of Kernel.select.
534
+ # On JRuby, select appears to return nil prior to timeout expiration
535
+ # (apparently due to a EAGAIN) which then causes us to fail the read
536
+ # even though we could have retried it.
537
+ # Check the deadline ourselves.
538
+ if deadline
539
+ select_timeout = deadline - Utils.monotonic_time
540
+ if select_timeout <= 0
541
+ raise_timeout_error!("Took more than #{timeout} seconds to receive data", true)
542
+ end
543
+ end
544
+ elsif rv.nil?
545
+ raise_timeout_error!("Took more than #{timeout} seconds to receive data (select call timed out)", true)
546
+ end
547
+ retry
548
+ end
549
+ written
550
+ end
551
+
431
552
  def unix_socket?(sock)
432
553
  defined?(UNIXSocket) && sock.is_a?(UNIXSocket)
433
554
  end
@@ -482,5 +603,13 @@ module Mongo
482
603
  def human_address
483
604
  raise NotImplementedError
484
605
  end
606
+
607
+ def raise_timeout_error!(message = nil, csot = false)
608
+ if csot
609
+ raise Mongo::Error::TimeoutError
610
+ else
611
+ raise Errno::ETIMEDOUT, message
612
+ end
613
+ end
485
614
  end
486
615
  end
@@ -272,6 +272,7 @@ module Mongo
272
272
  uri_option 'localThresholdMS', :local_threshold, type: :ms
273
273
  uri_option 'heartbeatFrequencyMS', :heartbeat_frequency, type: :ms
274
274
  uri_option 'maxIdleTimeMS', :max_idle_time, type: :ms
275
+ uri_option 'timeoutMS', :timeout_ms, type: :integer
275
276
 
276
277
  # Write Options
277
278
  uri_option 'w', :w, group: :write_concern, type: :w
data/lib/mongo/version.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # rubocop:todo all
3
2
 
4
3
  # Copyright (C) 2014-2020 MongoDB Inc.
5
4
  #
@@ -16,9 +15,6 @@
16
15
  # limitations under the License.
17
16
 
18
17
  module Mongo
19
-
20
18
  # The current version of the driver.
21
- #
22
- # @since 2.0.0
23
- VERSION = '2.20.0'.freeze
19
+ VERSION = '2.21.0'
24
20
  end
data/lib/mongo.rb CHANGED
@@ -39,6 +39,7 @@ require 'mongo/bson'
39
39
  require 'mongo/semaphore'
40
40
  require 'mongo/distinguishing_semaphore'
41
41
  require 'mongo/condition_variable'
42
+ require 'mongo/csot_timeout_holder'
42
43
  require 'mongo/options'
43
44
  require 'mongo/loggable'
44
45
  require 'mongo/cluster_time'
data/mongo.gemspec CHANGED
@@ -9,28 +9,25 @@ Gem::Specification.new do |s|
9
9
  s.name = 'mongo'
10
10
  s.version = Mongo::VERSION
11
11
  s.platform = Gem::Platform::RUBY
12
- s.authors = ["The MongoDB Ruby Team"]
13
- s.email = "dbx-ruby@mongodb.com"
12
+ s.authors = [ 'The MongoDB Ruby Team' ]
13
+ s.email = 'dbx-ruby@mongodb.com'
14
14
  s.homepage = 'https://mongodb.com/docs/ruby-driver/'
15
15
  s.summary = 'Ruby driver for MongoDB'
16
- s.description = 'A Ruby driver for MongoDB'
17
16
  s.license = 'Apache-2.0'
17
+ s.description = <<~DESC
18
+ A pure-Ruby driver for connecting to, querying, and manipulating MongoDB
19
+ databases. Officially developed and supported by MongoDB, with love for
20
+ the Ruby community.
21
+ DESC
18
22
 
19
23
  s.metadata = {
20
24
  'bug_tracker_uri' => 'https://jira.mongodb.org/projects/RUBY',
21
25
  'changelog_uri' => 'https://github.com/mongodb/mongo-ruby-driver/releases',
22
- 'documentation_uri' => 'https://mongodb.com/docs/ruby-driver/',
23
26
  'homepage_uri' => 'https://mongodb.com/docs/ruby-driver/',
27
+ 'documentation_uri' => 'https://mongodb.com/docs/ruby-driver/current/tutorials/quick-start/',
24
28
  'source_code_uri' => 'https://github.com/mongodb/mongo-ruby-driver',
25
29
  }
26
30
 
27
- if File.exist?('gem-private_key.pem')
28
- s.signing_key = 'gem-private_key.pem'
29
- s.cert_chain = ['gem-public_cert.pem']
30
- else
31
- warn "[#{s.name}] Warning: No private key present, creating unsigned gem."
32
- end
33
-
34
31
  s.files = Dir.glob('{bin,lib,spec}/**/*')
35
32
  s.files += %w[mongo.gemspec LICENSE README.md CONTRIBUTING.md Rakefile]
36
33
  s.test_files = Dir.glob('spec/**/*')
@@ -10,6 +10,10 @@ describe 'Atlas connectivity' do
10
10
  require_atlas
11
11
 
12
12
  describe 'connection to Atlas' do
13
+ after do
14
+ client.close
15
+ end
16
+
13
17
  it 'runs ismaster successfully' do
14
18
  expect { client.database.command(:hello => 1) }
15
19
  .not_to raise_error
@@ -10,6 +10,10 @@ describe 'Operations' do
10
10
  require_atlas
11
11
 
12
12
  describe 'ping' do
13
+ after do
14
+ client.close
15
+ end
16
+
13
17
  it 'works' do
14
18
  expect do
15
19
  client.database.command(ping: 1)
@@ -57,7 +57,8 @@ describe 'Auto Encryption' do
57
57
  'jsonSchema' => kind_of(Hash),
58
58
  'isRemoteSchema' => false,
59
59
  ),
60
- { execution_options: { deserialize_as_bson: true } },
60
+ { execution_options: { deserialize_as_bson: true }, timeout_ms: nil },
61
+
61
62
  )
62
63
  .and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
63
64
  end