mongo 2.18.3 → 2.19.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 (1123) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +13 -3
  4. data/Rakefile +4 -3
  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/auth/aws/credentials.rb +38 -0
  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 -2
  17. data/lib/mongo/auth/aws.rb +6 -6
  18. data/lib/mongo/auth/base.rb +1 -1
  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 +1 -1
  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 +1 -1
  49. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  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 +1 -1
  54. data/lib/mongo/caching_cursor.rb +1 -1
  55. data/lib/mongo/client.rb +27 -4
  56. data/lib/mongo/client_encryption.rb +102 -1
  57. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +2 -6
  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 +1 -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 +29 -12
  71. data/lib/mongo/cluster_time.rb +1 -1
  72. data/lib/mongo/collection/helpers.rb +1 -1
  73. data/lib/mongo/collection/queryable_encryption.rb +83 -43
  74. data/lib/mongo/collection/view/aggregation.rb +1 -1
  75. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  76. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  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 +3 -3
  80. data/lib/mongo/collection/view/explainable.rb +1 -1
  81. data/lib/mongo/collection/view/immutable.rb +1 -1
  82. data/lib/mongo/collection/view/iterable.rb +1 -16
  83. data/lib/mongo/collection/view/map_reduce.rb +1 -1
  84. data/lib/mongo/collection/view/readable.rb +11 -12
  85. data/lib/mongo/collection/view/writable.rb +1 -1
  86. data/lib/mongo/collection/view.rb +1 -2
  87. data/lib/mongo/collection.rb +26 -11
  88. data/lib/mongo/condition_variable.rb +58 -0
  89. data/lib/mongo/config/options.rb +1 -0
  90. data/lib/mongo/config/validators/option.rb +1 -0
  91. data/lib/mongo/config.rb +1 -0
  92. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  93. data/lib/mongo/crypt/auto_encrypter.rb +4 -3
  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 +224 -30
  97. data/lib/mongo/crypt/context.rb +67 -4
  98. data/lib/mongo/crypt/data_key_context.rb +1 -1
  99. data/lib/mongo/crypt/encryption_io.rb +2 -2
  100. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  101. data/lib/mongo/crypt/explicit_encrypter.rb +119 -34
  102. data/lib/mongo/crypt/explicit_encryption_context.rb +58 -27
  103. data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
  104. data/lib/mongo/crypt/handle.rb +10 -2
  105. data/lib/mongo/crypt/hooks.rb +1 -1
  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 +3 -119
  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 +5 -128
  114. data/lib/mongo/crypt/kms/credentials.rb +17 -2
  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 +4 -172
  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 +3 -100
  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 +3 -66
  125. data/lib/mongo/crypt/kms/master_key_document.rb +1 -1
  126. data/lib/mongo/crypt/kms.rb +7 -1
  127. data/lib/mongo/crypt/kms_context.rb +1 -1
  128. data/lib/mongo/crypt/rewrap_many_data_key_context.rb +1 -1
  129. data/lib/mongo/crypt/rewrap_many_data_key_result.rb +1 -1
  130. data/lib/mongo/crypt/status.rb +1 -1
  131. data/lib/mongo/crypt.rb +2 -1
  132. data/lib/mongo/cursor/kill_spec.rb +1 -1
  133. data/lib/mongo/cursor.rb +40 -6
  134. data/lib/mongo/database/view.rb +41 -4
  135. data/lib/mongo/database.rb +2 -2
  136. data/lib/mongo/dbref.rb +1 -1
  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 +1 -1
  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 +1 -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_min_pool_size.rb +1 -1
  167. data/lib/mongo/error/invalid_nonce.rb +1 -1
  168. data/lib/mongo/error/invalid_read_concern.rb +1 -1
  169. data/lib/mongo/error/invalid_read_option.rb +1 -1
  170. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  171. data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
  172. data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
  173. data/lib/mongo/error/invalid_server_preference.rb +1 -1
  174. data/lib/mongo/error/invalid_session.rb +1 -1
  175. data/lib/mongo/error/invalid_signature.rb +1 -1
  176. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  177. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  178. data/lib/mongo/error/invalid_update_document.rb +1 -1
  179. data/lib/mongo/error/invalid_uri.rb +1 -1
  180. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  181. data/lib/mongo/error/kms_error.rb +1 -1
  182. data/lib/mongo/error/labelable.rb +1 -1
  183. data/lib/mongo/error/lint_error.rb +1 -1
  184. data/lib/mongo/error/max_bson_size.rb +1 -1
  185. data/lib/mongo/error/max_message_size.rb +1 -1
  186. data/lib/mongo/error/mismatched_domain.rb +1 -1
  187. data/lib/mongo/error/missing_connection.rb +4 -2
  188. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  189. data/lib/mongo/error/missing_password.rb +1 -1
  190. data/lib/mongo/error/missing_resume_token.rb +1 -1
  191. data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
  192. data/lib/mongo/error/missing_service_id.rb +1 -1
  193. data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
  194. data/lib/mongo/error/multi_index_drop.rb +1 -1
  195. data/lib/mongo/error/need_primary_server.rb +1 -1
  196. data/lib/mongo/error/no_server_available.rb +1 -1
  197. data/lib/mongo/error/no_service_connection_available.rb +1 -1
  198. data/lib/mongo/error/no_srv_records.rb +1 -1
  199. data/lib/mongo/error/notable.rb +8 -1
  200. data/lib/mongo/error/operation_failure.rb +1 -1
  201. data/lib/mongo/error/parser.rb +1 -1
  202. data/lib/mongo/error/pool_cleared_error.rb +40 -0
  203. data/lib/mongo/error/pool_closed_error.rb +4 -17
  204. data/lib/mongo/error/pool_error.rb +45 -0
  205. data/lib/mongo/error/pool_paused_error.rb +40 -0
  206. data/lib/mongo/error/raise_original_error.rb +1 -1
  207. data/lib/mongo/error/read_write_retryable.rb +1 -1
  208. data/lib/mongo/error/sdam_error_detection.rb +1 -1
  209. data/lib/mongo/error/server_api_conflict.rb +1 -1
  210. data/lib/mongo/error/server_api_not_supported.rb +1 -1
  211. data/lib/mongo/error/server_certificate_revoked.rb +1 -1
  212. data/lib/mongo/error/server_not_usable.rb +36 -0
  213. data/lib/mongo/error/session_ended.rb +1 -1
  214. data/lib/mongo/error/session_not_materialized.rb +1 -1
  215. data/lib/mongo/error/sessions_not_supported.rb +1 -1
  216. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
  217. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
  218. data/lib/mongo/error/socket_error.rb +1 -1
  219. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  220. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  221. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  222. data/lib/mongo/error/unexpected_response.rb +1 -1
  223. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  224. data/lib/mongo/error/unmet_dependency.rb +1 -1
  225. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  226. data/lib/mongo/error/unsupported_collation.rb +1 -1
  227. data/lib/mongo/error/unsupported_features.rb +1 -1
  228. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  229. data/lib/mongo/error/unsupported_option.rb +1 -1
  230. data/lib/mongo/error/write_retryable.rb +1 -1
  231. data/lib/mongo/error.rb +7 -1
  232. data/lib/mongo/event/base.rb +1 -1
  233. data/lib/mongo/event/listeners.rb +1 -1
  234. data/lib/mongo/event/publisher.rb +1 -1
  235. data/lib/mongo/event/subscriber.rb +1 -1
  236. data/lib/mongo/event.rb +1 -1
  237. data/lib/mongo/grid/file/chunk.rb +1 -1
  238. data/lib/mongo/grid/file/info.rb +1 -1
  239. data/lib/mongo/grid/file.rb +1 -1
  240. data/lib/mongo/grid/fs_bucket.rb +1 -1
  241. data/lib/mongo/grid/stream/read.rb +1 -1
  242. data/lib/mongo/grid/stream/write.rb +1 -1
  243. data/lib/mongo/grid/stream.rb +1 -1
  244. data/lib/mongo/grid.rb +1 -1
  245. data/lib/mongo/id.rb +1 -1
  246. data/lib/mongo/index/view.rb +1 -1
  247. data/lib/mongo/index.rb +1 -1
  248. data/lib/mongo/lint.rb +1 -1
  249. data/lib/mongo/loggable.rb +3 -3
  250. data/lib/mongo/logger.rb +1 -1
  251. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  252. data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
  253. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  254. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  255. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  256. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  257. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  258. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  259. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  260. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  261. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
  262. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  263. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  264. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  265. data/lib/mongo/monitoring/event/cmap.rb +2 -1
  266. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  267. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  268. data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
  269. data/lib/mongo/monitoring/event/secure.rb +1 -1
  270. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  271. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  272. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  273. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  274. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  275. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  276. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  277. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  278. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  279. data/lib/mongo/monitoring/event.rb +1 -1
  280. data/lib/mongo/monitoring/publishable.rb +1 -1
  281. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  282. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  283. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  284. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  285. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  286. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  287. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  288. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  289. data/lib/mongo/monitoring.rb +1 -1
  290. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  291. data/lib/mongo/operation/aggregate/result.rb +1 -1
  292. data/lib/mongo/operation/aggregate.rb +1 -1
  293. data/lib/mongo/operation/collections_info/result.rb +1 -1
  294. data/lib/mongo/operation/collections_info.rb +1 -1
  295. data/lib/mongo/operation/command/op_msg.rb +1 -1
  296. data/lib/mongo/operation/command.rb +1 -1
  297. data/lib/mongo/operation/context.rb +1 -1
  298. data/lib/mongo/operation/count/op_msg.rb +1 -1
  299. data/lib/mongo/operation/count.rb +1 -1
  300. data/lib/mongo/operation/create/op_msg.rb +1 -1
  301. data/lib/mongo/operation/create.rb +1 -1
  302. data/lib/mongo/operation/create_index/op_msg.rb +1 -1
  303. data/lib/mongo/operation/create_index.rb +1 -1
  304. data/lib/mongo/operation/create_user/op_msg.rb +1 -1
  305. data/lib/mongo/operation/create_user.rb +1 -1
  306. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  307. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  308. data/lib/mongo/operation/delete/result.rb +1 -1
  309. data/lib/mongo/operation/delete.rb +1 -1
  310. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  311. data/lib/mongo/operation/distinct.rb +1 -1
  312. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  313. data/lib/mongo/operation/drop.rb +1 -1
  314. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  315. data/lib/mongo/operation/drop_database.rb +1 -1
  316. data/lib/mongo/operation/drop_index/op_msg.rb +1 -1
  317. data/lib/mongo/operation/drop_index.rb +1 -1
  318. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  319. data/lib/mongo/operation/explain/result.rb +1 -1
  320. data/lib/mongo/operation/explain.rb +1 -1
  321. data/lib/mongo/operation/find/builder/command.rb +1 -1
  322. data/lib/mongo/operation/find/builder/flags.rb +1 -1
  323. data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
  324. data/lib/mongo/operation/find/builder.rb +1 -1
  325. data/lib/mongo/operation/find/op_msg.rb +1 -1
  326. data/lib/mongo/operation/find/result.rb +1 -1
  327. data/lib/mongo/operation/find.rb +1 -1
  328. data/lib/mongo/operation/get_more/command_builder.rb +1 -1
  329. data/lib/mongo/operation/get_more/op_msg.rb +1 -1
  330. data/lib/mongo/operation/get_more/result.rb +1 -1
  331. data/lib/mongo/operation/get_more.rb +1 -1
  332. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  333. data/lib/mongo/operation/indexes/result.rb +1 -1
  334. data/lib/mongo/operation/indexes.rb +1 -1
  335. data/lib/mongo/operation/insert/bulk_result.rb +1 -1
  336. data/lib/mongo/operation/insert/op_msg.rb +1 -1
  337. data/lib/mongo/operation/insert/result.rb +1 -1
  338. data/lib/mongo/operation/insert.rb +1 -1
  339. data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
  340. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  341. data/lib/mongo/operation/kill_cursors.rb +1 -1
  342. data/lib/mongo/operation/list_collections/op_msg.rb +1 -1
  343. data/lib/mongo/operation/list_collections/result.rb +1 -1
  344. data/lib/mongo/operation/list_collections.rb +1 -1
  345. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  346. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  347. data/lib/mongo/operation/map_reduce.rb +1 -1
  348. data/lib/mongo/operation/op_msg_base.rb +1 -1
  349. data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
  350. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  351. data/lib/mongo/operation/parallel_scan.rb +1 -1
  352. data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
  353. data/lib/mongo/operation/remove_user.rb +1 -1
  354. data/lib/mongo/operation/result.rb +1 -1
  355. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
  356. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
  357. data/lib/mongo/operation/shared/executable.rb +1 -1
  358. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
  359. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  360. data/lib/mongo/operation/shared/idable.rb +1 -1
  361. data/lib/mongo/operation/shared/limited.rb +1 -1
  362. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  363. data/lib/mongo/operation/shared/op_msg_executable.rb +1 -1
  364. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  365. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  366. data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
  367. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  368. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  369. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  370. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  371. data/lib/mongo/operation/shared/specifiable.rb +1 -1
  372. data/lib/mongo/operation/shared/validatable.rb +1 -1
  373. data/lib/mongo/operation/shared/write.rb +1 -1
  374. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  375. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  376. data/lib/mongo/operation/update/op_msg.rb +1 -1
  377. data/lib/mongo/operation/update/result.rb +1 -1
  378. data/lib/mongo/operation/update.rb +1 -1
  379. data/lib/mongo/operation/update_user/op_msg.rb +1 -1
  380. data/lib/mongo/operation/update_user.rb +1 -1
  381. data/lib/mongo/operation/users_info/op_msg.rb +1 -1
  382. data/lib/mongo/operation/users_info/result.rb +1 -1
  383. data/lib/mongo/operation/users_info.rb +1 -1
  384. data/lib/mongo/operation/write_command/op_msg.rb +1 -1
  385. data/lib/mongo/operation/write_command.rb +1 -1
  386. data/lib/mongo/operation.rb +1 -1
  387. data/lib/mongo/options/mapper.rb +1 -1
  388. data/lib/mongo/options/redacted.rb +1 -1
  389. data/lib/mongo/options.rb +1 -1
  390. data/lib/mongo/protocol/bit_vector.rb +1 -1
  391. data/lib/mongo/protocol/caching_hash.rb +1 -1
  392. data/lib/mongo/protocol/compressed.rb +1 -1
  393. data/lib/mongo/protocol/get_more.rb +1 -1
  394. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  395. data/lib/mongo/protocol/message.rb +1 -1
  396. data/lib/mongo/protocol/msg.rb +1 -1
  397. data/lib/mongo/protocol/query.rb +1 -1
  398. data/lib/mongo/protocol/registry.rb +1 -1
  399. data/lib/mongo/protocol/reply.rb +1 -1
  400. data/lib/mongo/protocol/serializers.rb +1 -1
  401. data/lib/mongo/protocol.rb +1 -1
  402. data/lib/mongo/query_cache.rb +1 -1
  403. data/lib/mongo/retryable/base_worker.rb +91 -0
  404. data/lib/mongo/retryable/read_worker.rb +296 -0
  405. data/lib/mongo/retryable/write_worker.rb +364 -0
  406. data/lib/mongo/retryable.rb +31 -502
  407. data/lib/mongo/semaphore.rb +2 -2
  408. data/lib/mongo/server/app_metadata/environment.rb +5 -1
  409. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  410. data/lib/mongo/server/app_metadata.rb +49 -69
  411. data/lib/mongo/server/connection.rb +61 -20
  412. data/lib/mongo/server/connection_base.rb +1 -1
  413. data/lib/mongo/server/connection_common.rb +1 -1
  414. data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
  415. data/lib/mongo/server/connection_pool/populator.rb +33 -31
  416. data/lib/mongo/server/connection_pool.rb +670 -263
  417. data/lib/mongo/server/description/features.rb +2 -2
  418. data/lib/mongo/server/description/load_balancer.rb +1 -1
  419. data/lib/mongo/server/description.rb +7 -6
  420. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  421. data/lib/mongo/server/monitor/connection.rb +1 -1
  422. data/lib/mongo/server/monitor.rb +11 -7
  423. data/lib/mongo/server/pending_connection.rb +1 -1
  424. data/lib/mongo/server/push_monitor/connection.rb +1 -1
  425. data/lib/mongo/server/push_monitor.rb +1 -1
  426. data/lib/mongo/server/round_trip_time_averager.rb +1 -1
  427. data/lib/mongo/server.rb +96 -30
  428. data/lib/mongo/server_selector/base.rb +24 -3
  429. data/lib/mongo/server_selector/nearest.rb +1 -1
  430. data/lib/mongo/server_selector/primary.rb +1 -1
  431. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  432. data/lib/mongo/server_selector/secondary.rb +1 -1
  433. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  434. data/lib/mongo/server_selector.rb +1 -1
  435. data/lib/mongo/session/server_session.rb +1 -1
  436. data/lib/mongo/session/session_pool.rb +1 -1
  437. data/lib/mongo/session.rb +1 -1
  438. data/lib/mongo/socket/ocsp_cache.rb +1 -1
  439. data/lib/mongo/socket/ocsp_verifier.rb +1 -1
  440. data/lib/mongo/socket/ssl.rb +1 -1
  441. data/lib/mongo/socket/tcp.rb +1 -1
  442. data/lib/mongo/socket/unix.rb +1 -1
  443. data/lib/mongo/socket.rb +29 -2
  444. data/lib/mongo/srv/monitor.rb +1 -3
  445. data/lib/mongo/srv/resolver.rb +1 -1
  446. data/lib/mongo/srv/result.rb +1 -1
  447. data/lib/mongo/srv.rb +1 -1
  448. data/lib/mongo/timeout.rb +2 -2
  449. data/lib/mongo/topology_version.rb +1 -1
  450. data/lib/mongo/uri/options_mapper.rb +321 -81
  451. data/lib/mongo/uri/srv_protocol.rb +1 -1
  452. data/lib/mongo/uri.rb +41 -13
  453. data/lib/mongo/utils.rb +1 -1
  454. data/lib/mongo/version.rb +2 -2
  455. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  456. data/lib/mongo/write_concern/base.rb +1 -1
  457. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  458. data/lib/mongo/write_concern.rb +1 -1
  459. data/lib/mongo.rb +2 -1
  460. data/mongo.gemspec +5 -2
  461. data/spec/atlas/atlas_connectivity_spec.rb +1 -1
  462. data/spec/atlas/operations_spec.rb +3 -8
  463. data/spec/integration/auth_spec.rb +1 -1
  464. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  465. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  466. data/spec/integration/aws_auth_request_spec.rb +2 -2
  467. data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
  468. data/spec/integration/aws_lambda_examples_spec.rb +1 -1
  469. data/spec/integration/bson_symbol_spec.rb +1 -1
  470. data/spec/integration/bulk_insert_spec.rb +1 -1
  471. data/spec/integration/bulk_write_error_message_spec.rb +1 -0
  472. data/spec/integration/bulk_write_spec.rb +1 -1
  473. data/spec/integration/change_stream_examples_spec.rb +1 -1
  474. data/spec/integration/change_stream_spec.rb +6 -1
  475. data/spec/integration/check_clean_slate_spec.rb +1 -1
  476. data/spec/integration/client_authentication_options_spec.rb +1 -1
  477. data/spec/integration/client_connectivity_spec.rb +1 -1
  478. data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
  479. data/spec/integration/client_construction_spec.rb +23 -1
  480. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  481. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  482. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +1 -1
  483. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
  484. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +10 -5
  485. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +38 -2
  486. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  487. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  488. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +1 -1
  489. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  490. data/spec/integration/client_side_encryption/corpus_spec.rb +1 -1
  491. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -3
  492. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  493. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +59 -58
  494. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +1 -1
  495. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +36 -33
  496. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +1 -1
  497. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +3 -3
  498. data/spec/integration/client_side_encryption/kms_tls_spec.rb +1 -1
  499. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  500. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  501. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  502. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  503. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +14 -11
  504. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
  505. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  506. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +20 -16
  507. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  508. data/spec/integration/client_spec.rb +8 -3
  509. data/spec/integration/client_update_spec.rb +7 -3
  510. data/spec/integration/collection_indexes_prose_spec.rb +1 -1
  511. data/spec/integration/command_monitoring_spec.rb +1 -1
  512. data/spec/integration/command_spec.rb +1 -1
  513. data/spec/integration/connect_single_rs_name_spec.rb +1 -1
  514. data/spec/integration/connection/faas_env_spec.rb +0 -1
  515. data/spec/integration/connection_pool_populator_spec.rb +27 -7
  516. data/spec/integration/connection_spec.rb +1 -1
  517. data/spec/integration/crud_spec.rb +1 -1
  518. data/spec/integration/cursor_pinning_spec.rb +6 -2
  519. data/spec/integration/cursor_reaping_spec.rb +1 -1
  520. data/spec/integration/docs_examples_spec.rb +1 -1
  521. data/spec/integration/error_detection_spec.rb +1 -1
  522. data/spec/integration/fork_reconnect_spec.rb +2 -2
  523. data/spec/integration/get_more_spec.rb +1 -1
  524. data/spec/integration/grid_fs_bucket_spec.rb +1 -1
  525. data/spec/integration/heartbeat_events_spec.rb +1 -1
  526. data/spec/integration/map_reduce_spec.rb +5 -1
  527. data/spec/integration/mmapv1_spec.rb +1 -1
  528. data/spec/integration/mongos_pinning_spec.rb +1 -1
  529. data/spec/integration/ocsp_connectivity_spec.rb +1 -1
  530. data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
  531. data/spec/integration/ocsp_verifier_spec.rb +1 -1
  532. data/spec/integration/operation_failure_code_spec.rb +1 -1
  533. data/spec/integration/operation_failure_message_spec.rb +1 -0
  534. data/spec/integration/query_cache_spec.rb +90 -3
  535. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  536. data/spec/integration/read_concern_spec.rb +1 -1
  537. data/spec/integration/read_preference_spec.rb +1 -1
  538. data/spec/integration/reconnect_spec.rb +4 -1
  539. data/spec/integration/retryable_errors_spec.rb +1 -1
  540. data/spec/integration/retryable_reads_errors_spec.rb +110 -0
  541. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  542. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  543. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
  544. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
  545. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
  546. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
  547. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
  548. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
  549. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
  550. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
  551. data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
  552. data/spec/integration/retryable_writes_errors_spec.rb +160 -2
  553. data/spec/integration/sdam_error_handling_spec.rb +65 -4
  554. data/spec/integration/sdam_events_spec.rb +1 -1
  555. data/spec/integration/sdam_prose_spec.rb +3 -3
  556. data/spec/integration/secondary_reads_spec.rb +1 -0
  557. data/spec/integration/server_description_spec.rb +1 -1
  558. data/spec/integration/server_monitor_spec.rb +1 -1
  559. data/spec/integration/server_selection_spec.rb +1 -1
  560. data/spec/integration/server_selector_spec.rb +5 -3
  561. data/spec/integration/server_spec.rb +23 -26
  562. data/spec/integration/shell_examples_spec.rb +1 -1
  563. data/spec/integration/size_limit_spec.rb +1 -1
  564. data/spec/integration/snappy_compression_spec.rb +1 -1
  565. data/spec/integration/snapshot_query_examples_spec.rb +9 -7
  566. data/spec/integration/srv_monitoring_spec.rb +2 -1
  567. data/spec/integration/srv_spec.rb +3 -3
  568. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  569. data/spec/integration/step_down_spec.rb +5 -3
  570. data/spec/integration/time_zone_querying_spec.rb +1 -1
  571. data/spec/integration/transaction_pinning_spec.rb +18 -4
  572. data/spec/integration/transactions_api_examples_spec.rb +1 -1
  573. data/spec/integration/transactions_examples_spec.rb +1 -1
  574. data/spec/integration/truncated_utf8_spec.rb +1 -1
  575. data/spec/integration/versioned_api_examples_spec.rb +2 -2
  576. data/spec/integration/x509_auth_spec.rb +1 -1
  577. data/spec/integration/zlib_compression_spec.rb +1 -1
  578. data/spec/integration/zstd_compression_spec.rb +1 -1
  579. data/spec/kerberos/kerberos_spec.rb +1 -1
  580. data/spec/lite_spec_helper.rb +1 -1
  581. data/spec/mongo/address/ipv4_spec.rb +1 -1
  582. data/spec/mongo/address/ipv6_spec.rb +1 -1
  583. data/spec/mongo/address/unix_spec.rb +1 -1
  584. data/spec/mongo/address/validator_spec.rb +1 -1
  585. data/spec/mongo/address_spec.rb +8 -2
  586. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  587. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  588. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  589. data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
  590. data/spec/mongo/auth/aws/request_spec.rb +1 -1
  591. data/spec/mongo/auth/cr_spec.rb +2 -22
  592. data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
  593. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  594. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  595. data/spec/mongo/auth/ldap_spec.rb +1 -1
  596. data/spec/mongo/auth/scram/conversation_spec.rb +1 -1
  597. data/spec/mongo/auth/scram256/conversation_spec.rb +1 -1
  598. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  599. data/spec/mongo/auth/scram_spec.rb +1 -1
  600. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
  601. data/spec/mongo/auth/stringprep_spec.rb +1 -1
  602. data/spec/mongo/auth/user/view_spec.rb +96 -1
  603. data/spec/mongo/auth/user_spec.rb +1 -1
  604. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  605. data/spec/mongo/auth/x509_spec.rb +1 -1
  606. data/spec/mongo/auth_spec.rb +1 -1
  607. data/spec/mongo/bson_spec.rb +1 -1
  608. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
  609. data/spec/mongo/bulk_write/result_spec.rb +1 -1
  610. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
  611. data/spec/mongo/bulk_write_spec.rb +1 -1
  612. data/spec/mongo/caching_cursor_spec.rb +1 -1
  613. data/spec/mongo/client_construction_spec.rb +569 -691
  614. data/spec/mongo/client_encryption_spec.rb +1 -1
  615. data/spec/mongo/client_spec.rb +171 -222
  616. data/spec/mongo/cluster/cursor_reaper_spec.rb +1 -1
  617. data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
  618. data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
  619. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  620. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  621. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  622. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  623. data/spec/mongo/cluster/topology_spec.rb +1 -1
  624. data/spec/mongo/cluster_spec.rb +154 -152
  625. data/spec/mongo/cluster_time_spec.rb +1 -1
  626. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  627. data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
  628. data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
  629. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  630. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  631. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  632. data/spec/mongo/collection/view/immutable_spec.rb +1 -1
  633. data/spec/mongo/collection/view/iterable_spec.rb +1 -1
  634. data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
  635. data/spec/mongo/collection/view/readable_spec.rb +139 -1
  636. data/spec/mongo/collection/view/writable_spec.rb +1 -1
  637. data/spec/mongo/collection/view_spec.rb +1 -1
  638. data/spec/mongo/collection_crud_spec.rb +1 -1
  639. data/spec/mongo/collection_ddl_spec.rb +112 -66
  640. data/spec/mongo/collection_spec.rb +3 -3
  641. data/spec/mongo/condition_variable_spec.rb +104 -0
  642. data/spec/mongo/config/options_spec.rb +1 -0
  643. data/spec/mongo/config_spec.rb +2 -1
  644. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  645. data/spec/mongo/crypt/auto_encrypter_spec.rb +8 -1
  646. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  647. data/spec/mongo/crypt/binary_spec.rb +1 -1
  648. data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
  649. data/spec/mongo/crypt/binding/context_spec.rb +1 -1
  650. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
  651. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +1 -1
  652. data/spec/mongo/crypt/binding/status_spec.rb +1 -1
  653. data/spec/mongo/crypt/binding/version_spec.rb +19 -5
  654. data/spec/mongo/crypt/binding_unloaded_spec.rb +1 -1
  655. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  656. data/spec/mongo/crypt/encryption_io_spec.rb +1 -1
  657. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  658. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -3
  659. data/spec/mongo/crypt/handle_spec.rb +19 -4
  660. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
  661. data/spec/mongo/crypt/hooks_spec.rb +2 -2
  662. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  663. data/spec/mongo/crypt/kms/credentials_spec.rb +17 -1
  664. data/spec/mongo/crypt/kms_spec.rb +1 -1
  665. data/spec/mongo/crypt/status_spec.rb +1 -1
  666. data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
  667. data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
  668. data/spec/mongo/cursor_spec.rb +58 -11
  669. data/spec/mongo/database_spec.rb +1 -1
  670. data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
  671. data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
  672. data/spec/mongo/error/crypt_error_spec.rb +1 -1
  673. data/spec/mongo/error/max_bson_size_spec.rb +1 -1
  674. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  675. data/spec/mongo/error/notable_spec.rb +1 -1
  676. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  677. data/spec/mongo/error/operation_failure_spec.rb +1 -1
  678. data/spec/mongo/error/parser_spec.rb +1 -1
  679. data/spec/mongo/error/unsupported_option_spec.rb +1 -1
  680. data/spec/mongo/event/publisher_spec.rb +1 -1
  681. data/spec/mongo/event/subscriber_spec.rb +1 -1
  682. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  683. data/spec/mongo/grid/file/info_spec.rb +1 -1
  684. data/spec/mongo/grid/file_spec.rb +1 -1
  685. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  686. data/spec/mongo/grid/stream/read_spec.rb +1 -1
  687. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  688. data/spec/mongo/grid/stream_spec.rb +1 -1
  689. data/spec/mongo/id_spec.rb +2 -2
  690. data/spec/mongo/index/view_spec.rb +4 -5
  691. data/spec/mongo/lint_spec.rb +2 -2
  692. data/spec/mongo/logger_spec.rb +1 -1
  693. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
  694. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
  695. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
  696. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
  697. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
  698. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
  699. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
  700. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
  701. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
  702. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
  703. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
  704. data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
  705. data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
  706. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
  707. data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
  708. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  709. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
  710. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  711. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
  712. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  713. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  714. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  715. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  716. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  717. data/spec/mongo/monitoring_spec.rb +1 -1
  718. data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
  719. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  720. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  721. data/spec/mongo/operation/command_spec.rb +1 -1
  722. data/spec/mongo/operation/create/op_msg_spec.rb +1 -1
  723. data/spec/mongo/operation/create_index_spec.rb +1 -1
  724. data/spec/mongo/operation/create_user_spec.rb +1 -1
  725. data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
  726. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  727. data/spec/mongo/operation/delete_spec.rb +1 -1
  728. data/spec/mongo/operation/drop_index_spec.rb +1 -1
  729. data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
  730. data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
  731. data/spec/mongo/operation/indexes_spec.rb +1 -1
  732. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  733. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  734. data/spec/mongo/operation/insert_spec.rb +1 -1
  735. data/spec/mongo/operation/limited_spec.rb +1 -1
  736. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  737. data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
  738. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  739. data/spec/mongo/operation/remove_user_spec.rb +1 -1
  740. data/spec/mongo/operation/result_spec.rb +1 -1
  741. data/spec/mongo/operation/specifiable_spec.rb +1 -1
  742. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  743. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  744. data/spec/mongo/operation/update_spec.rb +1 -1
  745. data/spec/mongo/operation/update_user_spec.rb +1 -1
  746. data/spec/mongo/options/redacted_spec.rb +2 -2
  747. data/spec/mongo/protocol/caching_hash_spec.rb +1 -1
  748. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  749. data/spec/mongo/protocol/get_more_spec.rb +1 -1
  750. data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
  751. data/spec/mongo/protocol/msg_spec.rb +2 -1
  752. data/spec/mongo/protocol/query_spec.rb +1 -1
  753. data/spec/mongo/protocol/registry_spec.rb +1 -1
  754. data/spec/mongo/protocol/reply_spec.rb +1 -1
  755. data/spec/mongo/query_cache_middleware_spec.rb +1 -1
  756. data/spec/mongo/query_cache_spec.rb +1 -1
  757. data/spec/mongo/retryable_spec.rb +5 -3
  758. data/spec/mongo/semaphore_spec.rb +7 -7
  759. data/spec/mongo/server/app_metadata/environment_spec.rb +18 -2
  760. data/spec/mongo/server/app_metadata_spec.rb +16 -24
  761. data/spec/mongo/server/connection_auth_spec.rb +1 -1
  762. data/spec/mongo/server/connection_common_spec.rb +1 -1
  763. data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
  764. data/spec/mongo/server/connection_pool_spec.rb +447 -10
  765. data/spec/mongo/server/connection_spec.rb +17 -4
  766. data/spec/mongo/server/description/features_spec.rb +1 -1
  767. data/spec/mongo/server/description_query_methods_spec.rb +1 -1
  768. data/spec/mongo/server/description_spec.rb +1 -1
  769. data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
  770. data/spec/mongo/server/monitor/connection_spec.rb +3 -3
  771. data/spec/mongo/server/monitor_spec.rb +6 -5
  772. data/spec/mongo/server/push_monitor_spec.rb +1 -1
  773. data/spec/mongo/server/round_trip_time_averager_spec.rb +1 -1
  774. data/spec/mongo/server_selector/nearest_spec.rb +1 -1
  775. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
  776. data/spec/mongo/server_selector/primary_spec.rb +1 -1
  777. data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
  778. data/spec/mongo/server_selector/secondary_spec.rb +1 -1
  779. data/spec/mongo/server_selector_spec.rb +1 -1
  780. data/spec/mongo/server_spec.rb +32 -5
  781. data/spec/mongo/session/server_session_spec.rb +1 -1
  782. data/spec/mongo/session/session_pool_spec.rb +1 -1
  783. data/spec/mongo/session_spec.rb +1 -1
  784. data/spec/mongo/session_transaction_spec.rb +2 -2
  785. data/spec/mongo/socket/ssl_spec.rb +1 -1
  786. data/spec/mongo/socket/tcp_spec.rb +1 -1
  787. data/spec/mongo/socket/unix_spec.rb +1 -1
  788. data/spec/mongo/socket_spec.rb +1 -1
  789. data/spec/mongo/srv/monitor_spec.rb +1 -1
  790. data/spec/mongo/srv/result_spec.rb +1 -1
  791. data/spec/mongo/timeout_spec.rb +1 -1
  792. data/spec/mongo/tls_context_hooks_spec.rb +1 -1
  793. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  794. data/spec/mongo/uri/srv_protocol_spec.rb +150 -2
  795. data/spec/mongo/uri_option_parsing_spec.rb +1 -1
  796. data/spec/mongo/uri_spec.rb +143 -2
  797. data/spec/mongo/utils_spec.rb +1 -1
  798. data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
  799. data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
  800. data/spec/mongo/write_concern_spec.rb +1 -1
  801. data/spec/runners/auth.rb +1 -1
  802. data/spec/runners/change_streams/outcome.rb +1 -1
  803. data/spec/runners/change_streams/spec.rb +1 -1
  804. data/spec/runners/change_streams/test.rb +1 -1
  805. data/spec/runners/cmap/verifier.rb +2 -2
  806. data/spec/runners/cmap.rb +188 -45
  807. data/spec/runners/command_monitoring.rb +1 -1
  808. data/spec/runners/connection_string.rb +1 -1
  809. data/spec/runners/crud/context.rb +1 -1
  810. data/spec/runners/crud/operation.rb +2 -2
  811. data/spec/runners/crud/outcome.rb +1 -1
  812. data/spec/runners/crud/requirement.rb +1 -1
  813. data/spec/runners/crud/spec.rb +2 -2
  814. data/spec/runners/crud/test.rb +1 -1
  815. data/spec/runners/crud/test_base.rb +2 -2
  816. data/spec/runners/crud/verifier.rb +3 -3
  817. data/spec/runners/crud.rb +1 -1
  818. data/spec/runners/gridfs.rb +1 -1
  819. data/spec/runners/read_write_concern_document.rb +1 -1
  820. data/spec/runners/sdam/verifier.rb +1 -1
  821. data/spec/runners/sdam.rb +1 -1
  822. data/spec/runners/server_selection.rb +1 -1
  823. data/spec/runners/server_selection_rtt.rb +1 -1
  824. data/spec/runners/transactions/operation.rb +15 -9
  825. data/spec/runners/transactions/spec.rb +1 -1
  826. data/spec/runners/transactions/test.rb +44 -3
  827. data/spec/runners/transactions.rb +1 -1
  828. data/spec/runners/unified/assertions.rb +94 -77
  829. data/spec/runners/unified/change_stream_operations.rb +14 -3
  830. data/spec/runners/unified/client_side_encryption_operations.rb +1 -1
  831. data/spec/runners/unified/crud_operations.rb +11 -2
  832. data/spec/runners/unified/ddl_operations.rb +80 -4
  833. data/spec/runners/unified/entity_map.rb +1 -1
  834. data/spec/runners/unified/error.rb +1 -1
  835. data/spec/runners/unified/event_subscriber.rb +9 -3
  836. data/spec/runners/unified/exceptions.rb +1 -1
  837. data/spec/runners/unified/grid_fs_operations.rb +1 -1
  838. data/spec/runners/unified/support_operations.rb +66 -2
  839. data/spec/runners/unified/test.rb +86 -12
  840. data/spec/runners/unified/test_group.rb +1 -1
  841. data/spec/runners/unified/thread_operations.rb +73 -0
  842. data/spec/runners/unified.rb +9 -6
  843. data/spec/shared/lib/mrss/lite_constraints.rb +2 -2
  844. data/spec/shared/lib/mrss/utils.rb +28 -6
  845. data/spec/shared/shlib/server.sh +1 -1
  846. data/spec/solo/clean_exit_spec.rb +1 -1
  847. data/spec/spec_helper.rb +1 -1
  848. data/spec/spec_tests/auth_spec.rb +1 -1
  849. data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
  850. data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
  851. data/spec/spec_tests/client_side_encryption_unified_spec.rb +12 -2
  852. data/spec/spec_tests/cmap_spec.rb +29 -15
  853. data/spec/spec_tests/collection_management_spec.rb +1 -1
  854. data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
  855. data/spec/spec_tests/connection_string_spec.rb +1 -1
  856. data/spec/spec_tests/crud_spec.rb +1 -1
  857. data/spec/spec_tests/crud_unified_spec.rb +1 -1
  858. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
  859. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
  860. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +2 -6
  861. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  862. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -3
  863. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -3
  864. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  865. data/spec/spec_tests/data/client_side_encryption/{fle2-BypassQueryAnalysis.yml → fle2v2-BypassQueryAnalysis.yml} +18 -30
  866. data/spec/spec_tests/data/client_side_encryption/{fle2-Compact.yml → fle2v2-Compact.yml} +5 -3
  867. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  868. data/spec/spec_tests/data/client_side_encryption/{fle2-CreateCollection.yml → fle2v2-CreateCollection.yml} +212 -538
  869. data/spec/spec_tests/data/client_side_encryption/{fle2-DecryptExistingData.yml → fle2v2-DecryptExistingData.yml} +4 -2
  870. data/spec/spec_tests/data/client_side_encryption/{fle2-Delete.yml → fle2v2-Delete.yml} +17 -24
  871. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-EncryptedFieldsMap.yml → fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml} +5 -6
  872. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-jsonSchema.yml → fle2v2-EncryptedFields-vs-jsonSchema.yml} +18 -6
  873. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFieldsMap-defaults.yml → fle2v2-EncryptedFieldsMap-defaults.yml} +6 -5
  874. data/spec/spec_tests/data/client_side_encryption/{fle2-FindOneAndUpdate.yml → fle2v2-FindOneAndUpdate.yml} +31 -44
  875. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Indexed.yml → fle2v2-InsertFind-Indexed.yml} +16 -6
  876. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Unindexed.yml → fle2v2-InsertFind-Unindexed.yml} +10 -4
  877. data/spec/spec_tests/data/client_side_encryption/{fle2-MissingKey.yml → fle2v2-MissingKey.yml} +5 -3
  878. data/spec/spec_tests/data/client_side_encryption/{fle2-NoEncryption.yml → fle2v2-NoEncryption.yml} +4 -2
  879. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
  880. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
  881. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
  882. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
  883. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
  884. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
  885. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
  886. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
  887. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
  888. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
  889. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
  890. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
  891. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
  892. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
  893. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
  894. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
  895. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
  896. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
  897. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
  898. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
  899. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
  900. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
  901. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
  902. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
  903. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
  904. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
  905. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
  906. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
  907. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
  908. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
  909. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
  910. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
  911. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
  912. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
  913. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
  914. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
  915. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
  922. data/spec/spec_tests/data/client_side_encryption/{fle2-Update.yml → fle2v2-Update.yml} +33 -44
  923. data/spec/spec_tests/data/client_side_encryption/{fle2-validatorAndPartialFieldExpression.yml → fle2v2-validatorAndPartialFieldExpression.yml} +10 -9
  924. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +1 -1
  925. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +1 -1
  926. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  927. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  928. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  929. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  930. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  931. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  932. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  933. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  934. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  935. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  936. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  937. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +66 -0
  938. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  939. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  940. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  941. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  942. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
  943. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  944. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  945. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  946. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  947. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  948. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  949. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  950. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  951. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
  952. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  953. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  954. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  955. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  956. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  957. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
  958. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  959. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  960. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  961. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  962. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +44 -0
  963. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  964. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  965. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  966. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1266 -53
  967. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +1 -1
  968. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +706 -58
  969. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  970. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +1 -1
  971. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  972. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  973. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
  974. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  975. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
  976. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  977. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  978. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  979. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  980. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
  981. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  982. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
  983. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  984. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
  985. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
  986. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
  987. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
  988. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  989. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  990. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  991. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  992. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  993. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  994. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  995. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  996. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  997. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  998. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  999. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1000. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1001. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1002. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1003. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1004. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1005. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1006. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1007. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1008. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1009. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
  1010. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
  1011. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
  1012. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +1 -1
  1013. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +4 -3
  1014. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +4 -3
  1015. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1016. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
  1017. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
  1018. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
  1019. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1020. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1021. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1022. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1023. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1024. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1025. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1026. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1027. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1028. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1029. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1030. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +18 -0
  1031. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +18 -12
  1032. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
  1033. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +2 -2
  1034. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +1 -1
  1035. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +1 -1
  1036. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
  1037. data/spec/spec_tests/gridfs_spec.rb +1 -1
  1038. data/spec/spec_tests/gridfs_unified_spec.rb +1 -1
  1039. data/spec/spec_tests/load_balancers_spec.rb +1 -1
  1040. data/spec/spec_tests/max_staleness_spec.rb +1 -1
  1041. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  1042. data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
  1043. data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
  1044. data/spec/spec_tests/retryable_reads_spec.rb +3 -1
  1045. data/spec/spec_tests/retryable_reads_unified_spec.rb +1 -1
  1046. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  1047. data/spec/spec_tests/retryable_writes_unified_spec.rb +1 -1
  1048. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
  1049. data/spec/spec_tests/sdam_spec.rb +5 -1
  1050. data/spec/spec_tests/sdam_unified_spec.rb +13 -0
  1051. data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
  1052. data/spec/spec_tests/server_selection_rtt_spec.rb +1 -1
  1053. data/spec/spec_tests/server_selection_spec.rb +1 -1
  1054. data/spec/spec_tests/sessions_unified_spec.rb +1 -1
  1055. data/spec/spec_tests/transactions_api_spec.rb +1 -1
  1056. data/spec/spec_tests/transactions_spec.rb +1 -1
  1057. data/spec/spec_tests/transactions_unified_spec.rb +1 -1
  1058. data/spec/spec_tests/unified_spec.rb +1 -6
  1059. data/spec/spec_tests/uri_options_spec.rb +1 -1
  1060. data/spec/spec_tests/versioned_api_spec.rb +1 -1
  1061. data/spec/stress/cleanup_spec.rb +1 -1
  1062. data/spec/stress/connection_pool_stress_spec.rb +1 -62
  1063. data/spec/stress/connection_pool_timing_spec.rb +9 -34
  1064. data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
  1065. data/spec/stress/push_monitor_close_spec.rb +1 -1
  1066. data/spec/support/authorization.rb +1 -1
  1067. data/spec/support/aws_utils/base.rb +1 -1
  1068. data/spec/support/aws_utils/inspector.rb +1 -1
  1069. data/spec/support/aws_utils/orchestrator.rb +20 -8
  1070. data/spec/support/aws_utils/provisioner.rb +1 -1
  1071. data/spec/support/aws_utils.rb +1 -0
  1072. data/spec/support/background_thread_registry.rb +1 -1
  1073. data/spec/support/certificates/retrieve-atlas-cert +2 -0
  1074. data/spec/support/client_registry.rb +6 -2
  1075. data/spec/support/client_registry_macros.rb +1 -1
  1076. data/spec/support/cluster_tools.rb +13 -8
  1077. data/spec/support/common_shortcuts.rb +30 -5
  1078. data/spec/support/constraints.rb +15 -1
  1079. data/spec/support/crypt/{encryptedFields.json → encrypted_fields/encryptedFields.json} +0 -1
  1080. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1081. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1082. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1083. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1084. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1085. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1086. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1087. data/spec/support/crypt.rb +13 -3
  1088. data/spec/support/dns.rb +1 -1
  1089. data/spec/support/json_ext_formatter.rb +1 -1
  1090. data/spec/support/keyword_struct.rb +1 -1
  1091. data/spec/support/local_resource_registry.rb +1 -1
  1092. data/spec/support/macros.rb +1 -0
  1093. data/spec/support/matchers.rb +5 -5
  1094. data/spec/support/mongos_macros.rb +7 -0
  1095. data/spec/support/monitoring_ext.rb +1 -1
  1096. data/spec/support/primary_socket.rb +1 -1
  1097. data/spec/support/sdam_formatter_integration.rb +1 -1
  1098. data/spec/support/shared/app_metadata.rb +1 -1
  1099. data/spec/support/shared/auth_context.rb +1 -0
  1100. data/spec/support/shared/protocol.rb +1 -1
  1101. data/spec/support/shared/scram_conversation.rb +1 -1
  1102. data/spec/support/shared/server_selector.rb +1 -1
  1103. data/spec/support/shared/session.rb +1 -1
  1104. data/spec/support/spec_config.rb +40 -3
  1105. data/spec/support/spec_setup.rb +1 -1
  1106. data/spec/support/using_hash.rb +11 -2
  1107. data/spec/support/utils.rb +277 -249
  1108. data.tar.gz.sig +0 -0
  1109. metadata +330 -64
  1110. metadata.gz.sig +0 -0
  1111. data/spec/integration/find_options_spec.rb +0 -227
  1112. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1113. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1114. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
  1115. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
  1116. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -152
  1117. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -148
  1118. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -219
  1119. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
  1120. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
  1121. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
  1122. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +0 -15
  1123. data/spec/spec_tests/sdam_integration_spec.rb +0 -16
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (C) 2016-2023 MongoDB Inc.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Mongo
18
+ class Server
19
+ class AppMetadata
20
+ # Implements the logic for building the platform string for the
21
+ # handshake.
22
+ #
23
+ # @api private
24
+ class Platform
25
+ # @return [ Mongo::Server::AppMetadata ] the metadata object to
26
+ # reference when building the platform string.
27
+ attr_reader :metadata
28
+
29
+ # Create a new Platform object, referencing the given metadata object.
30
+ #
31
+ # @param [ Mongo::Server::AppMetadata ] metadata the metadata object
32
+ # the reference when building the platform string.
33
+ def initialize(metadata)
34
+ @metadata = metadata
35
+ end
36
+
37
+ # Queries whether the current runtime is JRuby or not.
38
+ #
39
+ # @return [ true | false ] whether the runtime is JRuby or not.
40
+ def jruby?
41
+ BSON::Environment.jruby?
42
+ end
43
+
44
+ # Returns the list of Ruby versions that identify this runtime.
45
+ #
46
+ # @return [ Array<String> ] the list of ruby versions
47
+ def ruby_versions
48
+ if jruby?
49
+ [ "JRuby #{JRUBY_VERSION}", "like Ruby #{RUBY_VERSION}" ]
50
+ else
51
+ [ "Ruby #{RUBY_VERSION}" ]
52
+ end
53
+ end
54
+
55
+ # Returns the list of platform identifiers that identify this runtime.
56
+ #
57
+ # @return [ Array<String> ] the list of platform identifiers.
58
+ def platforms
59
+ [ RUBY_PLATFORM ].tap do |list|
60
+ list.push "JVM #{java_version}" if jruby?
61
+ end
62
+ end
63
+
64
+ # Returns the version of the current Java environment, or nil if not
65
+ # invoked with JRuby.
66
+ #
67
+ # @return [ String | nil ] the current Java version
68
+ def java_version
69
+ return nil unless jruby?
70
+
71
+ java.lang.System.get_property('java.version')
72
+ end
73
+
74
+ # Builds and returns the default platform list, for use when building
75
+ # the platform string.
76
+ #
77
+ # @return [ Array<String> ] the list of platform identifiers
78
+ def default_platform_list
79
+ [
80
+ metadata.platform,
81
+ *ruby_versions,
82
+ *platforms,
83
+ RbConfig::CONFIG['build']
84
+ ]
85
+ end
86
+
87
+ # Returns a single letter representing the purpose reported to the
88
+ # metadata, or nil if no purpose was specified.
89
+ #
90
+ # @return [ String | nil ] the code representing the purpose
91
+ def purpose
92
+ return nil unless metadata.purpose
93
+
94
+ metadata.purpose.to_s[0].upcase
95
+ end
96
+
97
+ # Builds and returns the platform string by concatenating relevant
98
+ # values together.
99
+ #
100
+ # @return [ String ] the platform string
101
+ def to_s
102
+ primary = [ *default_platform_list, purpose ].compact.join(', ')
103
+ list = [ primary ]
104
+
105
+ metadata.wrapping_libraries&.each do |library|
106
+ list << (library[:platform] || '')
107
+ end
108
+
109
+ list.join('|')
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
3
2
 
