mongo 2.16.4 → 2.20.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 (1612) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +33 -39
  4. data/Rakefile +31 -157
  5. data/bin/mongo_console +2 -0
  6. data/lib/mongo/active_support.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/address/unix.rb +1 -1
  10. data/lib/mongo/address/validator.rb +1 -1
  11. data/lib/mongo/address.rb +1 -1
  12. data/lib/mongo/auth/aws/conversation.rb +1 -5
  13. data/lib/mongo/{operation/get_more/command.rb → auth/aws/credentials.rb} +15 -20
  14. data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
  15. data/lib/mongo/auth/aws/credentials_retriever.rb +172 -37
  16. data/lib/mongo/auth/aws/request.rb +1 -3
  17. data/lib/mongo/auth/aws.rb +6 -6
  18. data/lib/mongo/auth/base.rb +9 -2
  19. data/lib/mongo/auth/conversation_base.rb +1 -1
  20. data/lib/mongo/auth/cr/conversation.rb +1 -1
  21. data/lib/mongo/auth/cr.rb +1 -1
  22. data/lib/mongo/auth/credential_cache.rb +1 -1
  23. data/lib/mongo/auth/gssapi/conversation.rb +1 -1
  24. data/lib/mongo/auth/gssapi.rb +1 -1
  25. data/lib/mongo/auth/ldap/conversation.rb +1 -1
  26. data/lib/mongo/auth/ldap.rb +1 -1
  27. data/lib/mongo/auth/roles.rb +17 -17
  28. data/lib/mongo/auth/sasl_conversation_base.rb +1 -1
  29. data/lib/mongo/auth/scram/conversation.rb +1 -1
  30. data/lib/mongo/auth/scram.rb +1 -1
  31. data/lib/mongo/auth/scram256/conversation.rb +1 -1
  32. data/lib/mongo/auth/scram256.rb +1 -1
  33. data/lib/mongo/auth/scram_conversation_base.rb +1 -1
  34. data/lib/mongo/auth/stringprep/profiles/sasl.rb +1 -1
  35. data/lib/mongo/auth/stringprep/tables.rb +1 -1
  36. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -1
  37. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  38. data/lib/mongo/auth/stringprep.rb +1 -1
  39. data/lib/mongo/auth/user/view.rb +1 -1
  40. data/lib/mongo/auth/user.rb +1 -1
  41. data/lib/mongo/auth/x509/conversation.rb +1 -1
  42. data/lib/mongo/auth/x509.rb +1 -1
  43. data/lib/mongo/auth.rb +13 -2
  44. data/lib/mongo/background_thread.rb +1 -1
  45. data/lib/mongo/bson.rb +1 -1
  46. data/lib/mongo/bulk_write/combineable.rb +1 -1
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  48. data/lib/mongo/bulk_write/result.rb +11 -2
  49. data/lib/mongo/bulk_write/result_combiner.rb +3 -5
  50. data/lib/mongo/bulk_write/transformable.rb +1 -1
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  52. data/lib/mongo/bulk_write/validatable.rb +1 -1
  53. data/lib/mongo/bulk_write.rb +118 -30
  54. data/lib/mongo/caching_cursor.rb +1 -1
  55. data/lib/mongo/client.rb +190 -22
  56. data/lib/mongo/client_encryption.rb +215 -11
  57. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +34 -16
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
  60. data/lib/mongo/cluster/sdam_flow.rb +42 -15
  61. data/lib/mongo/cluster/topology/base.rb +17 -1
  62. data/lib/mongo/cluster/topology/load_balanced.rb +1 -1
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  66. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  67. data/lib/mongo/cluster/topology/single.rb +1 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  69. data/lib/mongo/cluster/topology.rb +1 -1
  70. data/lib/mongo/cluster.rb +82 -41
  71. data/lib/mongo/cluster_time.rb +1 -1
  72. data/lib/mongo/collection/helpers.rb +43 -0
  73. data/lib/mongo/collection/queryable_encryption.rb +162 -0
  74. data/lib/mongo/collection/view/aggregation.rb +68 -17
  75. data/lib/mongo/collection/view/builder/aggregation.rb +12 -14
  76. data/lib/mongo/collection/view/builder/map_reduce.rb +2 -2
  77. data/lib/mongo/collection/view/builder.rb +1 -1
  78. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  79. data/lib/mongo/collection/view/change_stream.rb +69 -23
  80. data/lib/mongo/collection/view/explainable.rb +2 -2
  81. data/lib/mongo/collection/view/immutable.rb +1 -1
  82. data/lib/mongo/collection/view/iterable.rb +6 -6
  83. data/lib/mongo/collection/view/map_reduce.rb +21 -10
  84. data/lib/mongo/collection/view/readable.rb +54 -28
  85. data/lib/mongo/collection/view/writable.rb +153 -39
  86. data/lib/mongo/collection/view.rb +1 -1
  87. data/lib/mongo/collection.rb +332 -98
  88. data/lib/mongo/condition_variable.rb +58 -0
  89. data/lib/mongo/config/options.rb +63 -0
  90. data/lib/mongo/config/validators/option.rb +27 -0
  91. data/lib/mongo/config.rb +43 -0
  92. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  93. data/lib/mongo/crypt/auto_encrypter.rb +140 -16
  94. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  95. data/lib/mongo/crypt/binary.rb +1 -1
  96. data/lib/mongo/crypt/binding.rb +715 -152
  97. data/lib/mongo/crypt/context.rb +72 -6
  98. data/lib/mongo/crypt/data_key_context.rb +13 -105
  99. data/lib/mongo/crypt/encryption_io.rb +95 -61
  100. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  101. data/lib/mongo/crypt/explicit_encrypter.rb +233 -30
  102. data/lib/mongo/crypt/explicit_encryption_context.rb +76 -22
  103. data/lib/mongo/{operation/drop/command.rb → crypt/explicit_encryption_expression_context.rb} +9 -20
  104. data/lib/mongo/crypt/handle.rb +169 -87
  105. data/lib/mongo/crypt/hooks.rb +26 -3
  106. data/lib/mongo/crypt/kms/aws/credentials.rb +83 -0
  107. data/lib/mongo/crypt/kms/aws/master_document.rb +78 -0
  108. data/lib/mongo/crypt/kms/aws.rb +20 -0
  109. data/lib/mongo/crypt/kms/azure/access_token.rb +54 -0
  110. data/lib/mongo/crypt/kms/azure/credentials.rb +103 -0
  111. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +122 -0
  112. data/lib/mongo/crypt/kms/azure/master_document.rb +79 -0
  113. data/lib/mongo/crypt/kms/azure.rb +21 -0
  114. data/lib/mongo/crypt/kms/credentials.rb +96 -0
  115. data/lib/mongo/crypt/kms/gcp/credentials.rb +127 -0
  116. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +58 -0
  117. data/lib/mongo/crypt/kms/gcp/master_document.rb +99 -0
  118. data/lib/mongo/crypt/kms/gcp.rb +21 -0
  119. data/lib/mongo/crypt/kms/kmip/credentials.rb +68 -0
  120. data/lib/mongo/crypt/kms/kmip/master_document.rb +74 -0
  121. data/lib/mongo/crypt/kms/kmip.rb +19 -0
  122. data/lib/mongo/crypt/kms/local/credentials.rb +65 -0
  123. data/lib/mongo/crypt/kms/local/master_document.rb +43 -0
  124. data/lib/mongo/crypt/kms/local.rb +19 -0
  125. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  126. data/lib/mongo/crypt/kms.rb +122 -0
  127. data/lib/mongo/crypt/kms_context.rb +1 -1
  128. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
  129. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
  130. data/lib/mongo/crypt/status.rb +9 -3
  131. data/lib/mongo/crypt.rb +16 -1
  132. data/lib/mongo/cursor/kill_spec.rb +42 -4
  133. data/lib/mongo/cursor.rb +68 -19
  134. data/lib/mongo/database/view.rb +51 -9
  135. data/lib/mongo/database.rb +65 -21
  136. data/lib/mongo/dbref.rb +2 -106
  137. data/lib/mongo/distinguishing_semaphore.rb +2 -2
  138. data/lib/mongo/error/auth_error.rb +1 -1
  139. data/lib/mongo/error/bad_load_balancer_target.rb +1 -1
  140. data/lib/mongo/error/bulk_write_error.rb +32 -5
  141. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  142. data/lib/mongo/error/client_closed.rb +24 -0
  143. data/lib/mongo/error/closed_stream.rb +1 -1
  144. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  145. data/lib/mongo/error/connection_perished.rb +3 -1
  146. data/lib/mongo/error/connection_unavailable.rb +27 -0
  147. data/lib/mongo/error/credential_check_error.rb +1 -1
  148. data/lib/mongo/error/crypt_error.rb +1 -1
  149. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  150. data/lib/mongo/error/failed_string_prep_validation.rb +1 -1
  151. data/lib/mongo/error/file_not_found.rb +1 -1
  152. data/lib/mongo/error/handshake_error.rb +1 -1
  153. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  154. data/lib/mongo/error/internal_driver_error.rb +1 -1
  155. data/lib/mongo/error/invalid_address.rb +1 -1
  156. data/lib/mongo/error/invalid_application_name.rb +1 -1
  157. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  158. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  159. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  160. data/lib/mongo/error/invalid_config_option.rb +21 -0
  161. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  162. data/lib/mongo/error/invalid_database_name.rb +1 -1
  163. data/lib/mongo/error/invalid_document.rb +1 -1
  164. data/lib/mongo/error/invalid_file.rb +1 -1
  165. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  166. data/lib/mongo/error/invalid_max_connecting.rb +28 -0
  167. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  168. data/lib/mongo/error/invalid_nonce.rb +1 -1
  169. data/lib/mongo/error/invalid_read_concern.rb +1 -1
  170. data/lib/mongo/error/invalid_read_option.rb +2 -2
  171. data/lib/mongo/error/invalid_replacement_document.rb +28 -10
  172. data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
  173. data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
  174. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  175. data/lib/mongo/error/invalid_session.rb +1 -1
  176. data/lib/mongo/error/invalid_signature.rb +1 -1
  177. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  178. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  179. data/lib/mongo/error/invalid_update_document.rb +28 -8
  180. data/lib/mongo/error/invalid_uri.rb +1 -1
  181. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  182. data/lib/mongo/error/kms_error.rb +1 -1
  183. data/lib/mongo/error/labelable.rb +72 -0
  184. data/lib/mongo/error/lint_error.rb +1 -1
  185. data/lib/mongo/error/max_bson_size.rb +1 -1
  186. data/lib/mongo/error/max_message_size.rb +1 -1
  187. data/lib/mongo/error/mismatched_domain.rb +1 -1
  188. data/lib/mongo/error/missing_connection.rb +27 -0
  189. data/lib/mongo/error/missing_file_chunk.rb +9 -3
  190. data/lib/mongo/error/missing_password.rb +1 -1
  191. data/lib/mongo/error/missing_resume_token.rb +1 -1
  192. data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
  193. data/lib/mongo/error/missing_service_id.rb +1 -1
  194. data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
  195. data/lib/mongo/error/multi_index_drop.rb +1 -1
  196. data/lib/mongo/error/need_primary_server.rb +1 -1
  197. data/lib/mongo/error/no_server_available.rb +1 -1
  198. data/lib/mongo/error/no_service_connection_available.rb +1 -1
  199. data/lib/mongo/error/no_srv_records.rb +1 -1
  200. data/lib/mongo/error/notable.rb +15 -1
  201. data/lib/mongo/error/operation_failure.rb +35 -87
  202. data/lib/mongo/error/parser.rb +1 -1
  203. data/lib/mongo/{operation/create_user/command.rb → error/pool_cleared_error.rb} +17 -23
  204. data/lib/mongo/error/pool_closed_error.rb +4 -17
  205. data/lib/mongo/{operation/update_user/command.rb → error/pool_error.rb} +21 -21
  206. data/lib/mongo/{operation/drop_index/command.rb → error/pool_paused_error.rb} +17 -22
  207. data/lib/mongo/error/raise_original_error.rb +1 -1
  208. data/lib/mongo/error/read_write_retryable.rb +108 -0
  209. data/lib/mongo/error/sdam_error_detection.rb +1 -1
  210. data/lib/mongo/error/server_api_conflict.rb +1 -1
  211. data/lib/mongo/error/server_api_not_supported.rb +1 -1
  212. data/lib/mongo/error/server_certificate_revoked.rb +1 -1
  213. data/lib/mongo/{operation/get_more/legacy.rb → error/server_not_usable.rb} +13 -16
  214. data/lib/mongo/error/session_ended.rb +1 -1
  215. data/lib/mongo/error/session_not_materialized.rb +29 -0
  216. data/lib/mongo/error/sessions_not_supported.rb +1 -1
  217. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/snapshot_session_invalid_server_version.rb} +9 -19
  218. data/lib/mongo/{operation/command/command.rb → error/snapshot_session_transaction_prohibited.rb} +8 -19
  219. data/lib/mongo/error/socket_error.rb +1 -1
  220. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  221. data/lib/mongo/{operation/shared/op_msg_or_command.rb → error/transactions_not_supported.rb} +13 -20
  222. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  223. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  224. data/lib/mongo/error/unexpected_response.rb +1 -1
  225. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  226. data/lib/mongo/error/unmet_dependency.rb +1 -1
  227. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  228. data/lib/mongo/error/unsupported_collation.rb +1 -1
  229. data/lib/mongo/error/unsupported_features.rb +1 -1
  230. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  231. data/lib/mongo/error/unsupported_option.rb +1 -1
  232. data/lib/mongo/error/write_retryable.rb +1 -1
  233. data/lib/mongo/error.rb +16 -38
  234. data/lib/mongo/event/base.rb +1 -1
  235. data/lib/mongo/event/listeners.rb +1 -1
  236. data/lib/mongo/event/publisher.rb +1 -1
  237. data/lib/mongo/event/subscriber.rb +1 -1
  238. data/lib/mongo/event.rb +1 -1
  239. data/lib/mongo/grid/file/chunk.rb +3 -2
  240. data/lib/mongo/grid/file/info.rb +3 -2
  241. data/lib/mongo/grid/file.rb +1 -1
  242. data/lib/mongo/grid/fs_bucket.rb +7 -1
  243. data/lib/mongo/grid/stream/read.rb +7 -1
  244. data/lib/mongo/grid/stream/write.rb +1 -1
  245. data/lib/mongo/grid/stream.rb +1 -1
  246. data/lib/mongo/grid.rb +1 -1
  247. data/lib/mongo/id.rb +1 -1
  248. data/lib/mongo/index/view.rb +24 -8
  249. data/lib/mongo/index.rb +1 -1
  250. data/lib/mongo/lint.rb +1 -1
  251. data/lib/mongo/loggable.rb +3 -3
  252. data/lib/mongo/logger.rb +1 -1
  253. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  254. data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
  255. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  256. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  257. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  258. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  259. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  260. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  261. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  262. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  263. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
  264. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  265. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  266. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  267. data/lib/mongo/monitoring/event/cmap.rb +2 -1
  268. data/lib/mongo/monitoring/event/command_failed.rb +9 -3
  269. data/lib/mongo/monitoring/event/command_started.rb +2 -2
  270. data/lib/mongo/monitoring/event/command_succeeded.rb +10 -3
  271. data/lib/mongo/monitoring/event/secure.rb +2 -2
  272. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  273. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  274. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  275. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  276. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  277. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  278. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  279. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  280. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  281. data/lib/mongo/monitoring/event.rb +1 -1
  282. data/lib/mongo/monitoring/publishable.rb +10 -6
  283. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  284. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  285. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  286. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  287. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  288. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  289. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  290. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  291. data/lib/mongo/monitoring.rb +1 -1
  292. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  293. data/lib/mongo/operation/aggregate/result.rb +1 -1
  294. data/lib/mongo/operation/aggregate.rb +2 -3
  295. data/lib/mongo/operation/collections_info/result.rb +6 -3
  296. data/lib/mongo/operation/collections_info.rb +4 -16
  297. data/lib/mongo/operation/command/op_msg.rb +7 -1
  298. data/lib/mongo/operation/command.rb +2 -3
  299. data/lib/mongo/operation/context.rb +25 -7
  300. data/lib/mongo/operation/count/op_msg.rb +5 -2
  301. data/lib/mongo/operation/count.rb +2 -3
  302. data/lib/mongo/operation/create/op_msg.rb +5 -2
  303. data/lib/mongo/operation/create.rb +2 -3
  304. data/lib/mongo/operation/create_index/op_msg.rb +3 -2
  305. data/lib/mongo/operation/create_index.rb +2 -3
  306. data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
  307. data/lib/mongo/operation/create_search_indexes.rb +15 -0
  308. data/lib/mongo/operation/create_user/op_msg.rb +1 -1
  309. data/lib/mongo/operation/create_user.rb +2 -3
  310. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  311. data/lib/mongo/operation/delete/op_msg.rb +4 -2
  312. data/lib/mongo/operation/delete/result.rb +1 -1
  313. data/lib/mongo/operation/delete.rb +1 -3
  314. data/lib/mongo/operation/distinct/op_msg.rb +5 -2
  315. data/lib/mongo/operation/distinct.rb +2 -3
  316. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  317. data/lib/mongo/operation/drop.rb +2 -3
  318. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  319. data/lib/mongo/operation/drop_database.rb +2 -3
  320. data/lib/mongo/operation/drop_index/op_msg.rb +6 -2
  321. data/lib/mongo/operation/drop_index.rb +2 -3
  322. data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
  323. data/lib/mongo/operation/drop_search_index.rb +15 -0
  324. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  325. data/lib/mongo/operation/explain/result.rb +1 -1
  326. data/lib/mongo/operation/explain.rb +2 -4
  327. data/lib/mongo/operation/find/builder/command.rb +2 -1
  328. data/lib/mongo/operation/find/builder/flags.rb +1 -1
  329. data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
  330. data/lib/mongo/operation/find/builder.rb +1 -2
  331. data/lib/mongo/operation/find/op_msg.rb +1 -1
  332. data/lib/mongo/operation/find/result.rb +1 -1
  333. data/lib/mongo/operation/find.rb +2 -4
  334. data/lib/mongo/operation/get_more/command_builder.rb +6 -2
  335. data/lib/mongo/operation/get_more/op_msg.rb +1 -1
  336. data/lib/mongo/operation/get_more/result.rb +1 -1
  337. data/lib/mongo/operation/get_more.rb +2 -4
  338. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  339. data/lib/mongo/operation/indexes/result.rb +1 -1
  340. data/lib/mongo/operation/indexes.rb +2 -18
  341. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  342. data/lib/mongo/operation/insert/op_msg.rb +7 -4
  343. data/lib/mongo/operation/insert/result.rb +7 -4
  344. data/lib/mongo/operation/insert.rb +1 -3
  345. data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
  346. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  347. data/lib/mongo/operation/kill_cursors.rb +2 -4
  348. data/lib/mongo/operation/list_collections/op_msg.rb +5 -2
  349. data/lib/mongo/operation/list_collections/result.rb +1 -1
  350. data/lib/mongo/operation/list_collections.rb +2 -3
  351. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  352. data/lib/mongo/operation/map_reduce/result.rb +17 -1
  353. data/lib/mongo/operation/map_reduce.rb +2 -3
  354. data/lib/mongo/operation/op_msg_base.rb +1 -1
  355. data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
  356. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  357. data/lib/mongo/operation/parallel_scan.rb +2 -3
  358. data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
  359. data/lib/mongo/operation/remove_user.rb +2 -3
  360. data/lib/mongo/operation/result.rb +28 -6
  361. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
  362. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
  363. data/lib/mongo/operation/shared/executable.rb +48 -13
  364. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
  365. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  366. data/lib/mongo/operation/shared/idable.rb +1 -1
  367. data/lib/mongo/operation/shared/limited.rb +1 -1
  368. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  369. data/lib/mongo/operation/shared/{polymorphic_operation.rb → op_msg_executable.rb} +25 -8
  370. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  371. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  372. data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
  373. data/lib/mongo/operation/shared/response_handling.rb +30 -31
  374. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  375. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  376. data/lib/mongo/operation/shared/sessions_supported.rb +26 -7
  377. data/lib/mongo/operation/shared/specifiable.rb +8 -1
  378. data/lib/mongo/operation/shared/validatable.rb +1 -1
  379. data/lib/mongo/operation/shared/write.rb +19 -13
  380. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  381. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  382. data/lib/mongo/operation/update/op_msg.rb +4 -2
  383. data/lib/mongo/operation/update/result.rb +1 -1
  384. data/lib/mongo/operation/update.rb +1 -3
  385. data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
  386. data/lib/mongo/operation/update_search_index.rb +15 -0
  387. data/lib/mongo/operation/update_user/op_msg.rb +1 -1
  388. data/lib/mongo/operation/update_user.rb +2 -3
  389. data/lib/mongo/operation/users_info/op_msg.rb +1 -1
  390. data/lib/mongo/operation/users_info/result.rb +1 -1
  391. data/lib/mongo/operation/users_info.rb +2 -3
  392. data/lib/mongo/operation/write_command/op_msg.rb +1 -1
  393. data/lib/mongo/operation/write_command.rb +2 -3
  394. data/lib/mongo/operation.rb +5 -4
  395. data/lib/mongo/options/mapper.rb +1 -1
  396. data/lib/mongo/options/redacted.rb +1 -1
  397. data/lib/mongo/options.rb +1 -1
  398. data/lib/mongo/protocol/bit_vector.rb +4 -2
  399. data/lib/mongo/protocol/caching_hash.rb +52 -0
  400. data/lib/mongo/protocol/compressed.rb +1 -1
  401. data/lib/mongo/protocol/get_more.rb +1 -1
  402. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  403. data/lib/mongo/protocol/message.rb +5 -9
  404. data/lib/mongo/protocol/msg.rb +23 -2
  405. data/lib/mongo/protocol/query.rb +1 -1
  406. data/lib/mongo/protocol/registry.rb +1 -1
  407. data/lib/mongo/protocol/reply.rb +1 -1
  408. data/lib/mongo/protocol/serializers.rb +25 -18
  409. data/lib/mongo/protocol.rb +2 -4
  410. data/lib/mongo/query_cache.rb +36 -21
  411. data/lib/mongo/retryable/base_worker.rb +91 -0
  412. data/lib/mongo/retryable/read_worker.rb +297 -0
  413. data/lib/mongo/retryable/write_worker.rb +367 -0
  414. data/lib/mongo/retryable.rb +31 -454
  415. data/lib/mongo/search_index/view.rb +232 -0
  416. data/lib/mongo/semaphore.rb +2 -2
  417. data/lib/mongo/server/app_metadata/environment.rb +314 -0
  418. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  419. data/lib/mongo/server/app_metadata/truncator.rb +142 -0
  420. data/lib/mongo/server/app_metadata.rb +76 -108
  421. data/lib/mongo/server/connection.rb +94 -20
  422. data/lib/mongo/server/connection_base.rb +3 -1
  423. data/lib/mongo/server/connection_common.rb +5 -2
  424. data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
  425. data/lib/mongo/server/connection_pool/populator.rb +33 -31
  426. data/lib/mongo/server/connection_pool.rb +736 -247
  427. data/lib/mongo/server/description/features.rb +7 -2
  428. data/lib/mongo/server/description/load_balancer.rb +1 -1
  429. data/lib/mongo/server/description.rb +14 -8
  430. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  431. data/lib/mongo/server/monitor/connection.rb +2 -1
  432. data/lib/mongo/server/monitor.rb +36 -20
  433. data/lib/mongo/server/pending_connection.rb +1 -1
  434. data/lib/mongo/server/push_monitor/connection.rb +1 -1
  435. data/lib/mongo/server/push_monitor.rb +14 -4
  436. data/lib/mongo/server/round_trip_time_averager.rb +1 -1
  437. data/lib/mongo/server.rb +105 -35
  438. data/lib/mongo/server_selector/base.rb +77 -8
  439. data/lib/mongo/server_selector/nearest.rb +1 -1
  440. data/lib/mongo/server_selector/primary.rb +1 -1
  441. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  442. data/lib/mongo/server_selector/secondary.rb +1 -1
  443. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  444. data/lib/mongo/server_selector.rb +1 -1
  445. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  446. data/lib/mongo/session/server_session.rb +4 -1
  447. data/lib/mongo/session/session_pool.rb +21 -19
  448. data/lib/mongo/session.rb +164 -37
  449. data/lib/mongo/socket/ocsp_cache.rb +3 -4
  450. data/lib/mongo/socket/ocsp_verifier.rb +5 -6
  451. data/lib/mongo/socket/ssl.rb +1 -1
  452. data/lib/mongo/socket/tcp.rb +4 -1
  453. data/lib/mongo/socket/unix.rb +1 -1
  454. data/lib/mongo/socket.rb +30 -7
  455. data/lib/mongo/srv/monitor.rb +1 -3
  456. data/lib/mongo/srv/resolver.rb +25 -4
  457. data/lib/mongo/srv/result.rb +1 -1
  458. data/lib/mongo/srv.rb +1 -1
  459. data/lib/mongo/timeout.rb +2 -2
  460. data/lib/mongo/topology_version.rb +1 -1
  461. data/lib/mongo/uri/options_mapper.rb +324 -81
  462. data/lib/mongo/uri/srv_protocol.rb +2 -2
  463. data/lib/mongo/uri.rb +61 -17
  464. data/lib/mongo/utils.rb +1 -7
  465. data/lib/mongo/version.rb +2 -2
  466. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  467. data/lib/mongo/write_concern/base.rb +1 -1
  468. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  469. data/lib/mongo/write_concern.rb +1 -1
  470. data/lib/mongo.rb +25 -1
  471. data/mongo.gemspec +10 -7
  472. data/spec/README.md +23 -5
  473. data/spec/atlas/atlas_connectivity_spec.rb +6 -10
  474. data/spec/atlas/operations_spec.rb +4 -13
  475. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  476. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  477. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  478. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  479. data/spec/integration/auth_spec.rb +1 -1
  480. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  481. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  482. data/spec/integration/aws_auth_request_spec.rb +2 -2
  483. data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
  484. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  485. data/spec/integration/bson_symbol_spec.rb +1 -1
  486. data/spec/integration/bulk_insert_spec.rb +1 -1
  487. data/spec/integration/bulk_write_error_message_spec.rb +33 -0
  488. data/spec/integration/bulk_write_spec.rb +17 -1
  489. data/spec/integration/change_stream_examples_spec.rb +1 -1
  490. data/spec/integration/change_stream_spec.rb +12 -6
  491. data/spec/integration/check_clean_slate_spec.rb +1 -1
  492. data/spec/integration/client_authentication_options_spec.rb +1 -1
  493. data/spec/integration/client_connectivity_spec.rb +1 -1
  494. data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
  495. data/spec/integration/client_construction_spec.rb +97 -9
  496. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +10 -10
  497. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +169 -169
  498. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +1 -2
  499. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
  500. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +41 -5
  501. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +146 -3
  502. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  503. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -3
  504. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +3 -3
  505. data/spec/integration/client_side_encryption/client_close_spec.rb +2 -2
  506. data/spec/integration/client_side_encryption/corpus_spec.rb +75 -38
  507. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +40 -43
  508. data/spec/integration/client_side_encryption/data_key_spec.rb +98 -8
  509. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
  510. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +60 -1
  511. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
  512. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +7 -7
  513. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
  514. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  515. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  516. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  517. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  518. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  519. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +114 -0
  520. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
  521. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  522. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +89 -0
  523. data/spec/integration/client_side_encryption/views_spec.rb +2 -2
  524. data/spec/integration/client_spec.rb +8 -3
  525. data/spec/integration/client_update_spec.rb +7 -3
  526. data/spec/integration/collection_indexes_prose_spec.rb +1 -1
  527. data/spec/integration/command_monitoring_spec.rb +1 -1
  528. data/spec/integration/command_spec.rb +2 -24
  529. data/spec/integration/connect_single_rs_name_spec.rb +1 -1
  530. data/spec/integration/connection/faas_env_spec.rb +62 -0
  531. data/spec/integration/connection_pool_populator_spec.rb +27 -7
  532. data/spec/integration/connection_spec.rb +1 -1
  533. data/spec/integration/crud_spec.rb +13 -1
  534. data/spec/integration/cursor_pinning_spec.rb +9 -5
  535. data/spec/integration/cursor_reaping_spec.rb +1 -1
  536. data/spec/integration/docs_examples_spec.rb +2 -2
  537. data/spec/integration/error_detection_spec.rb +1 -1
  538. data/spec/integration/fork_reconnect_spec.rb +17 -10
  539. data/spec/integration/get_more_spec.rb +1 -1
  540. data/spec/integration/grid_fs_bucket_spec.rb +4 -4
  541. data/spec/integration/heartbeat_events_spec.rb +1 -1
  542. data/spec/integration/map_reduce_spec.rb +5 -1
  543. data/spec/integration/mmapv1_spec.rb +1 -1
  544. data/spec/integration/mongos_pinning_spec.rb +1 -1
  545. data/spec/integration/ocsp_connectivity_spec.rb +1 -1
  546. data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
  547. data/spec/integration/ocsp_verifier_spec.rb +5 -2
  548. data/spec/integration/operation_failure_code_spec.rb +1 -1
  549. data/spec/integration/operation_failure_message_spec.rb +1 -0
  550. data/spec/integration/query_cache_spec.rb +124 -33
  551. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  552. data/spec/integration/read_concern_spec.rb +1 -1
  553. data/spec/integration/read_preference_spec.rb +17 -13
  554. data/spec/integration/reconnect_spec.rb +6 -1
  555. data/spec/integration/retryable_errors_spec.rb +1 -1
  556. data/spec/integration/retryable_reads_errors_spec.rb +263 -0
  557. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +2 -2
  558. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  559. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
  560. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
  561. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
  562. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
  563. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
  564. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
  565. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
  566. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
  567. data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
  568. data/spec/integration/retryable_writes_errors_spec.rb +316 -2
  569. data/spec/integration/sdam_error_handling_spec.rb +65 -4
  570. data/spec/integration/sdam_events_spec.rb +1 -1
  571. data/spec/integration/sdam_prose_spec.rb +3 -3
  572. data/spec/integration/search_indexes_prose_spec.rb +168 -0
  573. data/spec/integration/secondary_reads_spec.rb +1 -0
  574. data/spec/integration/server_description_spec.rb +1 -1
  575. data/spec/integration/server_monitor_spec.rb +3 -2
  576. data/spec/integration/server_selection_spec.rb +1 -1
  577. data/spec/integration/server_selector_spec.rb +5 -3
  578. data/spec/integration/server_spec.rb +23 -26
  579. data/spec/integration/shell_examples_spec.rb +1 -1
  580. data/spec/integration/size_limit_spec.rb +5 -2
  581. data/spec/integration/snappy_compression_spec.rb +1 -1
  582. data/spec/integration/snapshot_query_examples_spec.rb +129 -0
  583. data/spec/integration/srv_monitoring_spec.rb +40 -1
  584. data/spec/integration/srv_spec.rb +4 -3
  585. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  586. data/spec/integration/step_down_spec.rb +25 -7
  587. data/spec/integration/time_zone_querying_spec.rb +1 -1
  588. data/spec/integration/transaction_pinning_spec.rb +20 -6
  589. data/spec/integration/transactions_api_examples_spec.rb +1 -1
  590. data/spec/integration/transactions_examples_spec.rb +1 -1
  591. data/spec/integration/truncated_utf8_spec.rb +1 -1
  592. data/spec/integration/versioned_api_examples_spec.rb +38 -32
  593. data/spec/integration/x509_auth_spec.rb +1 -1
  594. data/spec/integration/zlib_compression_spec.rb +1 -1
  595. data/spec/integration/zstd_compression_spec.rb +1 -1
  596. data/spec/kerberos/kerberos_spec.rb +1 -1
  597. data/spec/lite_spec_helper.rb +61 -16
  598. data/spec/mongo/address/ipv4_spec.rb +1 -1
  599. data/spec/mongo/address/ipv6_spec.rb +8 -1
  600. data/spec/mongo/address/unix_spec.rb +1 -1
  601. data/spec/mongo/address/validator_spec.rb +1 -1
  602. data/spec/mongo/address_spec.rb +15 -2
  603. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  604. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  605. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  606. data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
  607. data/spec/mongo/auth/aws/request_spec.rb +1 -1
  608. data/spec/mongo/auth/cr_spec.rb +2 -22
  609. data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
  610. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  611. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  612. data/spec/mongo/auth/ldap_spec.rb +1 -1
  613. data/spec/mongo/auth/scram/conversation_spec.rb +24 -24
  614. data/spec/mongo/auth/scram256/conversation_spec.rb +21 -21
  615. data/spec/mongo/auth/scram_negotiation_spec.rb +2 -1
  616. data/spec/mongo/auth/scram_spec.rb +1 -1
  617. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
  618. data/spec/mongo/auth/stringprep_spec.rb +1 -1
  619. data/spec/mongo/auth/user/view_spec.rb +96 -1
  620. data/spec/mongo/auth/user_spec.rb +1 -1
  621. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  622. data/spec/mongo/auth/x509_spec.rb +1 -1
  623. data/spec/mongo/auth_spec.rb +1 -1
  624. data/spec/mongo/bson_spec.rb +1 -1
  625. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
  626. data/spec/mongo/bulk_write/result_spec.rb +16 -2
  627. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
  628. data/spec/mongo/bulk_write_spec.rb +142 -21
  629. data/spec/mongo/caching_cursor_spec.rb +1 -1
  630. data/spec/mongo/client_construction_spec.rb +734 -631
  631. data/spec/mongo/client_encryption_spec.rb +11 -23
  632. data/spec/mongo/client_spec.rb +389 -152
  633. data/spec/mongo/cluster/cursor_reaper_spec.rb +42 -17
  634. data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
  635. data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
  636. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  637. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  638. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  639. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  640. data/spec/mongo/cluster/topology_spec.rb +1 -1
  641. data/spec/mongo/cluster_spec.rb +193 -199
  642. data/spec/mongo/cluster_time_spec.rb +1 -1
  643. data/spec/mongo/collection/view/aggregation_spec.rb +184 -84
  644. data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
  645. data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
  646. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  647. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  648. data/spec/mongo/collection/view/explainable_spec.rb +3 -1
  649. data/spec/mongo/collection/view/immutable_spec.rb +1 -1
  650. data/spec/mongo/collection/view/iterable_spec.rb +1 -1
  651. data/spec/mongo/collection/view/map_reduce_spec.rb +25 -2
  652. data/spec/mongo/collection/view/readable_spec.rb +744 -2
  653. data/spec/mongo/collection/view/writable_spec.rb +145 -33
  654. data/spec/mongo/collection/view_spec.rb +1 -1
  655. data/spec/mongo/collection_crud_spec.rb +121 -15
  656. data/spec/mongo/collection_ddl_spec.rb +116 -66
  657. data/spec/mongo/collection_spec.rb +48 -2
  658. data/spec/mongo/condition_variable_spec.rb +104 -0
  659. data/spec/mongo/config/options_spec.rb +76 -0
  660. data/spec/mongo/config_spec.rb +74 -0
  661. data/spec/mongo/crypt/auto_decryption_context_spec.rb +18 -2
  662. data/spec/mongo/crypt/auto_encrypter_spec.rb +264 -6
  663. data/spec/mongo/crypt/auto_encryption_context_spec.rb +18 -2
  664. data/spec/mongo/crypt/binary_spec.rb +1 -1
  665. data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
  666. data/spec/mongo/crypt/binding/context_spec.rb +68 -18
  667. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
  668. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +18 -47
  669. data/spec/mongo/crypt/binding/status_spec.rb +1 -1
  670. data/spec/mongo/crypt/binding/version_spec.rb +48 -1
  671. data/spec/mongo/crypt/binding_unloaded_spec.rb +15 -1
  672. data/spec/mongo/crypt/data_key_context_spec.rb +43 -115
  673. data/spec/mongo/crypt/encryption_io_spec.rb +3 -1
  674. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +33 -2
  675. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +95 -2
  676. data/spec/mongo/crypt/handle_spec.rb +187 -156
  677. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
  678. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  679. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  680. data/spec/mongo/crypt/kms/credentials_spec.rb +373 -0
  681. data/spec/mongo/crypt/kms_spec.rb +62 -0
  682. data/spec/mongo/crypt/status_spec.rb +1 -1
  683. data/spec/mongo/crypt_spec.rb +21 -0
  684. data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
  685. data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
  686. data/spec/mongo/cursor_spec.rb +148 -14
  687. data/spec/mongo/database_spec.rb +67 -2
  688. data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
  689. data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
  690. data/spec/mongo/error/crypt_error_spec.rb +1 -1
  691. data/spec/mongo/error/max_bson_size_spec.rb +1 -1
  692. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  693. data/spec/mongo/error/notable_spec.rb +1 -1
  694. data/spec/mongo/error/operation_failure_heavy_spec.rb +50 -1
  695. data/spec/mongo/error/operation_failure_spec.rb +1 -1
  696. data/spec/mongo/error/parser_spec.rb +1 -1
  697. data/spec/mongo/error/unsupported_option_spec.rb +1 -1
  698. data/spec/mongo/event/publisher_spec.rb +1 -1
  699. data/spec/mongo/event/subscriber_spec.rb +1 -1
  700. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  701. data/spec/mongo/grid/file/info_spec.rb +1 -1
  702. data/spec/mongo/grid/file_spec.rb +1 -1
  703. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  704. data/spec/mongo/grid/stream/read_spec.rb +1 -1
  705. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  706. data/spec/mongo/grid/stream_spec.rb +1 -1
  707. data/spec/mongo/id_spec.rb +2 -2
  708. data/spec/mongo/index/view_spec.rb +126 -1
  709. data/spec/mongo/lint_spec.rb +2 -2
  710. data/spec/mongo/logger_spec.rb +1 -1
  711. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
  712. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
  713. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
  714. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
  715. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
  716. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
  717. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
  718. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
  719. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
  720. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
  721. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
  722. data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
  723. data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
  724. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
  725. data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
  726. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  727. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
  728. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  729. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
  730. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  731. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  732. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  733. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  734. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  735. data/spec/mongo/monitoring_spec.rb +1 -1
  736. data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
  737. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  738. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  739. data/spec/mongo/operation/command_spec.rb +1 -1
  740. data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
  741. data/spec/mongo/operation/create_index_spec.rb +1 -1
  742. data/spec/mongo/operation/create_user_spec.rb +1 -1
  743. data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
  744. data/spec/mongo/operation/delete/op_msg_spec.rb +14 -5
  745. data/spec/mongo/operation/delete_spec.rb +1 -31
  746. data/spec/mongo/operation/drop_index_spec.rb +1 -1
  747. data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
  748. data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
  749. data/spec/mongo/operation/indexes_spec.rb +1 -1
  750. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  751. data/spec/mongo/operation/insert/op_msg_spec.rb +19 -11
  752. data/spec/mongo/operation/insert_spec.rb +2 -34
  753. data/spec/mongo/operation/limited_spec.rb +1 -1
  754. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  755. data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
  756. data/spec/mongo/operation/read_preference_op_msg_spec.rb +25 -2
  757. data/spec/mongo/operation/remove_user_spec.rb +1 -1
  758. data/spec/mongo/operation/result_spec.rb +21 -1
  759. data/spec/mongo/operation/specifiable_spec.rb +1 -1
  760. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  761. data/spec/mongo/operation/update/op_msg_spec.rb +14 -5
  762. data/spec/mongo/operation/update_spec.rb +1 -30
  763. data/spec/mongo/operation/update_user_spec.rb +1 -1
  764. data/spec/mongo/options/redacted_spec.rb +2 -2
  765. data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
  766. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  767. data/spec/mongo/protocol/get_more_spec.rb +1 -1
  768. data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
  769. data/spec/mongo/protocol/msg_spec.rb +45 -66
  770. data/spec/mongo/protocol/query_spec.rb +1 -1
  771. data/spec/mongo/protocol/registry_spec.rb +1 -1
  772. data/spec/mongo/protocol/reply_spec.rb +1 -1
  773. data/spec/mongo/query_cache_middleware_spec.rb +1 -1
  774. data/spec/mongo/query_cache_spec.rb +2 -1
  775. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  776. data/spec/mongo/retryable_spec.rb +37 -6
  777. data/spec/mongo/semaphore_spec.rb +7 -7
  778. data/spec/mongo/server/app_metadata/environment_spec.rb +344 -0
  779. data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
  780. data/spec/mongo/server/app_metadata_spec.rb +53 -65
  781. data/spec/mongo/server/connection_auth_spec.rb +4 -2
  782. data/spec/mongo/server/connection_common_spec.rb +14 -2
  783. data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
  784. data/spec/mongo/server/connection_pool_spec.rb +567 -63
  785. data/spec/mongo/server/connection_spec.rb +71 -163
  786. data/spec/mongo/server/description/features_spec.rb +25 -1
  787. data/spec/mongo/server/description_query_methods_spec.rb +1 -1
  788. data/spec/mongo/server/description_spec.rb +1 -1
  789. data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
  790. data/spec/mongo/server/monitor/connection_spec.rb +3 -3
  791. data/spec/mongo/server/monitor_spec.rb +6 -5
  792. data/spec/mongo/server/push_monitor_spec.rb +3 -9
  793. data/spec/mongo/server/round_trip_time_averager_spec.rb +1 -1
  794. data/spec/mongo/server_selector/nearest_spec.rb +1 -1
  795. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
  796. data/spec/mongo/server_selector/primary_spec.rb +1 -1
  797. data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
  798. data/spec/mongo/server_selector/secondary_spec.rb +1 -1
  799. data/spec/mongo/server_selector_spec.rb +137 -16
  800. data/spec/mongo/server_spec.rb +32 -5
  801. data/spec/mongo/session/server_session_spec.rb +1 -1
  802. data/spec/mongo/session/session_pool_spec.rb +2 -17
  803. data/spec/mongo/session_spec.rb +27 -7
  804. data/spec/mongo/session_transaction_spec.rb +19 -3
  805. data/spec/mongo/socket/ssl_spec.rb +45 -72
  806. data/spec/mongo/socket/tcp_spec.rb +1 -1
  807. data/spec/mongo/socket/unix_spec.rb +1 -1
  808. data/spec/mongo/socket_spec.rb +1 -1
  809. data/spec/mongo/srv/monitor_spec.rb +1 -1
  810. data/spec/mongo/srv/result_spec.rb +1 -1
  811. data/spec/mongo/timeout_spec.rb +1 -1
  812. data/spec/mongo/tls_context_hooks_spec.rb +1 -1
  813. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  814. data/spec/mongo/uri/srv_protocol_spec.rb +263 -4
  815. data/spec/mongo/uri_option_parsing_spec.rb +1 -1
  816. data/spec/mongo/uri_spec.rb +168 -11
  817. data/spec/mongo/utils_spec.rb +1 -15
  818. data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
  819. data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
  820. data/spec/mongo/write_concern_spec.rb +1 -1
  821. data/spec/runners/auth.rb +1 -1
  822. data/spec/runners/change_streams/outcome.rb +1 -1
  823. data/spec/runners/change_streams/spec.rb +1 -1
  824. data/spec/runners/change_streams/test.rb +1 -1
  825. data/spec/runners/cmap/verifier.rb +2 -2
  826. data/spec/runners/cmap.rb +188 -45
  827. data/spec/runners/command_monitoring.rb +1 -1
  828. data/spec/runners/connection_string.rb +9 -1
  829. data/spec/runners/crud/context.rb +1 -1
  830. data/spec/runners/crud/operation.rb +14 -5
  831. data/spec/runners/crud/outcome.rb +1 -1
  832. data/spec/runners/crud/requirement.rb +12 -7
  833. data/spec/runners/crud/spec.rb +6 -1
  834. data/spec/runners/crud/test.rb +2 -10
  835. data/spec/runners/crud/test_base.rb +2 -2
  836. data/spec/runners/crud/verifier.rb +10 -5
  837. data/spec/runners/crud.rb +2 -2
  838. data/spec/runners/gridfs.rb +1 -1
  839. data/spec/runners/read_write_concern_document.rb +1 -1
  840. data/spec/runners/sdam/verifier.rb +1 -1
  841. data/spec/runners/sdam.rb +1 -1
  842. data/spec/runners/server_selection.rb +1 -1
  843. data/spec/runners/server_selection_rtt.rb +1 -1
  844. data/spec/runners/transactions/operation.rb +15 -9
  845. data/spec/runners/transactions/spec.rb +3 -3
  846. data/spec/runners/transactions/test.rb +75 -22
  847. data/spec/runners/transactions.rb +12 -9
  848. data/spec/runners/unified/assertions.rb +162 -51
  849. data/spec/runners/unified/change_stream_operations.rb +26 -3
  850. data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
  851. data/spec/runners/unified/crud_operations.rb +166 -28
  852. data/spec/runners/unified/ddl_operations.rb +152 -3
  853. data/spec/runners/unified/entity_map.rb +4 -4
  854. data/spec/runners/unified/error.rb +3 -2
  855. data/spec/runners/unified/event_subscriber.rb +9 -3
  856. data/spec/runners/unified/exceptions.rb +1 -1
  857. data/spec/runners/unified/grid_fs_operations.rb +22 -1
  858. data/spec/runners/unified/search_index_operations.rb +63 -0
  859. data/spec/runners/unified/support_operations.rb +78 -8
  860. data/spec/runners/unified/test.rb +199 -31
  861. data/spec/runners/unified/test_group.rb +1 -1
  862. data/spec/runners/unified/thread_operations.rb +73 -0
  863. data/spec/runners/unified.rb +15 -5
  864. data/spec/shared/lib/mrss/constraints.rb +10 -17
  865. data/spec/shared/lib/mrss/docker_runner.rb +30 -3
  866. data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
  867. data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
  868. data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
  869. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  870. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  871. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  872. data/spec/shared/lib/mrss/utils.rb +28 -6
  873. data/spec/shared/share/Dockerfile.erb +82 -124
  874. data/spec/shared/shlib/config.sh +27 -0
  875. data/spec/shared/shlib/distro.sh +2 -1
  876. data/spec/shared/shlib/server.sh +74 -24
  877. data/spec/shared/shlib/set_env.sh +45 -30
  878. data/spec/solo/clean_exit_spec.rb +5 -7
  879. data/spec/spec_helper.rb +2 -3
  880. data/spec/spec_tests/auth_spec.rb +1 -1
  881. data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
  882. data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
  883. data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
  884. data/spec/spec_tests/cmap_spec.rb +29 -15
  885. data/spec/spec_tests/collection_management_spec.rb +1 -1
  886. data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
  887. data/spec/spec_tests/connection_string_spec.rb +1 -1
  888. data/spec/spec_tests/crud_spec.rb +1 -11
  889. data/spec/spec_tests/crud_unified_spec.rb +1 -1
  890. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
  891. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
  892. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +120 -0
  893. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  894. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1169 -0
  895. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1069 -0
  896. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +307 -0
  897. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  898. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  899. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  900. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  901. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  902. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  903. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  904. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  905. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
  906. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  907. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  908. data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
  909. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  910. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  911. data/spec/spec_tests/data/client_side_encryption/explain.yml +3 -10
  912. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  913. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  914. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  915. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +89 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +82 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +937 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +66 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +100 -0
  922. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +79 -0
  923. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +102 -0
  924. data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +58 -0
  925. data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +200 -0
  926. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +96 -0
  927. data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +89 -0
  928. data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +43 -0
  929. data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +44 -0
  930. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
  931. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
  932. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
  933. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
  934. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
  935. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
  936. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
  937. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
  938. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
  939. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
  940. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
  941. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
  942. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
  943. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
  944. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
  945. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
  946. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
  947. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
  948. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
  949. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
  950. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
  951. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
  952. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
  953. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
  954. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
  955. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
  956. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
  957. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
  958. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
  959. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
  960. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
  961. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
  962. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
  963. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
  964. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
  965. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
  966. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
  967. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
  968. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
  969. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
  970. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
  971. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
  972. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
  973. data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +210 -0
  974. data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +169 -0
  975. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  976. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  977. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  978. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  979. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  980. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  981. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +3 -1
  982. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  983. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  984. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  985. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  986. data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
  987. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
  988. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
  989. data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
  990. data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
  991. data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
  992. data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
  993. data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
  994. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
  995. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
  996. data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
  997. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  998. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  999. data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
  1000. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  1001. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  1002. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  1003. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  1004. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  1005. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  1006. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  1007. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  1008. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  1009. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  1010. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  1011. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
  1012. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  1013. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  1014. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  1015. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  1016. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  1017. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  1018. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  1019. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  1020. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  1021. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  1022. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  1023. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  1024. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
  1025. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  1026. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  1027. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  1028. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  1029. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  1030. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  1031. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  1032. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  1033. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
  1034. data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
  1035. data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
  1036. data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
  1037. data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
  1038. data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
  1039. data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
  1040. data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
  1041. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  1042. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
  1043. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  1044. data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
  1045. data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
  1046. data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
  1047. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  1048. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  1049. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  1050. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  1051. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  1052. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  1053. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  1054. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  1055. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  1056. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  1057. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  1058. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  1059. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  1060. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  1061. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  1062. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  1063. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  1064. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  1065. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  1066. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  1067. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  1068. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  1069. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  1070. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  1071. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  1072. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  1073. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  1074. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  1075. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  1076. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  1077. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  1078. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  1079. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  1080. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  1081. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  1082. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  1083. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  1084. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  1085. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  1086. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  1087. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  1088. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  1089. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  1090. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  1091. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  1092. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  1093. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  1094. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  1095. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  1096. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  1097. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  1098. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  1099. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  1100. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  1101. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  1102. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  1103. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
  1104. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  1105. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  1106. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  1107. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  1108. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  1109. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  1110. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
  1111. data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
  1112. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  1113. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +49 -135
  1114. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  1115. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  1116. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  1117. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  1118. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  1119. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +348 -0
  1120. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  1121. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  1122. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  1123. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  1124. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  1125. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  1126. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
  1127. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  1128. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  1129. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  1130. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  1131. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  1132. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  1133. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  1134. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  1135. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  1136. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  1137. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  1138. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  1139. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  1140. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  1141. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  1142. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  1143. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  1144. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  1145. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  1146. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  1147. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  1148. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  1149. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  1150. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  1151. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  1152. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  1153. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  1154. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  1155. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  1156. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  1157. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  1158. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  1159. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
  1160. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  1161. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  1162. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  1163. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  1164. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  1165. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  1166. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  1167. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  1168. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
  1169. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  1170. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  1171. data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
  1172. data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
  1173. data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
  1174. data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
  1175. data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
  1176. data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
  1177. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
  1178. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
  1179. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
  1180. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
  1181. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  1182. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  1183. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  1184. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  1185. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  1186. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  1187. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  1188. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  1189. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  1190. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  1191. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  1192. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  1193. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  1194. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  1195. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  1196. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  1197. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  1198. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  1199. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  1200. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  1201. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  1202. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  1203. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  1204. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  1205. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  1206. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  1207. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  1208. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  1209. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  1210. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  1211. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  1212. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
  1213. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  1214. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  1215. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  1216. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  1217. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  1218. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  1219. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  1220. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  1221. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  1222. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +93 -0
  1223. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +785 -0
  1224. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  1225. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +75 -0
  1226. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  1227. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  1228. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  1229. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  1230. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
  1231. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  1232. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
  1233. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  1234. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  1235. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  1236. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  1237. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
  1238. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  1239. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
  1240. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  1241. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
  1242. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
  1243. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
  1244. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
  1245. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  1246. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  1247. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  1248. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  1249. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  1250. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  1251. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  1252. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  1253. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  1254. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  1255. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  1256. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1257. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1258. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1259. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1260. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1261. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1262. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1263. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1264. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1265. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1266. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
  1267. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  1268. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
  1269. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
  1270. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  1271. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  1272. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +11 -0
  1273. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +11 -0
  1274. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  1275. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  1276. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  1277. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  1278. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  1279. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  1280. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  1281. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  1282. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  1283. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  1284. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  1285. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  1286. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  1287. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  1288. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  1289. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  1290. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1291. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
  1292. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  1293. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  1294. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  1295. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  1296. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  1297. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  1298. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  1299. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  1300. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  1301. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  1302. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  1303. data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
  1304. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
  1305. data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
  1306. data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
  1307. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1308. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1309. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1310. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1311. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  1312. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1313. data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
  1314. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1315. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1316. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1317. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1318. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  1319. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1320. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1321. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +22 -1
  1322. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  1323. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +19 -13
  1324. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
  1325. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +9 -9
  1326. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  1327. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  1328. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  1329. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +6 -5
  1330. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  1331. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  1332. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  1333. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
  1334. data/spec/spec_tests/gridfs_spec.rb +1 -1
  1335. data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
  1336. data/spec/spec_tests/index_management_unified_spec.rb +13 -0
  1337. data/spec/spec_tests/load_balancers_spec.rb +1 -1
  1338. data/spec/spec_tests/max_staleness_spec.rb +1 -1
  1339. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  1340. data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
  1341. data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
  1342. data/spec/spec_tests/retryable_reads_spec.rb +7 -2
  1343. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  1344. data/spec/spec_tests/retryable_writes_spec.rb +5 -2
  1345. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  1346. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  1347. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
  1348. data/spec/spec_tests/sdam_spec.rb +5 -1
  1349. data/spec/spec_tests/sdam_unified_spec.rb +15 -0
  1350. data/spec/spec_tests/seed_list_discovery_spec.rb +11 -2
  1351. data/spec/spec_tests/server_selection_rtt_spec.rb +1 -1
  1352. data/spec/spec_tests/server_selection_spec.rb +1 -1
  1353. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  1354. data/spec/spec_tests/transactions_api_spec.rb +1 -1
  1355. data/spec/spec_tests/transactions_spec.rb +1 -1
  1356. data/spec/spec_tests/transactions_unified_spec.rb +1 -1
  1357. data/spec/spec_tests/unified_spec.rb +2 -2
  1358. data/spec/spec_tests/uri_options_spec.rb +1 -1
  1359. data/spec/spec_tests/versioned_api_spec.rb +1 -1
  1360. data/spec/stress/cleanup_spec.rb +1 -1
  1361. data/spec/stress/connection_pool_stress_spec.rb +1 -62
  1362. data/spec/stress/connection_pool_timing_spec.rb +12 -36
  1363. data/spec/stress/fork_reconnect_stress_spec.rb +10 -10
  1364. data/spec/stress/push_monitor_close_spec.rb +1 -1
  1365. data/spec/support/authorization.rb +2 -2
  1366. data/spec/support/aws_utils/base.rb +1 -1
  1367. data/spec/support/aws_utils/inspector.rb +1 -1
  1368. data/spec/support/aws_utils/orchestrator.rb +20 -8
  1369. data/spec/support/aws_utils/provisioner.rb +1 -1
  1370. data/spec/support/aws_utils.rb +4 -3
  1371. data/spec/support/background_thread_registry.rb +4 -14
  1372. data/spec/support/certificates/atlas-ocsp-ca.crt +67 -67
  1373. data/spec/support/certificates/atlas-ocsp.crt +103 -103
  1374. data/spec/support/certificates/retrieve-atlas-cert +40 -0
  1375. data/spec/support/client_registry.rb +6 -2
  1376. data/spec/support/client_registry_macros.rb +1 -1
  1377. data/spec/support/cluster_tools.rb +14 -9
  1378. data/spec/support/common_shortcuts.rb +52 -5
  1379. data/spec/support/constraints.rb +21 -1
  1380. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  1381. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  1382. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  1383. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  1384. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  1385. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  1386. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  1387. data/spec/support/crypt/corpus/corpus.json +4999 -37
  1388. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  1389. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  1390. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  1391. data/spec/support/crypt/encrypted_fields/encryptedFields.json +32 -0
  1392. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1393. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1394. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1395. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1396. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1397. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1398. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1399. data/spec/support/crypt/keys/key1-document.json +30 -0
  1400. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  1401. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  1402. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  1403. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  1404. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  1405. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  1406. data/spec/support/crypt.rb +269 -14
  1407. data/spec/support/dns.rb +1 -1
  1408. data/spec/support/faas/app/aws_lambda/mongodb/Gemfile.lock +19 -0
  1409. data/spec/support/json_ext_formatter.rb +1 -1
  1410. data/spec/support/keyword_struct.rb +1 -1
  1411. data/spec/support/local_resource_registry.rb +1 -1
  1412. data/spec/support/macros.rb +29 -0
  1413. data/spec/support/matchers.rb +5 -5
  1414. data/spec/support/mongos_macros.rb +24 -0
  1415. data/spec/support/monitoring_ext.rb +1 -1
  1416. data/spec/support/ocsp +1 -1
  1417. data/spec/support/primary_socket.rb +1 -1
  1418. data/spec/support/recording_logger.rb +27 -0
  1419. data/spec/support/sdam_formatter_integration.rb +1 -1
  1420. data/spec/support/shared/app_metadata.rb +15 -3
  1421. data/spec/support/shared/auth_context.rb +1 -0
  1422. data/spec/support/shared/protocol.rb +1 -1
  1423. data/spec/support/shared/scram_conversation.rb +3 -2
  1424. data/spec/support/shared/server_selector.rb +1 -1
  1425. data/spec/support/shared/session.rb +14 -8
  1426. data/spec/support/spec_config.rb +133 -2
  1427. data/spec/support/spec_setup.rb +1 -1
  1428. data/spec/support/using_hash.rb +11 -2
  1429. data/spec/support/utils.rb +277 -228
  1430. data.tar.gz.sig +0 -0
  1431. metadata +1868 -1248
  1432. metadata.gz.sig +0 -0
  1433. data/lib/mongo/operation/aggregate/command.rb +0 -55
  1434. data/lib/mongo/operation/collections_info/command.rb +0 -48
  1435. data/lib/mongo/operation/count/command.rb +0 -47
  1436. data/lib/mongo/operation/create/command.rb +0 -47
  1437. data/lib/mongo/operation/create_index/command.rb +0 -61
  1438. data/lib/mongo/operation/delete/command.rb +0 -52
  1439. data/lib/mongo/operation/delete/legacy.rb +0 -64
  1440. data/lib/mongo/operation/distinct/command.rb +0 -47
  1441. data/lib/mongo/operation/drop_database/command.rb +0 -41
  1442. data/lib/mongo/operation/explain/command.rb +0 -58
  1443. data/lib/mongo/operation/explain/legacy.rb +0 -52
  1444. data/lib/mongo/operation/find/builder/legacy.rb +0 -123
  1445. data/lib/mongo/operation/find/command.rb +0 -51
  1446. data/lib/mongo/operation/find/legacy/result.rb +0 -46
  1447. data/lib/mongo/operation/find/legacy.rb +0 -52
  1448. data/lib/mongo/operation/indexes/command.rb +0 -42
  1449. data/lib/mongo/operation/indexes/legacy.rb +0 -48
  1450. data/lib/mongo/operation/insert/command.rb +0 -59
  1451. data/lib/mongo/operation/insert/legacy.rb +0 -68
  1452. data/lib/mongo/operation/kill_cursors/command.rb +0 -48
  1453. data/lib/mongo/operation/list_collections/command.rb +0 -46
  1454. data/lib/mongo/operation/map_reduce/command.rb +0 -51
  1455. data/lib/mongo/operation/parallel_scan/command.rb +0 -57
  1456. data/lib/mongo/operation/remove_user/command.rb +0 -46
  1457. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -44
  1458. data/lib/mongo/operation/update/command.rb +0 -53
  1459. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  1460. data/lib/mongo/operation/update/legacy.rb +0 -76
  1461. data/lib/mongo/operation/users_info/command.rb +0 -46
  1462. data/lib/mongo/operation/write_command/command.rb +0 -51
  1463. data/lib/mongo/protocol/delete.rb +0 -172
  1464. data/lib/mongo/protocol/insert.rb +0 -181
  1465. data/lib/mongo/protocol/update.rb +0 -214
  1466. data/spec/mongo/dbref_spec.rb +0 -152
  1467. data/spec/mongo/operation/delete/command_spec.rb +0 -115
  1468. data/spec/mongo/operation/find/legacy_spec.rb +0 -131
  1469. data/spec/mongo/operation/get_more_spec.rb +0 -63
  1470. data/spec/mongo/operation/insert/command_spec.rb +0 -118
  1471. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  1472. data/spec/mongo/operation/update/command_spec.rb +0 -122
  1473. data/spec/mongo/protocol/delete_spec.rb +0 -185
  1474. data/spec/mongo/protocol/insert_spec.rb +0 -179
  1475. data/spec/mongo/protocol/update_spec.rb +0 -204
  1476. data/spec/spec_tests/change_streams_spec.rb +0 -93
  1477. data/spec/spec_tests/command_monitoring_spec.rb +0 -71
  1478. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  1479. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  1480. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  1481. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  1482. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
  1483. data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
  1484. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
  1485. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
  1486. data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
  1487. data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
  1488. data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
  1489. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
  1490. data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
  1491. data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
  1492. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  1493. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  1494. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  1495. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  1496. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  1497. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  1498. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  1499. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  1500. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  1501. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  1502. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  1503. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  1504. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  1505. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  1506. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  1507. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  1508. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  1509. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  1510. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  1511. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  1512. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  1513. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  1514. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  1515. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  1516. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  1517. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  1518. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  1519. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  1520. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  1521. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  1522. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  1523. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  1524. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  1525. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  1526. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  1527. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  1528. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  1529. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  1530. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  1531. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  1532. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  1533. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  1534. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  1535. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  1536. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  1537. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  1538. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  1539. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  1540. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1541. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1542. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
  1543. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
  1544. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -160
  1545. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -158
  1546. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -225
  1547. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
  1548. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
  1549. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
  1550. data/spec/spec_tests/sdam_integration_spec.rb +0 -16
  1551. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  1552. data/spec/support/session_registry.rb +0 -55
  1553. /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  1554. /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  1555. /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  1556. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  1557. /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  1558. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  1559. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  1560. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  1561. /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  1562. /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  1563. /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  1564. /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  1565. /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  1566. /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  1567. /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  1568. /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  1569. /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  1570. /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  1571. /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  1572. /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  1573. /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  1574. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  1575. /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  1576. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  1577. /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  1578. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  1579. /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  1580. /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  1581. /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  1582. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  1583. /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  1584. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  1585. /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  1586. /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  1587. /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  1588. /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  1589. /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  1590. /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  1591. /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  1592. /data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  1593. /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  1594. /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  1595. /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  1596. /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  1597. /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  1598. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  1599. /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  1600. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  1601. /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  1602. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  1603. /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  1604. /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  1605. /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  1606. /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  1607. /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  1608. /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  1609. /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  1610. /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  1611. /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  1612. /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2014-2020 MongoDB Inc.