4
3
  # Copyright (C) 2016-2020 MongoDB Inc.
5
4
  #
@@ -16,6 +15,7 @@
16
15
  # limitations under the License.
17
16
 
18
17
  require 'mongo/server/app_metadata/environment'
18
+ require 'mongo/server/app_metadata/platform'
19
19
  require 'mongo/server/app_metadata/truncator'
20
20
 
21
21
  module Mongo
@@ -24,35 +24,23 @@ module Mongo
24
24
  # when a new connection is established.
25
25
  #
26
26
  # @api private
27
- #
28
- # @since 2.4.0
29
27
  class AppMetadata
30
28
  extend Forwardable
31
29
 
32
30
  # The max application name byte size.
33
- #
34
- # @since 2.4.0
35
- MAX_APP_NAME_SIZE = 128.freeze
31
+ MAX_APP_NAME_SIZE = 128
36
32
 
37
33
  # The driver name.
38
- #
39
- # @since 2.4.0
40
34
  DRIVER_NAME = 'mongo-ruby-driver'
41
35
 
42
36
  # Option keys that affect auth mechanism negotiation.
43
- #
44
- # @api private
45
- AUTH_OPTION_KEYS = [:user, :auth_source, :auth_mech].freeze
37
+ AUTH_OPTION_KEYS = %i[ user auth_source auth_mech].freeze
46
38
 