5
5
  #
@@ -29,12 +29,16 @@ module Mongo
29
29
  # The default max size for the connection pool.
30
30
  #
31
31
  # @since 2.9.0
32
- DEFAULT_MAX_SIZE = 5.freeze
32
+ DEFAULT_MAX_SIZE = 20
33
33
 
34
34
  # The default min size for the connection pool.
35
35
  #
36
36
  # @since 2.9.0
37
- DEFAULT_MIN_SIZE = 0.freeze
37
+ DEFAULT_MIN_SIZE = 0
38
+
39
+ # The default maximum number of connections that can be connecting at
40
+ # any given time.
41
+ DEFAULT_MAX_CONNECTING = 2
38
42
 
39
43
  # The default timeout, in seconds, to wait for a connection.
40
44
  #
@@ -59,7 +63,13 @@ module Mongo
59
63
  # @param [ Server ] server The server which this connection pool is for.
60
64
  # @param [ Hash ] options The connection pool options.
61
65
  #
62
- # @option options [ Integer ] :max_size The maximum pool size.
66
+ # @option options [ Integer ] :max_size The maximum pool size. Setting
67
+ # this option to zero creates an unlimited connection pool.
68
+ # @option options [ Integer ] :max_connecting The maximum number of
69
+ # connections that can be connecting simultaneously. The default is 2.
70
+ # This option should be increased if there are many threads that share
71
+ # same connection pool and the application is experiencing timeouts
72
+ # while waiting for connections to be established.
63
73
  # @option options [ Integer ] :max_pool_size Deprecated.
64
74
  # The maximum pool size. If max_size is also given, max_size and
65
75
  # max_pool_size must be identical.
@@ -74,11 +84,21 @@ module Mongo
74
84
  # are given, their values must be identical.
75
85
  # @option options [ Float ] :max_idle_time The time, in seconds,
76
86
  # after which idle connections should be closed by the pool.
87
+ # @option options [ true, false ] :populator_io For internal driver
88
+ # use only. Set to false to prevent the populator threads from being
89
+ # created and started in the server's connection pool. It is intended
90
+ # for use in tests that also turn off monitoring_io, unless the populator
91
+ # is explicitly needed. If monitoring_io is off, but the populator_io
92
+ # is on, the populator needs to be manually closed at the end of the
93
+ # test, since a cluster without monitoring is considered not connected,
94
+ # and thus will not clean up the connection pool populator threads on
95
+ # close.
77
96
  # Note: Additionally, options for connections created by this pool should
78
97
  # be included in the options passed here, and they will be forwarded to
79
98
  # any connections created by the pool.
80
99
  #
81
100
  # @since 2.0.0, API changed in 2.9.0
101
+
82
102
  def initialize(server, options = {})
83
103
  unless server.is_a?(Server)
84
104
  raise ArgumentError, 'First argument must be a Server instance'