47
39
  # Possible connection purposes.
48
- #
49
- # @api private
50
- PURPOSES = %i(application monitor push_monitor).freeze
40
+ PURPOSES = %i[ application monitor push_monitor ].freeze
51
41
 
52
42
  # Instantiate the new AppMetadata object.
53
43
  #
54
- # @api private
55
- #
56
44
  # @example Instantiate the app metadata.
57
45
  # Mongo::Server::AppMetadata.new(options)
58
46
  #
@@ -86,35 +74,33 @@ module Mongo
86
74
  def initialize(options = {})
87
75
  @app_name = options[:app_name].to_s if options[:app_name]
88
76
  @platform = options[:platform]
89
- if @purpose = options[:purpose]
90
- unless PURPOSES.include?(@purpose)
91
- raise ArgumentError, "Invalid purpose: #{@purpose}"
92
- end
93
- end
77
+
78
+ @purpose = check_purpose!(options[:purpose])
79
+
94
80
  @compressors = options[:compressors] || []
95
81
  @wrapping_libraries = options[:wrapping_libraries]
96
82
  @server_api = options[:server_api]
97
83
 
98
- if options[:user] && !options[:auth_mech]
99
- auth_db = options[:auth_source] || 'admin'
100
- @request_auth_mech = "#{auth_db}.#{options[:user]}"
101
- end
84
+ return unless options[:user] && !options[:auth_mech]
85
+
86
+ auth_db = options[:auth_source] || 'admin'
87
+ @request_auth_mech = "#{auth_db}.#{options[:user]}"
102
88
  end
103
89
 
104
90
  # @return [ Symbol ] The purpose of the connection for which this
105
91
  # app metadata is created.
106
- #
107
- # @api private
108
92
  attr_reader :purpose
109
93
 
94
+ # @return [ String ] The platform information given when the object was
95
+ # instantiated.
96
+ attr_reader :platform
97
+
110
98
  # @return [ Hash | nil ] The requested server API version.
111
99
  #
112
100
  # Thes hash can have the following items:
113
101
  # - *:version* -- string
114
102
  # - *:strict* -- boolean
115
103
  # - *:deprecation_errors* -- boolean
116
- #
117
- # @api private
118
104
  attr_reader :server_api
119
105
 
120
106
  # @return [ Array<Hash> | nil ] Information about libraries wrapping
@@ -130,8 +116,6 @@ module Mongo
130
116
  # @return [BSON::Document] Valid document for connection's handshake.
131
117
  #
132
118
  # @raise [ Error::InvalidApplicationName ] When the metadata are invalid.
133
- #
134
- # @api private
135
119
  def validated_document
136
120
  validate!
137
121
  document
@@ -141,15 +125,13 @@ module Mongo
141
125
  # handshake document.
142
126
  #
143
127
  # @return [BSON::Document] Document describing client for handshake.
144
- #
145
- # @api private
146
128
  def client_document