@@ -98,7 +118,7 @@ module Mongo
98
118
  options[:max_size] ||= options[:max_pool_size]
99
119
  options.delete(:max_pool_size)
100
120
  if options[:min_size] && options[:max_size] &&
101
- options[:min_size] > options[:max_size]
121
+ (options[:max_size] != 0 && options[:min_size] > options[:max_size])
102
122
  then
103
123
  raise ArgumentError, "Cannot have min size #{options[:min_size]} exceed max size #{options[:max_size]}"
104
124
  end
@@ -111,6 +131,7 @@ module Mongo
111
131
  @options = options.freeze
112
132
 
113
133
  @generation_manager = GenerationManager.new(server: server)
134
+ @ready = false
114
135
  @closed = false
115
136
 
116
137
  # A connection owned by this pool should be either in the
@@ -119,6 +140,7 @@ module Mongo
119
140
  @available_connections = available_connections = []
120
141
  @checked_out_connections = Set.new
121
142
  @pending_connections = Set.new
143
+ @interrupt_connections = []
122
144
 
123
145
  # Mutex used for synchronizing access to @available_connections and
124
146
  # @checked_out_connections. The pool object is thread-safe, thus
@@ -126,30 +148,42 @@ module Mongo
126
148
  # must do so under this lock.
127
149
  @lock = Mutex.new