147
129
  @client_document ||=
148
130
  BSON::Document.new.tap do |doc|
149
131
  doc[:application] = { name: @app_name } if @app_name
150
132
  doc[:driver] = driver_doc
151
133
  doc[:os] = os_doc
152
- doc[:platform] = platform
134
+ doc[:platform] = platform_string
153
135
  env_doc.tap { |env| doc[:env] = env if env }
154
136
  end
155
137
  end
@@ -164,6 +146,7 @@ module Mongo
164
146
  if @app_name && @app_name.bytesize > MAX_APP_NAME_SIZE
165
147
  raise Error::InvalidApplicationName.new(@app_name, MAX_APP_NAME_SIZE)
166
148
  end
149
+
167
150
  true
168
151
  end
169
152
 
@@ -183,14 +166,13 @@ module Mongo
183
166
  end
184
167
 
185
168
  def driver_doc
186
- names = [DRIVER_NAME]
187
- versions = [Mongo::VERSION]
188
- if wrapping_libraries
189
- wrapping_libraries.each do |library|
190
- names << library[:name] || ''
191
- versions << library[:version] || ''
192
- end
169
+ names = [ DRIVER_NAME ]
170
+ versions = [ Mongo::VERSION ]
171
+ wrapping_libraries&.each do |library|
172
+ names << (library[:name] || '')
173
+ versions << (library[:version] || '')
193
174
  end
175
+
194
176
  {
195
177
  name: names.join('|'),
196
178
  version: versions.join('|'),
@@ -201,18 +183,25 @@ module Mongo
201
183
  {
202
184
  type: type,
203
185
  name: name,
204
- architecture: architecture
186
+ architecture: architecture,
205
187
  }
206
188
  end
207
189
 
190
+ # Returns the environment doc describing the current FaaS environment.
191
+ #
192
+ # @return [ Hash | nil ] the environment doc (or nil if not in a FaaS
193
+ # environment).
208
194
  def env_doc
209
195
  env = Environment.new
210
196
  env.faas? ? env.to_h : nil
211
197
  end
212
198
 
213
199
  def type
214
- (RbConfig::CONFIG && RbConfig::CONFIG['host_os']) ?
215
- RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase : 'unknown'
200
+ if RbConfig::CONFIG && RbConfig::CONFIG['host_os']
201
+ RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase
202
+ else
203
+ 'unknown'
204
+ end
216
205
  end
217
206
 
218
207
  def name
@@ -223,31 +212,22 @@ module Mongo
223
212
  RbConfig::CONFIG['target_cpu']
224
213
  end
225
214
 
226
- def platform
227
- if BSON::Environment.jruby?
228
- ruby_versions = ["JRuby #{JRUBY_VERSION}", "like Ruby #{RUBY_VERSION}"]
229
- platforms = [RUBY_PLATFORM, "JVM #{java.lang.System.get_property('java.version')}"]
230
- else
231
- ruby_versions = ["Ruby #{RUBY_VERSION}"]
232
- platforms = [RUBY_PLATFORM]
233
- end
234
- platforms = [
235
- @platform,
236
- *ruby_versions,
237
- *platforms,
238
- RbConfig::CONFIG['build'],
239
- ]
240
- if @purpose
241
- platforms << @purpose.to_s[0].upcase
242
- end
243
- platform = platforms.compact.join(', ')
244
- platforms = [platform]
245
- if wrapping_libraries
246
- wrapping_libraries.each do |library|
247
- platforms << library[:platform] || ''
248
- end
249
- end
250
- platforms.join('|')
215
+ def platform_string
216
+ Platform.new(self).to_s
217
+ end
218
+
219
+ # Verifies that the given purpose is either nil, or is one of the
220
+ # allowed purposes.
221
+ #
222
+ # @param [ String | nil ] purpose The purpose to validate
223
+ #
224
+ # @return [ String | nil ] the {{purpose}} argument
225
+ #
226
+ # @raise [ ArgumentError ] if the purpose is invalid
227
+ def check_purpose!(purpose)
228
+ return purpose unless purpose && !PURPOSES.include?(purpose)
229
+
230
+ raise ArgumentError, "Invalid purpose: #{purpose}"
251
231
  end
252
232
  end
253
233
  end
@@ -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
  #
@@ -87,6 +87,9 @@ module Mongo
87
87
  # @param [ Mongo::Server ] server The server the connection is for.
88
88
  # @param [ Hash ] options The connection options.
89
89
  #
90
+ # @option options :pipe [ IO ] The file descriptor for the read end of the
91
+ # pipe to listen on during the select system call when reading from the
92
+ # socket.
90
93
  # @option options [ Integer ] :generation The generation of this
91
94
  # connection. The generation should only be specified in this option
92
95
  # when not in load-balancing mode, and it should be the generation
@@ -144,6 +147,14 @@ module Mongo
144
147
  options[:connection_pool]
145
148
  end
146
149
 
150
+ # Whether the connection was connected and was not interrupted, closed,
151
+ # or had an error raised.
152
+ #
153
+ # @return [ true | false ] if the connection was connected.
154
+ def connected?
155
+ !closed? && !error? && !interrupted? && !!@socket
156
+ end
157
+
147
158
  # Whether the connection was closed.
148
159
  #
149
160
  # Closed connections should no longer be used. Instead obtain a new
@@ -156,6 +167,21 @@ module Mongo
156
167
  !!@closed
157
168
  end
158
169
 
170
+ # Whether the connection was interrupted.
171
+ #
172
+ # Interrupted connections were already removed from the pool and should
173
+ # not be checked back into the pool.
174
+ #
175
+ # @return [ true | false ] Whether connection was interrupted.
176
+ def interrupted?
177
+ !!@interrupted
178
+ end
179
+
180
+ # Mark the connection as interrupted.
181
+ def interrupted!
182
+ @interrupted = true
183
+ end
184
+
159
185
  # @api private
160
186
  def error?
161
187
  !!@error
@@ -201,18 +227,11 @@ module Mongo
201
227
  #
202
228
  # @since 2.0.0
203
229
  def connect!
204
- if error?
205
- raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is perished. Reconnecting closed or errored connections is no longer supported"
206
- end
207
-
208
- if closed?
209
- raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is closed. Reconnecting closed or errored connections is no longer supported"
210
- end
230
+ raise_if_closed!
211
231
 
212
232
  unless @socket
213
- # When @socket is assigned, the socket should have handshaken and
214
- # authenticated and be usable.
215
- @socket, @description, @compressor = do_connect
233
+ @socket = create_socket
234
+ @description, @compressor = do_connect
216
235
 
217
236
  if server.load_balancer?
218
237
  if Lint.enabled?
@@ -232,27 +251,36 @@ module Mongo
232
251
  true
233
252
  end
234
253
 
235
- # Separate method to permit easier mocking in the test suite.
254
+ # Creates the socket. The method is separate from do_connect, so that
255
+ # pending connections can be closed if they are interrupted during hello.
236
256
  #
237
- # @return [ Array<Socket, Server::Description> ] Connected socket and
238
- # a server description instance from the hello response of the
239
- # returned socket.
240
- private def do_connect
241
- socket = add_server_diagnostics do
257
+ #
258
+ # @return [ Socket ] The created socket.
259
+ private def create_socket
260
+ add_server_diagnostics do
242
261
  address.socket(socket_timeout, ssl_options.merge(
243
- connection_address: address, connection_generation: generation))
262
+ connection_address: address, connection_generation: generation, pipe: options[:pipe]))
244
263
  end