128
150
 
129
- # Condition variable broadcast when a connection is added to
130
- # @available_connections, to wake up any threads waiting for an
131
- # available connection when pool is at max size
132
- @available_semaphore = Semaphore.new
133
-
134
151
  # Background thread reponsible for maintaining the size of
135
152
  # the pool to at least min_size
136
153
  @populator = Populator.new(self, options)
137
154
  @populate_semaphore = Semaphore.new
138
155
 
156
+ # Condition variable to enforce the first check in check_out: max_pool_size.
157
+ # This condition variable should be signaled when the number of
158
+ # unavailable connections decreases (pending + pending_connections +
159
+ # checked_out_connections).
160
+ @size_cv = Mongo::ConditionVariable.new(@lock)
161
+ # This represents the number of threads that have made it past the size_cv
162
+ # gate but have not acquired a connection to add to the pending_connections
163
+ # set.
164
+ @connection_requests = 0
165
+
166
+ # Condition variable to enforce the second check in check_out: max_connecting.
167
+ # Thei condition variable should be signaled when the number of pending
168
+ # connections decreases.
169
+ @max_connecting_cv = Mongo::ConditionVariable.new(@lock)
170
+ @max_connecting = options.fetch(:max_connecting, DEFAULT_MAX_CONNECTING)
171
+
139
172
  ObjectSpace.define_finalizer(self, self.class.finalize(@available_connections, @pending_connections, @populator))