264
+ end
245
265
 
266
+ # Separate method to permit easier mocking in the test suite.
267
+ #
268
+ # @return [ Array<Server::Description, String | Symbol> ] A server
269
+ # description instance from the hello response of the returned socket
270
+ # and the compressor to use.
271
+ private def do_connect
272
+ raise_if_closed!
246
273
  begin
247
274
  pending_connection = PendingConnection.new(
248
275
  socket, @server, monitoring, options.merge(id: id))
249
276
  pending_connection.handshake_and_authenticate!
250
277
  rescue Exception
251
- socket.close
278
+ socket&.close
279
+ @socket = nil
252
280
  raise
253
281
  end
254
282
 
255
- [socket, pending_connection.description, pending_connection.compressor]
283
+ [pending_connection.description, pending_connection.compressor]
256
284
  end
257
285
 
258
286
  # Disconnect the connection.
@@ -268,6 +296,8 @@ module Mongo
268
296
  #
269
297
  # @option options [ Symbol ] :reason The reason why the connection is
270
298
  # being closed.
299
+ # @option options [ true | false ] :interrupted Whether or not the
300
+ # connection was interrupted.
271
301
  #
272
302
  # @return [ true ] If the disconnect succeeded.
273
303
  #
@@ -282,6 +312,7 @@ module Mongo
282
312
  @socket = nil
283
313
  end
284
314
  @closed = true
315
+ interrupted! if options && options[:interrupted]
285
316
 
286
317
  # To satisfy CMAP spec tests, publish close events even if the
287
318
  # socket was never connected (and thus the ready event was never
@@ -376,6 +407,16 @@ module Mongo
376
407
  raise
377
408
  end
378
409
  end
410
+
411
+ def raise_if_closed!
412
+ if error?
413
+ raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is perished. Reconnecting closed or errored connections is no longer supported"
414
+ end
415
+
416
+ if closed?
417
+ raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is closed. Reconnecting closed or errored connections is no longer supported"
418
+ end
419
+ end
379
420
  end
380
421
  end
381
422
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2019-2020 MongoDB Inc.
5
5
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2020 MongoDB Inc.
5
5
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2021 MongoDB Inc.
5
5
  #
@@ -24,31 +24,52 @@ module Mongo
24
24
 
25
25
  def initialize(server:)
26
26
  @map = Hash.new { |hash, key| hash[key] = 1 }
27
+ @pipe_fds = Hash.new { |hash, key| hash[key] = { 1 => IO.pipe } }
27
28
  @server = server
28
29
  @lock = Mutex.new
30
+ @scheduled_for_close = []
29
31
  end
30
32
 
31
33
  attr_reader :server
32
34
 
33
35
  def generation(service_id: nil)
34
- if service_id
35
- unless server.load_balancer?
36
- raise ArgumentError, "Generation scoping to services is only available in load-balanced mode, but the server at #{server.address} is not a load balancer"
37
- end
38
- else
39
- if server.load_balancer?
40
- raise ArgumentError, "The server at #{server.address} is a load balancer and therefore does not have a single global generation"
41
- end
42
- end
36
+ validate_service_id!(service_id)
37
+
43
38
  @lock.synchronize do
44
39
  @map[service_id]
45
40
  end
46
41
  end
47
42
 
43
+ def generation_unlocked(service_id: nil)
44
+ validate_service_id!(service_id)
45
+
46
+ @map[service_id]
47
+ end
48
+
49
+ def pipe_fds(service_id: nil)
50
+ @pipe_fds[service_id][@map[service_id]]
51
+ end
52
+
53
+ def remove_pipe_fds(generation, service_id: nil)
54
+ validate_service_id!(service_id)
55
+
56
+ r, w = @pipe_fds[service_id].delete(generation)
57
+ w.close
58
+ # Schedule the read end of the pipe to be closed. We cannot close it
59
+ # immediately since we need to wait for any Kernel#select calls to
60
+ # notice that part of the pipe is closed, and check the socket. This
61
+ # all happens when attempting to read from the socket and waiting for
62
+ # it to become ready again.
63
+ @scheduled_for_close << r
64
+ end
65
+
48
66
  def bump(service_id: nil)
49
67
  @lock.synchronize do
68
+ close_all_scheduled
50
69
  if service_id
51
- @map[service_id] += 1
70
+ gen = @map[service_id] += 1
71
+ @pipe_fds[service_id] ||= {}
72
+ @pipe_fds[service_id][gen] = IO.pipe
52
73
  else
53
74
  # When service id is not supplied, one of two things may be
54
75
  # happening;
@@ -60,11 +81,34 @@ module Mongo
60
81
  #
61
82
  # Incrementing everything in the map accomplishes both tasks.
62
83
  @map.each do |k, v|
63
- @map[k] += 1
84
+ gen = @map[k] += 1
85
+ @pipe_fds[service_id] ||= {}
86
+ @pipe_fds[service_id][gen] = IO.pipe
64
87
  end
65
88
  end
66
89
  end
67
90
  end
91
+
92
+ private
93
+
94
+ def validate_service_id!(service_id)
95
+ if service_id
96
+ unless server.load_balancer?
97
+ raise ArgumentError, "Generation scoping to services is only available in load-balanced mode, but the server at #{server.address} is not a load balancer"
98
+ end
99
+ else
100
+ if server.load_balancer?
101
+ raise ArgumentError, "The server at #{server.address} is a load balancer and therefore does not have a single global generation"
102
+ end
103
+ end
104
+ end
105
+
106
+ # Close all fds scheduled for closing.
107
+ def close_all_scheduled
108
+ while pipe = @scheduled_for_close.pop
109
+ pipe.close
110
+ end
111
+ end
68
112
  end
69
113
  end
70
114
  end