140
173
 
141
174
  publish_cmap_event(
142
175
  Monitoring::Event::Cmap::PoolCreated.new(@server.address, options, self)
143
176
  )
144
-
145
- @populator.run! if min_size > 0
146
177
  end
147
178
 
148
179
  # @return [ Hash ] options The pool options.
149
180
  attr_reader :options
150
181
 
151
182
  # @api private
152
- def_delegators :@server, :address
183
+ attr_reader :server
184
+
185
+ # @api private
186
+ def_delegators :server, :address
153
187
 
154
188
  # Get the maximum size of the connection pool.
155
189
  #
@@ -195,7 +229,20 @@ module Mongo
195
229
  # being used by the queue.
196
230
  #
197
231
  # @api private
198
- def_delegator :generation_manager, :generation
232
+ def_delegators :generation_manager, :generation, :generation_unlocked
233
+
234
+ # A connection pool is paused if it is not closed and it is not ready.
235
+ #
236
+ # @return [ true | false ] whether the connection pool is paused.
237
+ #
238
+ # @raise [ Error::PoolClosedError ] If the pool has been closed.
239
+ def paused?
240
+ raise_if_closed!
241
+
242
+ @lock.synchronize do
243
+ !@ready
244
+ end
245
+ end
199
246
 
200
247
  # Size of the connection pool.
201
248
  #
@@ -221,6 +268,14 @@ module Mongo
221
268
  end
222
269
  private :unsynchronized_size
223
270
 
271
+ # @return [ Integer ] The number of unavailable connections in the pool.
272
+ # Used to calculate whether we have hit max_pool_size.
273
+ #
274
+ # @api private
275
+ def unavailable_connections
276
+ @checked_out_connections.length + @pending_connections.length + @connection_requests
277
+ end
278
+
224
279
  # Number of available connections in the pool.
225
280
  #
226
281
  # @return [ Integer ] Number of available connections.
@@ -243,14 +298,30 @@ module Mongo
243
298
  !!@closed
244
299
  end
245
300
 
301
+ # Whether the pool is ready.
302
+ #
303
+ # @return [ true | false ] Whether the pool is ready.
304
+ def ready?
305
+ @lock.synchronize do
306
+ @ready
307
+ end
308
+ end
309
+
246
310
  # @note This method is experimental and subject to change.
247
311
  #
248
312
  # @api experimental
249
313
  # @since 2.11.0
250
314
  def summary
251
315
  @lock.synchronize do
316
+ state = if closed?
317
+ 'closed'
318
+ elsif !@ready
319
+ 'paused'
320
+ else
321
+ 'ready'
322
+ end
252
323
  "#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " +
253
- "used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length}>"
324
+ "used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length} #{state}>"
254
325
  end
255
326
  end
256
327
 
@@ -260,6 +331,9 @@ module Mongo
260
331
  # @api private
261
332
  attr_reader :populator
262
333
 
334
+ # @api private
335
+ attr_reader :max_connecting
336
+
263
337
  # Checks a connection out of the pool.
264
338
  #
265
339
  # If there are active connections in the pool, the most recently used
@@ -278,139 +352,17 @@ module Mongo
278
352
  # and remains so for longer than the wait timeout.
279
353
  #
280
354
  # @since 2.9.0
281
- def check_out(service_id: nil)
355
+ def check_out(connection_global_id: nil)
282
356
  check_invariants
283
357
 
284
358
  publish_cmap_event(
285
359
  Monitoring::Event::Cmap::ConnectionCheckOutStarted.new(@server.address)
286
360
  )
287
361
 
288
- if closed?
289
- publish_cmap_event(
290
- Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
291
- @server.address,
292
- Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
293
- ),
294
- )
295
- raise Error::PoolClosedError.new(@server.address, self)
296
- end
297
-
298
- deadline = Utils.monotonic_time + wait_timeout
299
- pid = Process.pid
300
- connection = nil
301
- # It seems that synchronize sets up its own loop, thus a simple break
302
- # is insufficient to break the outer loop
303
- catch(:done) do
304
- loop do
305
- # Lock must be taken on each iteration, rather for the method
306
- # overall, otherwise other threads will not be able to check in
307
- # a connection while this thread is waiting for one.
308
- @lock.synchronize do
309
- until @available_connections.empty?
310
- connection = next_available_connection(service_id: service_id)
311
-
312
- # If service_id is not nil, connection may be nil here
313
- # even if there are available connections in the pool
314
- # (they could be to other services).
315
- break unless connection
316
-
317
- if connection.pid != pid
318
- log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
319
- connection.disconnect!(reason: :stale)
320
- @populate_semaphore.signal
321
- next
322
- end
323
-
324
- if connection.generation != generation(service_id: connection.service_id)
325
- # Stale connections should be disconnected in the clear
326
- # method, but if any don't, check again here
327
- connection.disconnect!(reason: :stale)
328
- @populate_semaphore.signal
329
- next
330
- end
331
-
332
- if max_idle_time && connection.last_checkin &&
333
- Time.now - connection.last_checkin > max_idle_time
334
- then
335
- connection.disconnect!(reason: :idle)
336
- @populate_semaphore.signal
337
- next
338
- end
339
-
340
- @pending_connections << connection
341
- throw(:done)
342
- end
362
+ raise_if_pool_closed!
363
+ raise_if_pool_paused_locked!
343
364
 
344
- if service_id
345
- # If we need a connection to a particular service, we can't
346
- # create one if we don't already have one, but we can wait
347
- # for an in-progress operation to return such a connection
348
- # to the pool, or for the populator to create a suitable
349
- # connection.
350
- else
351
- # If we are below pool capacity, create a new connection.
352
- #
353
- # Ruby does not allow a thread to lock a mutex which it already
354
- # holds.
355
- if unsynchronized_size < max_size
356
- connection = create_connection
357
- @pending_connections << connection
358
- throw(:done)
359
- end
360
- end
361
- end
362
-
363
- wait = deadline - Utils.monotonic_time
364
- if wait <= 0
365
- publish_cmap_event(
366
- Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
367
- @server.address,
368
- Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
369
- ),
370
- )
371
-
372
- msg = @lock.synchronize do
373
- service_id_msg = if service_id
374
- " for service #{service_id}"
375
- else
376
- ''
377
- end
378
-
379
- "Timed out attempting to check out a connection " +
380
- "from pool for #{@server.address}#{service_id_msg} after #{wait_timeout} sec. " +
381
- "Connections in pool: #{@available_connections.length} available, " +
382
- "#{@checked_out_connections.length} checked out, " +
383
- "#{@pending_connections.length} pending " +
384
- "(max size: #{max_size})"
385
- end
386
- raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
387
- end
388
- @available_semaphore.wait(wait)
389
- end
390
- end
391
-
392
- begin
393
- connect_connection(connection)
394
- rescue Exception
395
- # Handshake or authentication failed
396
- @lock.synchronize do
397
- @pending_connections.delete(connection)
398
- end
399
- @populate_semaphore.signal
400
-
401
- publish_cmap_event(
402
- Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
403
- @server.address,
404
- Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
405
- ),
406
- )
407
- raise
408
- end
409
-
410
- @lock.synchronize do
411
- @checked_out_connections << connection
412
- @pending_connections.delete(connection)
413
- end
365
+ connection = retrieve_and_connect_connection(connection_global_id)
414
366
 
415
367
  publish_cmap_event(
416
368
  Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self),
@@ -438,67 +390,114 @@ module Mongo
438
390
  check_invariants
439
391
 
440
392
  @lock.synchronize do
441
- unless connection.connection_pool == self
442
- raise ArgumentError, "Trying to check in a connection which was not checked out by this pool: #{connection} checked out from pool #{connection.connection_pool} (for #{self})"
443
- end
393
+ do_check_in(connection)
394
+ end
395
+ ensure
396
+ check_invariants
397
+ end
444
398
 
445
- unless @checked_out_connections.include?(connection)
446
- raise ArgumentError, "Trying to check in a connection which is not currently checked out by this pool: #{connection} (for #{self})"
447
- end
399
+ # Executes the check in after having already acquired the lock.
400
+ #
401
+ # @param [ Mongo::Server::Connection ] connection The connection.
402
+ def do_check_in(connection)
403
+ # When a connection is interrupted it is checked back into the pool
404
+ # and closed. The operation that was using the connection before it was
405
+ # interrupted will attempt to check it back into the pool, and we
406
+ # should ignore it since its already been closed and removed from the pool.
407
+ return if connection.closed? && connection.interrupted?
408
+
409
+ unless connection.connection_pool == self
410
+ raise ArgumentError, "Trying to check in a connection which was not checked out by this pool: #{connection} checked out from pool #{connection.connection_pool} (for #{self})"
411
+ end
448
412
 
449
- # Note: if an event handler raises, resource will not be signaled.
450
- # This means threads waiting for a connection to free up when
451
- # the pool is at max size may time out.
452
- # Threads that begin waiting after this method completes (with
453
- # the exception) should be fine.
413
+ unless @checked_out_connections.include?(connection)
414
+ raise ArgumentError, "Trying to check in a connection which is not currently checked out by this pool: #{connection} (for #{self})"
415
+ end
454
416
 
455
- @checked_out_connections.delete(connection)
456
- publish_cmap_event(
457
- Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
458
- )
417
+ # Note: if an event handler raises, resource will not be signaled.
418
+ # This means threads waiting for a connection to free up when
419
+ # the pool is at max size may time out.
420
+ # Threads that begin waiting after this method completes (with
421
+ # the exception) should be fine.
459
422
 
460
- if connection.error?
461
- connection.disconnect!(reason: :error)
462
- return
463
- end
423
+ @checked_out_connections.delete(connection)
424
+ @size_cv.signal
464
425
 
465
- if closed?
466
- connection.disconnect!(reason: :pool_closed)
467
- return
468
- end
426
+ publish_cmap_event(
427
+ Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
428
+ )
469
429
 
470
- if connection.closed?
471
- # Connection was closed - for example, because it experienced
472
- # a network error. Nothing else needs to be done here.
473
- @populate_semaphore.signal
474
- elsif connection.generation != generation(service_id: connection.service_id)
475
- connection.disconnect!(reason: :stale)
476
- @populate_semaphore.signal
477
- else
478
- connection.record_checkin!
479
- @available_connections << connection
430
+ if connection.interrupted?
431
+ connection.disconnect!(reason: :stale)
432
+ return
433
+ end
480
434
 
481
- # Wake up only one thread waiting for an available connection,
482
- # since only one connection was checked in.
483
- @available_semaphore.signal
484
- end
435
+ if connection.error?
436
+ connection.disconnect!(reason: :error)
437
+ return
438
+ end
439
+
440
+ if closed?
441
+ connection.disconnect!(reason: :pool_closed)
442
+ return
443
+ end
444
+
445
+ if connection.closed?
446
+ # Connection was closed - for example, because it experienced
447
+ # a network error. Nothing else needs to be done here.
448
+ @populate_semaphore.signal
449
+ elsif connection.generation != generation(service_id: connection.service_id) && !connection.pinned?
450
+ # If connection is marked as pinned, it is used by a transaction
451
+ # or a series of cursor operations in a load balanced setup.
452
+ # In this case connection should not be disconnected until
453
+ # unpinned.
454
+ connection.disconnect!(reason: :stale)
455
+ @populate_semaphore.signal
456
+ else
457
+ connection.record_checkin!
458
+ @available_connections << connection
459
+
460
+ @max_connecting_cv.signal
461
+ end
462
+ end
463
+
464
+ # Mark the connection pool as paused.
465
+ def pause
466
+ raise_if_closed!
467
+
468
+ check_invariants
469
+
470
+ @lock.synchronize do
471
+ do_pause
485
472
  end
486
473
  ensure
487
474
  check_invariants
488
475
  end
489
476
 
477
+ # Mark the connection pool as paused without acquiring the lock.
478
+ #
479
+ # @api private
480
+ def do_pause
481
+ if Lint.enabled? && !@server.unknown?
482
+ raise Error::LintError, "Attempting to pause pool for server #{@server.summary} which is known"
483
+ end
484
+
485
+ return if !@ready
486
+
487
+ @ready = false
488
+ end
489
+
490
490
  # Closes all idle connections in the pool and schedules currently checked
491
491
  # out connections to be closed when they are checked back into the pool.
492
- # The pool remains operational and can create new connections when
493
- # requested.
492
+ # The pool is paused, it will not create new connections in background
493
+ # and it will fail checkout requests until marked ready.
494
494
  #
495
495
  # @option options [ true | false ] :lazy If true, do not close any of
496
496
  # the idle connections and instead let them be closed during a
497
- # subsequent check out operation.
498
- # @option options [ Object ] :service_id Discard state for the specified
499
- # service id only.
500
- # @option options [ true | false ] :stop_populator Whether to stop
501
- # the populator background thread. For internal driver use only.
497
+ # subsequent check out operation. Defaults to false.
498
+ # @option options [ true | false ] :interrupt_in_use_connections If true,
499
+ # close all checked out connections immediately. If it is false, do not
500
+ # close any of the checked out connections. Defaults to true.
502
501
  # @option options [ Object ] :service_id Clear connections with
503
502
  # the specified service id only.
504
503
  #
@@ -508,56 +507,112 @@ module Mongo
508
507
  def clear(options = nil)
509
508
  raise_if_closed!
510
509
 
511
- check_invariants
512
-
513
- if options && options[:stop_populator]
514
- stop_populator
510
+ if Lint.enabled? && !@server.unknown?
511
+ raise Error::LintError, "Attempting to clear pool for server #{@server.summary} which is known"
515
512
  end
516
513
 
514
+ do_clear(options)
515
+ end
516
+
517
+ # Disconnects the pool.
518
+ #
519
+ # Does everything that +clear+ does, except if the pool is closed
520
+ # this method does nothing but +clear+ would raise PoolClosedError.
521
+ #
522
+ # @since 2.1.0
523
+ # @api private
524
+ def disconnect!(options = nil)
525
+ do_clear(options)
526
+ rescue Error::PoolClosedError
527
+ # The "disconnected" state is between closed and paused.
528
+ # When we are trying to disconnect the pool, permit the pool to be
529
+ # already closed.
530
+ end
531
+
532
+ def do_clear(options = nil)
533
+ check_invariants
534
+
517
535
  service_id = options && options[:service_id]
518
536
 
519
537
  @lock.synchronize do
538
+ # Generation must be bumped before emitting pool cleared event.
520
539
  @generation_manager.bump(service_id: service_id)
521
540
 
522
- publish_cmap_event(
523
- Monitoring::Event::Cmap::PoolCleared.new(
524
- @server.address,
525
- service_id: service_id,
526
- )
527
- )
528
-
529
541
  unless options && options[:lazy]
530
- if service_id
531
- loop do
532
- conn = @available_connections.detect do |conn|
533
- conn.service_id == service_id
534
- end
535
- if conn
536
- @available_connections.delete(conn)
537
- conn.disconnect!(reason: :stale)
538
- @populate_semaphore.signal
539
- else
540
- break
541
- end
542
- end
543
- else
544
- until @available_connections.empty?
545
- connection = @available_connections.pop
546
- connection.disconnect!(reason: :stale)
547
- @populate_semaphore.signal
548
- end
549
- end
542
+ close_available_connections(service_id)
543
+ end
544
+
545
+ if options && options[:interrupt_in_use_connections]
546
+ schedule_for_interruption(@checked_out_connections, service_id)
547
+ schedule_for_interruption(@pending_connections, service_id)
548
+ end
549
+
550
+ if @ready
551
+ publish_cmap_event(
552
+ Monitoring::Event::Cmap::PoolCleared.new(
553
+ @server.address,
554
+ service_id: service_id,
555
+ interrupt_in_use_connections: options&.[](:interrupt_in_use_connections)
556
+ )
557
+ )
558
+ # Only pause the connection pool if the server was marked unknown,
559
+ # otherwise, allow the retry to be attempted with a ready pool.
560
+ do_pause if !@server.load_balancer? && @server.unknown?
550
561
  end
562
+
563
+ # Broadcast here to cause all of the threads waiting on the max
564
+ # connecting to break out of the wait loop and error.
565
+ @max_connecting_cv.broadcast
566
+ # Broadcast here to cause all of the threads waiting on the pool size
567
+ # to break out of the wait loop and error.
568
+ @size_cv.broadcast
551
569
  end
552
570
 
571
+ # "Schedule the background thread" after clearing. This is responsible
572
+ # for cleaning up stale threads, and interrupting in use connections.
573
+ @populate_semaphore.signal
553
574
  true
554
575
  ensure
555
576
  check_invariants
556
577
  end
557
578
 
558
- # @since 2.1.0
559
- # @deprecated
560
- alias :disconnect! :clear
579
+ # Instructs the pool to create and return connections.
580
+ def ready
581
+ raise_if_closed!
582
+
583
+ # TODO: Add this back in RUBY-3174.
584
+ # if Lint.enabled?
585
+ # unless @server.connected?
586
+ # raise Error::LintError, "Attempting to ready a pool for server #{@server.summary} which is disconnected"
587
+ # end
588
+ # end
589
+
590
+ @lock.synchronize do
591
+ return if @ready
592
+
593
+ @ready = true
594
+ end
595
+
596
+ # Note that the CMAP spec demands serialization of CMAP events for a
597
+ # pool. In order to implement this, event publication must be done into
598
+ # a queue which is synchronized, instead of subscribers being invoked
599
+ # from the trigger method like this one here inline. On MRI, assuming
600
+ # the threads yield to others when they stop having work to do, it is
601
+ # likely that the events would in practice always be published in the
602
+ # required order. JRuby, being truly concurrent with OS threads,
603
+ # would not offers such a guarantee.
604
+ publish_cmap_event(
605
+ Monitoring::Event::Cmap::PoolReady.new(@server.address, options, self)
606
+ )
607
+
608
+ if options.fetch(:populator_io, true)
609
+ if @populator.running?
610
+ @populate_semaphore.signal
611
+ else
612
+ @populator.run!
613
+ end
614
+ end
615
+ end
561
616
 
562
617
  # Marks the pool closed, closes all idle connections in the pool and
563
618
  # schedules currently checked out connections to be closed when they are
@@ -567,6 +622,8 @@ module Mongo
567
622
  #
568
623
  # @option options [ true | false ] :force Also close all checked out
569
624
  # connections.
625
+ # @option options [ true | false ] :stay_ready For internal driver use
626
+ # only. Whether or not to mark the pool as closed.
570
627
  #
571
628
  # @return [ true ] Always true.
572
629
  #
@@ -592,9 +649,15 @@ module Mongo
592
649
  end
593
650
  end
594
651
 
595
- # mark pool as closed before releasing lock so
596
- # no connections can be created, checked in, or checked out
597
- @closed = true
652
+ unless options && options[:stay_ready]
653
+ # mark pool as closed before releasing lock so
654
+ # no connections can be created, checked in, or checked out
655
+ @closed = true
656
+ @ready = false
657
+ end
658
+
659
+ @max_connecting_cv.broadcast
660
+ @size_cv.broadcast
598
661
  end
599
662
 
600
663
  publish_cmap_event(
@@ -616,6 +679,9 @@ module Mongo
616
679
  if closed?
617
680
  "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
618
681
  "wait_timeout=#{wait_timeout} closed>"
682
+ elsif !ready?
683
+ "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
684
+ "wait_timeout=#{wait_timeout} paused>"
619
685
  else
620
686
  "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
621
687
  "wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>"
@@ -632,11 +698,13 @@ module Mongo
632
698
  # @return [ Object ] The result of the block.
633
699
  #
634
700
  # @since 2.0.0
635
- def with_connection(service_id: nil)
701
+ def with_connection(connection_global_id: nil)
636
702
  raise_if_closed!
637
703
 
638
- connection = check_out(service_id: service_id)
704
+ connection = check_out(connection_global_id: connection_global_id)
639
705
  yield(connection)
706
+ rescue Error::SocketError, Error::SocketTimeoutError, Error::ConnectionPerished => e
707
+ maybe_raise_pool_cleared!(connection, e)
640
708
  ensure
641
709
  if connection
642
710
  check_in(connection)
@@ -685,17 +753,17 @@ module Mongo
685
753
  # connections waiting to be connected, connections which have not yet
686
754
  # been moved to available_connections, or connections moved to available_connections
687
755
  # but not deleted from pending_connections. These should be cleaned up.
688
- until @pending_connections.empty?
689
- connection = @pending_connections.take(1).first
690
- connection.disconnect!
691
- @pending_connections.delete(connection)
692
- end
756
+ clear_pending_connections
693
757
  end
694
758
  end
695
759
 
696
- # Creates and adds a connection to the pool, if the pool's size is below
697
- # min_size. Retries once if a socket-related error is encountered during
698
- # this process and raises if a second error or a non socket-related error occurs.
760
+ # This method does three things:
761
+ # 1. Creates and adds a connection to the pool, if the pool's size is
762
+ # below min_size. Retries once if a socket-related error is
763
+ # encountered during this process and raises if a second error or a
764
+ # non socket-related error occurs.
765
+ # 2. Removes stale connections from the connection pool.
766
+ # 3. Interrupts connections marked for interruption.
699
767
  #
700
768
  # Used by the pool populator background thread.
701
769
  #
@@ -717,11 +785,6 @@ module Mongo
717
785
  end
718
786
 
719
787
  return create_and_add_connection
720
- rescue Error::AuthError, Error
721
- # wake up one thread waiting for connections, since one could not
722
- # be created here, and can instead be created in flow
723
- @available_semaphore.signal
724
- raise
725
788
  end
726
789
 
727
790
  # Finalize the connection pool for garbage collection.
@@ -751,13 +814,15 @@ module Mongo
751
814
 
752
815
  private
753
816
 
754
- # Returns the next available connection, optionally scoped to the
755
- # specified service. If no suitable connections are available,
817
+ # Returns the next available connection, optionally with given
818
+ # global id. If no suitable connections are available,
756
819
  # returns nil.
757
- def next_available_connection(service_id: nil)
758
- if service_id
820
+ def next_available_connection(connection_global_id)
821
+ raise_unless_locked!
822
+
823
+ if @server.load_balancer? && connection_global_id
759
824
  conn = @available_connections.detect do |conn|
760
- conn.service_id == service_id
825
+ conn.global_id == connection_global_id
761
826
  end
762
827
  if conn
763
828
  @available_connections.delete(conn)
@@ -769,18 +834,21 @@ module Mongo
769
834
  end
770
835
 
771
836
  def create_connection
837
+ r, _ = @generation_manager.pipe_fds(service_id: server.description.service_id)
772
838
  opts = options.merge(
773
839
  connection_pool: self,
840
+ pipe: r
774
841
  # Do not pass app metadata - this will be retrieved by the connection
775
842
  # based on the auth needs.
776
843
  )
777
844
  unless @server.load_balancer?
778
845
  opts[:generation] = generation
779
846
  end
780
- connection = Connection.new(@server, opts)
847
+ Connection.new(@server, opts)
781
848
  end
782
849
 
783
- # Create a connection, connect it, and add it to the pool.
850
+ # Create a connection, connect it, and add it to the pool. Also
851
+ # check for stale and interruptable connections and deal with them.
784
852
  #
785
853
  # @return [ true | false ] True if a connection was created and
786
854
  # added to the pool, false otherwise
@@ -789,10 +857,15 @@ module Mongo
789
857
  connection = nil
790
858
 
791
859
  @lock.synchronize do
792
- if !closed? && unsynchronized_size < min_size
860
+ if !closed? && @ready &&
861
+ (unsynchronized_size + @connection_requests) < min_size &&
862
+ @pending_connections.length < @max_connecting
863
+ then
793
864
  connection = create_connection
794
865
  @pending_connections << connection
795
866
  else
867
+ return true if remove_interrupted_connections
868
+ return true if remove_stale_connection
796
869
  return false
797
870
  end
798
871
  end
@@ -802,6 +875,8 @@ module Mongo
802
875
  rescue Exception
803
876
  @lock.synchronize do
804
877
  @pending_connections.delete(connection)
878
+ @max_connecting_cv.signal
879
+ @size_cv.signal
805
880
  end
806
881
  raise
807
882
  end
@@ -809,14 +884,65 @@ module Mongo
809
884
  @lock.synchronize do
810
885
  @available_connections << connection
811
886
  @pending_connections.delete(connection)
887
+ @max_connecting_cv.signal
888
+ @size_cv.signal
889
+ end
890
+
891
+ true
892
+ end
893
+
894
+ # Removes and disconnects all stale available connections.
895
+ def remove_stale_connection
896
+ if conn = @available_connections.detect(&method(:connection_stale_unlocked?))
897
+ conn.disconnect!(reason: :stale)
898
+ @available_connections.delete(conn)
899
+ return true
900
+ end
901
+ end
812
902
 
813
- # wake up one thread waiting for connections, since one was created
814
- @available_semaphore.signal
903
+ # Interrupt connections scheduled for interruption.
904
+ def remove_interrupted_connections
905
+ return false if @interrupt_connections.empty?
906
+
907
+ gens = Set.new
908
+ while conn = @interrupt_connections.pop
909
+ if @checked_out_connections.include?(conn)
910
+ # If the connection has been checked out, mark it as interrupted and it will
911
+ # be disconnected on check in.
912
+ conn.interrupted!
913
+ do_check_in(conn)
914
+ elsif @pending_connections.include?(conn)
915
+ # If the connection is pending, disconnect with the interrupted flag.
916
+ conn.disconnect!(reason: :stale, interrupted: true)
917
+ @pending_connections.delete(conn)
918
+ end
919
+ gens << [ conn.generation, conn.service_id ]
920
+ end
921
+
922
+ # Close the write side of the pipe. Pending connections might be
923
+ # hanging on the Kernel#select call, so in order to interrupt that,
924
+ # we also listen for the read side of the pipe in Kernel#select and
925
+ # close the write side of the pipe here, which will cause select to
926
+ # wake up and raise an IOError now that the socket is closed.
927
+ # The read side of the pipe will be scheduled for closing on the next
928
+ # generation bump.
929
+ gens.each do |gen, service_id|
930
+ @generation_manager.remove_pipe_fds(gen, service_id: service_id)
815
931
  end
816
932
 
817
933
  true
818
934
  end
819
935
 
936
+ # Checks whether a connection is stale.
937
+ #
938
+ # @param [ Mongo::Server::Connection ] connection The connection to check.
939
+ #
940
+ # @return [ true | false ] Whether the connection is stale.
941
+ def connection_stale_unlocked?(connection)
942
+ connection.generation != generation_unlocked(service_id: connection.service_id) &&
943
+ !connection.pinned?
944
+ end
945
+
820
946
  # Asserts that the pool has not been closed.
821
947
  #
822
948
  # @raise [ Error::PoolClosedError ] If the pool has been closed.
@@ -828,6 +954,25 @@ module Mongo
828
954
  end
829
955
  end
830
956
 
957
+ # If the connection was interrupted, raise a pool cleared error. If it
958
+ # wasn't interrupted raise the original error.
959
+ #
960
+ # @param [ Connection ] The connection.
961
+ # @param [ Mongo::Error ] The original error.
962
+ #
963
+ # @raise [ Mongo::Error | Mongo::Error::PoolClearedError ] A PoolClearedError
964
+ # if the connection was interrupted, the original error if not.
965
+ def maybe_raise_pool_cleared!(connection, e)
966
+ if connection&.interrupted?
967
+ err = Error::PoolClearedError.new(connection.server.address, connection.server.pool_internal).tap do |err|
968
+ e.labels.each { |l| err.add_label(l) }
969
+ end
970
+ raise err
971
+ else
972
+ raise e
973
+ end
974
+ end
975
+
831
976
  # Attempts to connect (handshake and auth) the connection. If an error is
832
977
  # encountered, closes the connection and raises the error.
833
978
  def connect_connection(connection)
@@ -867,6 +1012,350 @@ module Mongo
867
1012
  end
868
1013
  end
869
1014
  end
1015
+
1016
+ # Close the available connections.
1017
+ #
1018
+ # @param [ Array<Connection> ] connections A list of connections.
1019
+ # @param [ Object ] service_id The service id.
1020
+ def close_available_connections(service_id)
1021
+ if @server.load_balancer? && service_id
1022
+ loop do
1023
+ conn = @available_connections.detect do |conn|
1024
+ conn.service_id == service_id &&
1025
+ conn.generation < @generation_manager.generation(service_id: service_id)
1026
+ end
1027
+ if conn
1028
+ @available_connections.delete(conn)
1029
+ conn.disconnect!(reason: :stale, interrupted: true)
1030
+ @populate_semaphore.signal
1031
+ else
1032
+ break
1033
+ end
1034
+ end
1035
+ else
1036
+ @available_connections.delete_if do |conn|
1037
+ if conn.generation < @generation_manager.generation(service_id: service_id)
1038
+ conn.disconnect!(reason: :stale, interrupted: true)
1039
+ @populate_semaphore.signal
1040
+ true
1041
+ end
1042
+ end
1043
+ end
1044
+ end
1045
+
1046
+ # Schedule connections of previous generations for interruption.
1047
+ #
1048
+ # @param [ Array<Connection> ] connections A list of connections.
1049
+ # @param [ Object ] service_id The service id.
1050
+ def schedule_for_interruption(connections, service_id)
1051
+ @interrupt_connections += connections.select do |conn|
1052
+ (!server.load_balancer? || conn.service_id == service_id) &&
1053
+ conn.generation < @generation_manager.generation(service_id: service_id)
1054
+ end
1055
+ end
1056
+
1057
+ # Clear and disconnect the pending connections.
1058
+ def clear_pending_connections
1059
+ until @pending_connections.empty?
1060
+ connection = @pending_connections.take(1).first
1061
+ connection.disconnect!
1062
+ @pending_connections.delete(connection)
1063
+ end
1064
+ end
1065
+
1066
+ # The lock should be acquired when calling this method.
1067
+ def raise_check_out_timeout!(connection_global_id)
1068
+ raise_unless_locked!
1069
+
1070
+ publish_cmap_event(
1071
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
1072
+ @server.address,
1073
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
1074
+ ),
1075
+ )
1076
+
1077
+ connection_global_id_msg = if connection_global_id
1078
+ " for connection #{connection_global_id}"
1079
+ else
1080
+ ''
1081
+ end
1082
+
1083
+ msg = "Timed out attempting to check out a connection " +
1084
+ "from pool for #{@server.address}#{connection_global_id_msg} after #{wait_timeout} sec. " +
1085
+ "Connections in pool: #{@available_connections.length} available, " +
1086
+ "#{@checked_out_connections.length} checked out, " +
1087
+ "#{@pending_connections.length} pending, " +
1088
+ "#{@connection_requests} connections requests " +
1089
+ "(max size: #{max_size})"
1090
+ raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
1091
+ end
1092
+
1093
+ def raise_check_out_timeout_locked!(connection_global_id)
1094
+ @lock.synchronize do
1095
+ raise_check_out_timeout!(connection_global_id)
1096
+ end
1097
+ end
1098
+
1099
+ def raise_if_pool_closed!
1100
+ if closed?
1101
+ publish_cmap_event(
1102
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
1103
+ @server.address,
1104
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
1105
+ ),
1106
+ )
1107
+ raise Error::PoolClosedError.new(@server.address, self)
1108
+ end
1109
+ end
1110
+
1111
+ def raise_if_pool_paused!
1112
+ raise_unless_locked!
1113
+
1114
+ if !@ready
1115
+ publish_cmap_event(
1116
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
1117
+ @server.address,
1118
+ # CMAP spec decided to conflate pool paused with all the other
1119
+ # possible non-timeout errors.
1120
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR,
1121
+ ),
1122
+ )
1123
+ raise Error::PoolPausedError.new(@server.address, self)
1124
+ end
1125
+ end
1126
+
1127
+ def raise_if_pool_paused_locked!
1128
+ @lock.synchronize do
1129
+ raise_if_pool_paused!
1130
+ end
1131
+ end
1132
+
1133
+ # The lock should be acquired when calling this method.
1134
+ def raise_if_not_ready!
1135
+ raise_unless_locked!
1136
+ raise_if_pool_closed!
1137
+ raise_if_pool_paused!
1138
+ end
1139
+
1140
+ def raise_unless_locked!
1141
+ unless @lock.owned?
1142
+ raise ArgumentError, "the lock must be owned when calling this method"
1143
+ end
1144
+ end
1145
+
1146
+ def valid_available_connection?(connection, pid, connection_global_id)
1147
+ if connection.pid != pid
1148
+ log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
1149
+ connection.disconnect!(reason: :stale)
1150
+ @populate_semaphore.signal
1151
+ return false
1152
+ end
1153
+
1154
+ if !connection.pinned?
1155
+ # If connection is marked as pinned, it is used by a transaction
1156
+ # or a series of cursor operations in a load balanced setup.
1157
+ # In this case connection should not be disconnected until
1158
+ # unpinned.
1159
+ if connection.generation != generation(
1160
+ service_id: connection.service_id
1161
+ )
1162
+ # Stale connections should be disconnected in the clear
1163
+ # method, but if any don't, check again here
1164
+ connection.disconnect!(reason: :stale)
1165
+ @populate_semaphore.signal
1166
+ return false
1167
+ end
1168
+
1169
+ if max_idle_time && connection.last_checkin &&
1170
+ Time.now - connection.last_checkin > max_idle_time
1171
+ then
1172
+ connection.disconnect!(reason: :idle)
1173
+ @populate_semaphore.signal
1174
+ return false
1175
+ end
1176
+ end
1177
+ true
1178
+ end
1179
+
1180
+ # Retrieves a connection if one is available, otherwise we create a new
1181
+ # one. If no connection exists and the pool is at max size, wait until
1182
+ # a connection is checked back into the pool.
1183
+ #
1184
+ # @param [ Integer ] pid The current process id.
1185
+ # @param [ Integer ] connection_global_id The global id for the
1186
+ # connection to check out.
1187
+ #
1188
+ # @return [ Mongo::Server::Connection ] The checked out connection.
1189
+ #
1190
+ # @raise [ Error::PoolClosedError ] If the pool has been closed.
1191
+ # @raise [ Timeout::Error ] If the connection pool is at maximum size
1192
+ # and remains so for longer than the wait timeout.
1193
+ def get_connection(pid, connection_global_id)
1194
+ if connection = next_available_connection(connection_global_id)
1195
+ unless valid_available_connection?(connection, pid, connection_global_id)
1196
+ return nil
1197
+ end
1198
+
1199
+ # We've got a connection, so we decrement the number of connection
1200
+ # requests.
1201
+ # We do not need to signal condition variable here, because
1202
+ # because the execution will continue, and we signal later.
1203
+ @connection_requests -= 1
1204
+
1205
+ # If the connection is connected, it's not considered a
1206
+ # "pending connection". The pending_connections list represents
1207
+ # the set of connections that are awaiting connection.
1208
+ unless connection.connected?
1209
+ @pending_connections << connection
1210
+ end
1211
+ return connection
1212
+ elsif connection_global_id && @server.load_balancer?
1213
+ # A particular connection is requested, but it is not available.
1214
+ # If it is nether available not checked out, we should stop here.
1215
+ @checked_out_connections.detect do |conn|
1216
+ conn.global_id == connection_global_id
1217
+ end.tap do |conn|
1218
+ if conn.nil?
1219
+ publish_cmap_event(
1220
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
1221
+ @server.address,
1222
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
1223
+ ),
1224
+ )
1225
+ # We're going to raise, so we need to decrement the number of
1226
+ # connection requests.
1227
+ decrement_connection_requests_and_signal
1228
+ raise Error::MissingConnection.new
1229
+ end
1230
+ end
1231
+ # We need a particular connection, and if it is not available
1232
+ # we can wait for an in-progress operation to return
1233
+ # such a connection to the pool.
1234
+ nil
1235
+ else
1236
+ connection = create_connection
1237
+ @connection_requests -= 1
1238
+ @pending_connections << connection
1239
+ return connection
1240
+ end
1241
+ end
1242
+
1243
+ # Retrieves a connection and connects it.
1244
+ #
1245
+ # @param [ Integer ] connection_global_id The global id for the
1246
+ # connection to check out.
1247
+ #
1248
+ # @return [ Mongo::Server::Connection ] The checked out connection.
1249
+ #
1250
+ # @raise [ Error::PoolClosedError ] If the pool has been closed.
1251
+ # @raise [ Timeout::Error ] If the connection pool is at maximum size
1252
+ # and remains so for longer than the wait timeout.
1253
+ def retrieve_and_connect_connection(connection_global_id)
1254
+ deadline = Utils.monotonic_time + wait_timeout
1255
+ connection = nil
1256
+
1257
+ @lock.synchronize do
1258
+ # The first gate to checking out a connection. Make sure the number of
1259
+ # unavailable connections is less than the max pool size.
1260
+ until max_size == 0 || unavailable_connections < max_size
1261
+ wait = deadline - Utils.monotonic_time
1262
+ raise_check_out_timeout!(connection_global_id) if wait <= 0
1263
+ @size_cv.wait(wait)
1264
+ raise_if_not_ready!
1265
+ end
1266
+ @connection_requests += 1
1267
+ connection = wait_for_connection(connection_global_id, deadline)
1268
+ end
1269
+
1270
+ connect_or_raise(connection) unless connection.connected?
1271
+
1272
+ @lock.synchronize do
1273
+ @checked_out_connections << connection
1274
+ if @pending_connections.include?(connection)
1275
+ @pending_connections.delete(connection)
1276
+ end
1277
+ @max_connecting_cv.signal
1278
+ # no need to signal size_cv here since the number of unavailable
1279
+ # connections is unchanged.
1280
+ end
1281
+
1282
+ connection
1283
+ end
1284
+
1285
+ # Waits for a connection to become available, or raises is no connection
1286
+ # becomes available before the timeout.
1287
+ # @param [ Integer ] connection_global_id The global id for the
1288
+ # connection to check out.
1289
+ # @param [ Float ] deadline The time at which to stop waiting.
1290
+ #
1291
+ # @return [ Mongo::Server::Connection ] The checked out connection.
1292
+ def wait_for_connection(connection_global_id, deadline)
1293
+ connection = nil
1294
+ while connection.nil?
1295
+ # The second gate to checking out a connection. Make sure 1) there
1296
+ # exists an available connection and 2) we are under max_connecting.
1297
+ until @available_connections.any? || @pending_connections.length < @max_connecting
1298
+ wait = deadline - Utils.monotonic_time
1299
+ if wait <= 0
1300
+ # We are going to raise a timeout error, so the connection
1301
+ # request is not going to be fulfilled. Decrement the counter
1302
+ # here.
1303
+ decrement_connection_requests_and_signal
1304
+ raise_check_out_timeout!(connection_global_id)
1305
+ end
1306
+ @max_connecting_cv.wait(wait)
1307
+ # We do not need to decrement the connection_requests counter
1308
+ # or signal here because the pool is not ready yet.
1309
+ raise_if_not_ready!
1310
+ end
1311
+
1312
+ connection = get_connection(Process.pid, connection_global_id)
1313
+ wait = deadline - Utils.monotonic_time
1314
+ if connection.nil? && wait <= 0
1315
+ # connection is nil here, it means that get_connection method
1316
+ # did not create a new connection; therefore, it did not decrease
1317
+ # the connection_requests counter. We need to do it here.
1318
+ decrement_connection_requests_and_signal
1319
+ raise_check_out_timeout!(connection_global_id)
1320
+ end
1321
+ end
1322
+
1323
+ connection
1324
+ end
1325
+
1326
+ # Connects a connection and raises an exception if the connection
1327
+ # cannot be connected.
1328
+ # This method also publish corresponding event and ensures that counters
1329
+ # and condition variables are updated.
1330
+ def connect_or_raise(connection)
1331
+ connect_connection(connection)
1332
+ rescue Exception
1333
+ # Handshake or authentication failed
1334
+ @lock.synchronize do
1335
+ if @pending_connections.include?(connection)
1336
+ @pending_connections.delete(connection)
1337
+ end
1338
+ @max_connecting_cv.signal
1339
+ @size_cv.signal
1340
+ end
1341
+ @populate_semaphore.signal
1342
+ publish_cmap_event(
1343
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
1344
+ @server.address,
1345
+ Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
1346
+ ),
1347
+ )
1348
+ raise
1349
+ end
1350
+
1351
+
1352
+ # Decrement connection requests counter and signal the condition
1353
+ # variables that the number of unavailable connections has decreased.
1354
+ def decrement_connection_requests_and_signal
1355
+ @connection_requests -= 1
1356
+ @max_connecting_cv.signal
1357
+ @size_cv.signal
1358
+ end
870
1359
  end
871
1360
  end
872
1361
  end