mongo 2.18.2 → 2.19.1

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 (1136) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +12 -2
  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 +52 -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 -1
  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 -1
  87. data/lib/mongo/collection.rb +29 -12
  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 +5 -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 +120 -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 +13 -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_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 +1 -1
  171. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  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 +1 -1
  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 +1 -1
  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 +4 -2
  189. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  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 +8 -1
  201. data/lib/mongo/error/operation_failure.rb +1 -1
  202. data/lib/mongo/error/parser.rb +1 -1
  203. data/lib/mongo/error/pool_cleared_error.rb +40 -0
  204. data/lib/mongo/error/pool_closed_error.rb +4 -17
  205. data/lib/mongo/error/pool_error.rb +45 -0
  206. data/lib/mongo/error/pool_paused_error.rb +40 -0
  207. data/lib/mongo/error/raise_original_error.rb +1 -1
  208. data/lib/mongo/error/read_write_retryable.rb +1 -1
  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/error/server_not_usable.rb +36 -0
  214. data/lib/mongo/error/session_ended.rb +1 -1
  215. data/lib/mongo/error/session_not_materialized.rb +1 -1
  216. data/lib/mongo/error/sessions_not_supported.rb +1 -1
  217. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
  218. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
  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/error/unchangeable_collection_option.rb +1 -1
  222. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  223. data/lib/mongo/error/unexpected_response.rb +1 -1
  224. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  225. data/lib/mongo/error/unmet_dependency.rb +1 -1
  226. data/lib/mongo/error/unsupported_array_filters.rb +1 -1
  227. data/lib/mongo/error/unsupported_collation.rb +1 -1
  228. data/lib/mongo/error/unsupported_features.rb +1 -1
  229. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  230. data/lib/mongo/error/unsupported_option.rb +1 -1
  231. data/lib/mongo/error/write_retryable.rb +1 -1
  232. data/lib/mongo/error.rb +8 -1
  233. data/lib/mongo/event/base.rb +1 -1
  234. data/lib/mongo/event/listeners.rb +1 -1
  235. data/lib/mongo/event/publisher.rb +1 -1
  236. data/lib/mongo/event/subscriber.rb +1 -1
  237. data/lib/mongo/event.rb +1 -1
  238. data/lib/mongo/grid/file/chunk.rb +3 -2
  239. data/lib/mongo/grid/file/info.rb +3 -2
  240. data/lib/mongo/grid/file.rb +1 -1
  241. data/lib/mongo/grid/fs_bucket.rb +1 -1
  242. data/lib/mongo/grid/stream/read.rb +1 -1
  243. data/lib/mongo/grid/stream/write.rb +1 -1
  244. data/lib/mongo/grid/stream.rb +1 -1
  245. data/lib/mongo/grid.rb +1 -1
  246. data/lib/mongo/id.rb +1 -1
  247. data/lib/mongo/index/view.rb +1 -1
  248. data/lib/mongo/index.rb +1 -1
  249. data/lib/mongo/lint.rb +1 -1
  250. data/lib/mongo/loggable.rb +3 -3
  251. data/lib/mongo/logger.rb +1 -1
  252. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  253. data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
  254. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  255. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  256. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  257. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  258. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  259. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  260. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  261. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  262. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
  263. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  264. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  265. data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
  266. data/lib/mongo/monitoring/event/cmap.rb +2 -1
  267. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  268. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  269. data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
  270. data/lib/mongo/monitoring/event/secure.rb +1 -1
  271. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  272. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  273. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  274. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  275. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  276. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  277. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  278. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  279. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  280. data/lib/mongo/monitoring/event.rb +1 -1
  281. data/lib/mongo/monitoring/publishable.rb +1 -1
  282. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  283. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  284. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  285. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  286. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  287. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  288. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  289. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  290. data/lib/mongo/monitoring.rb +1 -1
  291. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  292. data/lib/mongo/operation/aggregate/result.rb +1 -1
  293. data/lib/mongo/operation/aggregate.rb +1 -1
  294. data/lib/mongo/operation/collections_info/result.rb +1 -1
  295. data/lib/mongo/operation/collections_info.rb +1 -1
  296. data/lib/mongo/operation/command/op_msg.rb +1 -1
  297. data/lib/mongo/operation/command.rb +1 -1
  298. data/lib/mongo/operation/context.rb +1 -1
  299. data/lib/mongo/operation/count/op_msg.rb +1 -1
  300. data/lib/mongo/operation/count.rb +1 -1
  301. data/lib/mongo/operation/create/op_msg.rb +1 -1
  302. data/lib/mongo/operation/create.rb +1 -1
  303. data/lib/mongo/operation/create_index/op_msg.rb +1 -1
  304. data/lib/mongo/operation/create_index.rb +1 -1
  305. data/lib/mongo/operation/create_user/op_msg.rb +1 -1
  306. data/lib/mongo/operation/create_user.rb +1 -1
  307. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  308. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  309. data/lib/mongo/operation/delete/result.rb +1 -1
  310. data/lib/mongo/operation/delete.rb +1 -1
  311. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  312. data/lib/mongo/operation/distinct.rb +1 -1
  313. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  314. data/lib/mongo/operation/drop.rb +1 -1
  315. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  316. data/lib/mongo/operation/drop_database.rb +1 -1
  317. data/lib/mongo/operation/drop_index/op_msg.rb +1 -1
  318. data/lib/mongo/operation/drop_index.rb +1 -1
  319. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  320. data/lib/mongo/operation/explain/result.rb +1 -1
  321. data/lib/mongo/operation/explain.rb +1 -1
  322. data/lib/mongo/operation/find/builder/command.rb +1 -1
  323. data/lib/mongo/operation/find/builder/flags.rb +1 -1
  324. data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
  325. data/lib/mongo/operation/find/builder.rb +1 -1
  326. data/lib/mongo/operation/find/op_msg.rb +1 -1
  327. data/lib/mongo/operation/find/result.rb +1 -1
  328. data/lib/mongo/operation/find.rb +1 -1
  329. data/lib/mongo/operation/get_more/command_builder.rb +1 -1
  330. data/lib/mongo/operation/get_more/op_msg.rb +1 -1
  331. data/lib/mongo/operation/get_more/result.rb +1 -1
  332. data/lib/mongo/operation/get_more.rb +1 -1
  333. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  334. data/lib/mongo/operation/indexes/result.rb +1 -1
  335. data/lib/mongo/operation/indexes.rb +1 -1
  336. data/lib/mongo/operation/insert/bulk_result.rb +1 -1
  337. data/lib/mongo/operation/insert/op_msg.rb +1 -1
  338. data/lib/mongo/operation/insert/result.rb +1 -1
  339. data/lib/mongo/operation/insert.rb +1 -1
  340. data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
  341. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  342. data/lib/mongo/operation/kill_cursors.rb +1 -1
  343. data/lib/mongo/operation/list_collections/op_msg.rb +1 -1
  344. data/lib/mongo/operation/list_collections/result.rb +1 -1
  345. data/lib/mongo/operation/list_collections.rb +1 -1
  346. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  347. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  348. data/lib/mongo/operation/map_reduce.rb +1 -1
  349. data/lib/mongo/operation/op_msg_base.rb +1 -1
  350. data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
  351. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  352. data/lib/mongo/operation/parallel_scan.rb +1 -1
  353. data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
  354. data/lib/mongo/operation/remove_user.rb +1 -1
  355. data/lib/mongo/operation/result.rb +1 -1
  356. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
  357. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
  358. data/lib/mongo/operation/shared/executable.rb +1 -1
  359. data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
  360. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  361. data/lib/mongo/operation/shared/idable.rb +1 -1
  362. data/lib/mongo/operation/shared/limited.rb +1 -1
  363. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  364. data/lib/mongo/operation/shared/op_msg_executable.rb +1 -1
  365. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  366. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  367. data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
  368. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  369. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  370. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  371. data/lib/mongo/operation/shared/sessions_supported.rb +1 -2
  372. data/lib/mongo/operation/shared/specifiable.rb +1 -1
  373. data/lib/mongo/operation/shared/validatable.rb +1 -1
  374. data/lib/mongo/operation/shared/write.rb +1 -1
  375. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
  376. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  377. data/lib/mongo/operation/update/op_msg.rb +1 -1
  378. data/lib/mongo/operation/update/result.rb +1 -1
  379. data/lib/mongo/operation/update.rb +1 -1
  380. data/lib/mongo/operation/update_user/op_msg.rb +1 -1
  381. data/lib/mongo/operation/update_user.rb +1 -1
  382. data/lib/mongo/operation/users_info/op_msg.rb +1 -1
  383. data/lib/mongo/operation/users_info/result.rb +1 -1
  384. data/lib/mongo/operation/users_info.rb +1 -1
  385. data/lib/mongo/operation/write_command/op_msg.rb +1 -1
  386. data/lib/mongo/operation/write_command.rb +1 -1
  387. data/lib/mongo/operation.rb +1 -1
  388. data/lib/mongo/options/mapper.rb +1 -1
  389. data/lib/mongo/options/redacted.rb +1 -1
  390. data/lib/mongo/options.rb +1 -1
  391. data/lib/mongo/protocol/bit_vector.rb +4 -2
  392. data/lib/mongo/protocol/caching_hash.rb +4 -21
  393. data/lib/mongo/protocol/compressed.rb +1 -1
  394. data/lib/mongo/protocol/get_more.rb +1 -1
  395. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  396. data/lib/mongo/protocol/message.rb +5 -9
  397. data/lib/mongo/protocol/msg.rb +2 -1
  398. data/lib/mongo/protocol/query.rb +1 -1
  399. data/lib/mongo/protocol/registry.rb +1 -1
  400. data/lib/mongo/protocol/reply.rb +1 -1
  401. data/lib/mongo/protocol/serializers.rb +25 -18
  402. data/lib/mongo/protocol.rb +1 -1
  403. data/lib/mongo/query_cache.rb +1 -1
  404. data/lib/mongo/retryable/base_worker.rb +91 -0
  405. data/lib/mongo/retryable/read_worker.rb +296 -0
  406. data/lib/mongo/retryable/write_worker.rb +364 -0
  407. data/lib/mongo/retryable.rb +31 -502
  408. data/lib/mongo/semaphore.rb +2 -2
  409. data/lib/mongo/server/app_metadata/environment.rb +259 -0
  410. data/lib/mongo/server/app_metadata/platform.rb +114 -0
  411. data/lib/mongo/server/app_metadata/truncator.rb +142 -0
  412. data/lib/mongo/server/app_metadata.rb +75 -108
  413. data/lib/mongo/server/connection.rb +61 -20
  414. data/lib/mongo/server/connection_base.rb +1 -1
  415. data/lib/mongo/server/connection_common.rb +1 -1
  416. data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
  417. data/lib/mongo/server/connection_pool/populator.rb +33 -31
  418. data/lib/mongo/server/connection_pool.rb +726 -265
  419. data/lib/mongo/server/description/features.rb +2 -2
  420. data/lib/mongo/server/description/load_balancer.rb +1 -1
  421. data/lib/mongo/server/description.rb +7 -6
  422. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  423. data/lib/mongo/server/monitor/connection.rb +1 -1
  424. data/lib/mongo/server/monitor.rb +11 -7
  425. data/lib/mongo/server/pending_connection.rb +1 -1
  426. data/lib/mongo/server/push_monitor/connection.rb +1 -1
  427. data/lib/mongo/server/push_monitor.rb +1 -1
  428. data/lib/mongo/server/round_trip_time_averager.rb +1 -1
  429. data/lib/mongo/server.rb +96 -30
  430. data/lib/mongo/server_selector/base.rb +24 -3
  431. data/lib/mongo/server_selector/nearest.rb +1 -1
  432. data/lib/mongo/server_selector/primary.rb +1 -1
  433. data/lib/mongo/server_selector/primary_preferred.rb +1 -1
  434. data/lib/mongo/server_selector/secondary.rb +1 -1
  435. data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
  436. data/lib/mongo/server_selector.rb +1 -1
  437. data/lib/mongo/session/server_session.rb +1 -1
  438. data/lib/mongo/session/session_pool.rb +1 -1
  439. data/lib/mongo/session.rb +1 -1
  440. data/lib/mongo/socket/ocsp_cache.rb +1 -1
  441. data/lib/mongo/socket/ocsp_verifier.rb +1 -1
  442. data/lib/mongo/socket/ssl.rb +1 -1
  443. data/lib/mongo/socket/tcp.rb +1 -1
  444. data/lib/mongo/socket/unix.rb +1 -1
  445. data/lib/mongo/socket.rb +29 -2
  446. data/lib/mongo/srv/monitor.rb +1 -3
  447. data/lib/mongo/srv/resolver.rb +1 -1
  448. data/lib/mongo/srv/result.rb +1 -1
  449. data/lib/mongo/srv.rb +1 -1
  450. data/lib/mongo/timeout.rb +2 -2
  451. data/lib/mongo/topology_version.rb +1 -1
  452. data/lib/mongo/uri/options_mapper.rb +322 -81
  453. data/lib/mongo/uri/srv_protocol.rb +1 -1
  454. data/lib/mongo/uri.rb +41 -13
  455. data/lib/mongo/utils.rb +1 -1
  456. data/lib/mongo/version.rb +2 -2
  457. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  458. data/lib/mongo/write_concern/base.rb +1 -1
  459. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  460. data/lib/mongo/write_concern.rb +1 -1
  461. data/lib/mongo.rb +2 -1
  462. data/mongo.gemspec +5 -2
  463. data/spec/atlas/atlas_connectivity_spec.rb +1 -1
  464. data/spec/atlas/operations_spec.rb +3 -8
  465. data/spec/integration/auth_spec.rb +1 -1
  466. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  467. data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
  468. data/spec/integration/aws_auth_request_spec.rb +2 -2
  469. data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
  470. data/spec/integration/aws_lambda_examples_spec.rb +1 -1
  471. data/spec/integration/bson_symbol_spec.rb +1 -1
  472. data/spec/integration/bulk_insert_spec.rb +1 -1
  473. data/spec/integration/bulk_write_error_message_spec.rb +1 -0
  474. data/spec/integration/bulk_write_spec.rb +1 -1
  475. data/spec/integration/change_stream_examples_spec.rb +1 -1
  476. data/spec/integration/change_stream_spec.rb +6 -1
  477. data/spec/integration/check_clean_slate_spec.rb +1 -1
  478. data/spec/integration/client_authentication_options_spec.rb +1 -1
  479. data/spec/integration/client_connectivity_spec.rb +1 -1
  480. data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
  481. data/spec/integration/client_construction_spec.rb +23 -1
  482. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  483. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  484. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +1 -1
  485. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
  486. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +10 -5
  487. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +38 -2
  488. data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
  489. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  490. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +1 -1
  491. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  492. data/spec/integration/client_side_encryption/corpus_spec.rb +1 -1
  493. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -3
  494. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  495. data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +59 -58
  496. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +1 -1
  497. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +36 -33
  498. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +1 -1
  499. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +3 -3
  500. data/spec/integration/client_side_encryption/kms_tls_spec.rb +1 -1
  501. data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
  502. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
  503. data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
  504. data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
  505. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +14 -11
  506. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +536 -0
  507. data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
  508. data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +20 -16
  509. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  510. data/spec/integration/client_spec.rb +8 -3
  511. data/spec/integration/client_update_spec.rb +7 -3
  512. data/spec/integration/collection_indexes_prose_spec.rb +1 -1
  513. data/spec/integration/command_monitoring_spec.rb +1 -1
  514. data/spec/integration/command_spec.rb +1 -1
  515. data/spec/integration/connect_single_rs_name_spec.rb +1 -1
  516. data/spec/integration/connection/faas_env_spec.rb +62 -0
  517. data/spec/integration/connection_pool_populator_spec.rb +27 -7
  518. data/spec/integration/connection_spec.rb +1 -1
  519. data/spec/integration/crud_spec.rb +1 -1
  520. data/spec/integration/cursor_pinning_spec.rb +6 -2
  521. data/spec/integration/cursor_reaping_spec.rb +1 -1
  522. data/spec/integration/docs_examples_spec.rb +2 -2
  523. data/spec/integration/error_detection_spec.rb +1 -1
  524. data/spec/integration/fork_reconnect_spec.rb +2 -2
  525. data/spec/integration/get_more_spec.rb +1 -1
  526. data/spec/integration/grid_fs_bucket_spec.rb +1 -1
  527. data/spec/integration/heartbeat_events_spec.rb +1 -1
  528. data/spec/integration/map_reduce_spec.rb +5 -1
  529. data/spec/integration/mmapv1_spec.rb +1 -1
  530. data/spec/integration/mongos_pinning_spec.rb +1 -1
  531. data/spec/integration/ocsp_connectivity_spec.rb +1 -1
  532. data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
  533. data/spec/integration/ocsp_verifier_spec.rb +2 -2
  534. data/spec/integration/operation_failure_code_spec.rb +1 -1
  535. data/spec/integration/operation_failure_message_spec.rb +1 -0
  536. data/spec/integration/query_cache_spec.rb +90 -3
  537. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  538. data/spec/integration/read_concern_spec.rb +1 -1
  539. data/spec/integration/read_preference_spec.rb +1 -1
  540. data/spec/integration/reconnect_spec.rb +4 -1
  541. data/spec/integration/retryable_errors_spec.rb +1 -1
  542. data/spec/integration/retryable_reads_errors_spec.rb +110 -0
  543. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  544. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  545. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
  546. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
  547. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
  548. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
  549. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
  550. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
  551. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
  552. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
  553. data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
  554. data/spec/integration/retryable_writes_errors_spec.rb +160 -2
  555. data/spec/integration/sdam_error_handling_spec.rb +65 -4
  556. data/spec/integration/sdam_events_spec.rb +1 -1
  557. data/spec/integration/sdam_prose_spec.rb +3 -3
  558. data/spec/integration/secondary_reads_spec.rb +1 -0
  559. data/spec/integration/server_description_spec.rb +1 -1
  560. data/spec/integration/server_monitor_spec.rb +1 -1
  561. data/spec/integration/server_selection_spec.rb +1 -1
  562. data/spec/integration/server_selector_spec.rb +5 -3
  563. data/spec/integration/server_spec.rb +23 -26
  564. data/spec/integration/shell_examples_spec.rb +1 -1
  565. data/spec/integration/size_limit_spec.rb +1 -1
  566. data/spec/integration/snappy_compression_spec.rb +1 -1
  567. data/spec/integration/snapshot_query_examples_spec.rb +9 -7
  568. data/spec/integration/srv_monitoring_spec.rb +2 -1
  569. data/spec/integration/srv_spec.rb +3 -3
  570. data/spec/integration/ssl_uri_options_spec.rb +1 -1
  571. data/spec/integration/step_down_spec.rb +5 -3
  572. data/spec/integration/time_zone_querying_spec.rb +1 -1
  573. data/spec/integration/transaction_pinning_spec.rb +18 -4
  574. data/spec/integration/transactions_api_examples_spec.rb +1 -1
  575. data/spec/integration/transactions_examples_spec.rb +1 -1
  576. data/spec/integration/truncated_utf8_spec.rb +1 -1
  577. data/spec/integration/versioned_api_examples_spec.rb +2 -2
  578. data/spec/integration/x509_auth_spec.rb +1 -1
  579. data/spec/integration/zlib_compression_spec.rb +1 -1
  580. data/spec/integration/zstd_compression_spec.rb +1 -1
  581. data/spec/kerberos/kerberos_spec.rb +1 -1
  582. data/spec/lite_spec_helper.rb +15 -2
  583. data/spec/mongo/address/ipv4_spec.rb +1 -1
  584. data/spec/mongo/address/ipv6_spec.rb +1 -1
  585. data/spec/mongo/address/unix_spec.rb +1 -1
  586. data/spec/mongo/address/validator_spec.rb +1 -1
  587. data/spec/mongo/address_spec.rb +8 -2
  588. data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
  589. data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
  590. data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
  591. data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
  592. data/spec/mongo/auth/aws/request_spec.rb +1 -1
  593. data/spec/mongo/auth/cr_spec.rb +2 -22
  594. data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
  595. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  596. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  597. data/spec/mongo/auth/ldap_spec.rb +1 -1
  598. data/spec/mongo/auth/scram/conversation_spec.rb +1 -1
  599. data/spec/mongo/auth/scram256/conversation_spec.rb +1 -1
  600. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  601. data/spec/mongo/auth/scram_spec.rb +1 -1
  602. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
  603. data/spec/mongo/auth/stringprep_spec.rb +1 -1
  604. data/spec/mongo/auth/user/view_spec.rb +96 -1
  605. data/spec/mongo/auth/user_spec.rb +1 -1
  606. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  607. data/spec/mongo/auth/x509_spec.rb +1 -1
  608. data/spec/mongo/auth_spec.rb +1 -1
  609. data/spec/mongo/bson_spec.rb +1 -1
  610. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
  611. data/spec/mongo/bulk_write/result_spec.rb +1 -1
  612. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
  613. data/spec/mongo/bulk_write_spec.rb +1 -1
  614. data/spec/mongo/caching_cursor_spec.rb +1 -1
  615. data/spec/mongo/client_construction_spec.rb +619 -693
  616. data/spec/mongo/client_encryption_spec.rb +1 -1
  617. data/spec/mongo/client_spec.rb +172 -231
  618. data/spec/mongo/cluster/cursor_reaper_spec.rb +1 -1
  619. data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
  620. data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
  621. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  622. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  623. data/spec/mongo/cluster/topology/single_spec.rb +1 -1
  624. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  625. data/spec/mongo/cluster/topology_spec.rb +1 -1
  626. data/spec/mongo/cluster_spec.rb +156 -154
  627. data/spec/mongo/cluster_time_spec.rb +1 -1
  628. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  629. data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
  630. data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
  631. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  632. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  633. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  634. data/spec/mongo/collection/view/immutable_spec.rb +1 -1
  635. data/spec/mongo/collection/view/iterable_spec.rb +1 -1
  636. data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
  637. data/spec/mongo/collection/view/readable_spec.rb +139 -1
  638. data/spec/mongo/collection/view/writable_spec.rb +1 -1
  639. data/spec/mongo/collection/view_spec.rb +1 -1
  640. data/spec/mongo/collection_crud_spec.rb +1 -1
  641. data/spec/mongo/collection_ddl_spec.rb +116 -66
  642. data/spec/mongo/collection_spec.rb +11 -7
  643. data/spec/mongo/condition_variable_spec.rb +104 -0
  644. data/spec/mongo/config/options_spec.rb +1 -0
  645. data/spec/mongo/config_spec.rb +2 -1
  646. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  647. data/spec/mongo/crypt/auto_encrypter_spec.rb +8 -1
  648. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  649. data/spec/mongo/crypt/binary_spec.rb +1 -1
  650. data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
  651. data/spec/mongo/crypt/binding/context_spec.rb +1 -1
  652. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
  653. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +1 -1
  654. data/spec/mongo/crypt/binding/status_spec.rb +1 -1
  655. data/spec/mongo/crypt/binding/version_spec.rb +19 -5
  656. data/spec/mongo/crypt/binding_unloaded_spec.rb +1 -1
  657. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  658. data/spec/mongo/crypt/encryption_io_spec.rb +1 -1
  659. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  660. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -3
  661. data/spec/mongo/crypt/handle_spec.rb +19 -4
  662. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
  663. data/spec/mongo/crypt/hooks_spec.rb +2 -2
  664. data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
  665. data/spec/mongo/crypt/kms/credentials_spec.rb +17 -1
  666. data/spec/mongo/crypt/kms_spec.rb +1 -1
  667. data/spec/mongo/crypt/status_spec.rb +1 -1
  668. data/spec/mongo/crypt_spec.rb +21 -0
  669. data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
  670. data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
  671. data/spec/mongo/cursor_spec.rb +58 -11
  672. data/spec/mongo/database_spec.rb +1 -1
  673. data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
  674. data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
  675. data/spec/mongo/error/crypt_error_spec.rb +1 -1
  676. data/spec/mongo/error/max_bson_size_spec.rb +1 -1
  677. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  678. data/spec/mongo/error/notable_spec.rb +1 -1
  679. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  680. data/spec/mongo/error/operation_failure_spec.rb +1 -1
  681. data/spec/mongo/error/parser_spec.rb +1 -1
  682. data/spec/mongo/error/unsupported_option_spec.rb +1 -1
  683. data/spec/mongo/event/publisher_spec.rb +1 -1
  684. data/spec/mongo/event/subscriber_spec.rb +1 -1
  685. data/spec/mongo/grid/file/chunk_spec.rb +1 -1
  686. data/spec/mongo/grid/file/info_spec.rb +1 -1
  687. data/spec/mongo/grid/file_spec.rb +1 -1
  688. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  689. data/spec/mongo/grid/stream/read_spec.rb +1 -1
  690. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  691. data/spec/mongo/grid/stream_spec.rb +1 -1
  692. data/spec/mongo/id_spec.rb +2 -2
  693. data/spec/mongo/index/view_spec.rb +4 -4
  694. data/spec/mongo/lint_spec.rb +2 -2
  695. data/spec/mongo/logger_spec.rb +1 -1
  696. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
  697. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
  698. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
  699. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
  700. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
  701. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
  702. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
  703. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
  704. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
  705. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
  706. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
  707. data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
  708. data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
  709. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
  710. data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
  711. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  712. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
  713. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  714. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +1 -1
  715. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  716. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  717. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  718. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  719. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  720. data/spec/mongo/monitoring_spec.rb +1 -1
  721. data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
  722. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  723. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  724. data/spec/mongo/operation/command_spec.rb +1 -1
  725. data/spec/mongo/operation/create/op_msg_spec.rb +1 -1
  726. data/spec/mongo/operation/create_index_spec.rb +1 -1
  727. data/spec/mongo/operation/create_user_spec.rb +1 -1
  728. data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
  729. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  730. data/spec/mongo/operation/delete_spec.rb +1 -1
  731. data/spec/mongo/operation/drop_index_spec.rb +1 -1
  732. data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
  733. data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
  734. data/spec/mongo/operation/indexes_spec.rb +1 -1
  735. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  736. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  737. data/spec/mongo/operation/insert_spec.rb +1 -1
  738. data/spec/mongo/operation/limited_spec.rb +1 -1
  739. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  740. data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
  741. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  742. data/spec/mongo/operation/remove_user_spec.rb +1 -1
  743. data/spec/mongo/operation/result_spec.rb +1 -1
  744. data/spec/mongo/operation/specifiable_spec.rb +1 -1
  745. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  746. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  747. data/spec/mongo/operation/update_spec.rb +1 -1
  748. data/spec/mongo/operation/update_user_spec.rb +1 -1
  749. data/spec/mongo/options/redacted_spec.rb +2 -2
  750. data/spec/mongo/protocol/caching_hash_spec.rb +1 -46
  751. data/spec/mongo/protocol/compressed_spec.rb +1 -1
  752. data/spec/mongo/protocol/get_more_spec.rb +1 -1
  753. data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
  754. data/spec/mongo/protocol/msg_spec.rb +4 -66
  755. data/spec/mongo/protocol/query_spec.rb +1 -1
  756. data/spec/mongo/protocol/registry_spec.rb +1 -1
  757. data/spec/mongo/protocol/reply_spec.rb +1 -1
  758. data/spec/mongo/query_cache_middleware_spec.rb +1 -1
  759. data/spec/mongo/query_cache_spec.rb +1 -1
  760. data/spec/mongo/retryable_spec.rb +5 -3
  761. data/spec/mongo/semaphore_spec.rb +7 -7
  762. data/spec/mongo/server/app_metadata/environment_spec.rb +209 -0
  763. data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
  764. data/spec/mongo/server/app_metadata_spec.rb +44 -66
  765. data/spec/mongo/server/connection_auth_spec.rb +1 -1
  766. data/spec/mongo/server/connection_common_spec.rb +1 -1
  767. data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
  768. data/spec/mongo/server/connection_pool_spec.rb +447 -10
  769. data/spec/mongo/server/connection_spec.rb +17 -4
  770. data/spec/mongo/server/description/features_spec.rb +1 -1
  771. data/spec/mongo/server/description_query_methods_spec.rb +1 -1
  772. data/spec/mongo/server/description_spec.rb +1 -1
  773. data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
  774. data/spec/mongo/server/monitor/connection_spec.rb +3 -3
  775. data/spec/mongo/server/monitor_spec.rb +6 -5
  776. data/spec/mongo/server/push_monitor_spec.rb +1 -1
  777. data/spec/mongo/server/round_trip_time_averager_spec.rb +1 -1
  778. data/spec/mongo/server_selector/nearest_spec.rb +1 -1
  779. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
  780. data/spec/mongo/server_selector/primary_spec.rb +1 -1
  781. data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
  782. data/spec/mongo/server_selector/secondary_spec.rb +1 -1
  783. data/spec/mongo/server_selector_spec.rb +1 -1
  784. data/spec/mongo/server_spec.rb +32 -5
  785. data/spec/mongo/session/server_session_spec.rb +1 -1
  786. data/spec/mongo/session/session_pool_spec.rb +1 -1
  787. data/spec/mongo/session_spec.rb +1 -1
  788. data/spec/mongo/session_transaction_spec.rb +2 -2
  789. data/spec/mongo/socket/ssl_spec.rb +3 -9
  790. data/spec/mongo/socket/tcp_spec.rb +1 -1
  791. data/spec/mongo/socket/unix_spec.rb +1 -1
  792. data/spec/mongo/socket_spec.rb +1 -1
  793. data/spec/mongo/srv/monitor_spec.rb +1 -1
  794. data/spec/mongo/srv/result_spec.rb +1 -1
  795. data/spec/mongo/timeout_spec.rb +1 -1
  796. data/spec/mongo/tls_context_hooks_spec.rb +1 -1
  797. data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
  798. data/spec/mongo/uri/srv_protocol_spec.rb +162 -2
  799. data/spec/mongo/uri_option_parsing_spec.rb +1 -1
  800. data/spec/mongo/uri_spec.rb +143 -2
  801. data/spec/mongo/utils_spec.rb +1 -1
  802. data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
  803. data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
  804. data/spec/mongo/write_concern_spec.rb +1 -1
  805. data/spec/runners/auth.rb +1 -1
  806. data/spec/runners/change_streams/outcome.rb +1 -1
  807. data/spec/runners/change_streams/spec.rb +1 -1
  808. data/spec/runners/change_streams/test.rb +1 -1
  809. data/spec/runners/cmap/verifier.rb +2 -2
  810. data/spec/runners/cmap.rb +188 -45
  811. data/spec/runners/command_monitoring.rb +1 -1
  812. data/spec/runners/connection_string.rb +1 -1
  813. data/spec/runners/crud/context.rb +1 -1
  814. data/spec/runners/crud/operation.rb +2 -2
  815. data/spec/runners/crud/outcome.rb +1 -1
  816. data/spec/runners/crud/requirement.rb +3 -3
  817. data/spec/runners/crud/spec.rb +2 -2
  818. data/spec/runners/crud/test.rb +1 -1
  819. data/spec/runners/crud/test_base.rb +2 -2
  820. data/spec/runners/crud/verifier.rb +3 -3
  821. data/spec/runners/crud.rb +1 -1
  822. data/spec/runners/gridfs.rb +1 -1
  823. data/spec/runners/read_write_concern_document.rb +1 -1
  824. data/spec/runners/sdam/verifier.rb +1 -1
  825. data/spec/runners/sdam.rb +1 -1
  826. data/spec/runners/server_selection.rb +1 -1
  827. data/spec/runners/server_selection_rtt.rb +1 -1
  828. data/spec/runners/transactions/operation.rb +15 -9
  829. data/spec/runners/transactions/spec.rb +1 -1
  830. data/spec/runners/transactions/test.rb +44 -3
  831. data/spec/runners/transactions.rb +1 -1
  832. data/spec/runners/unified/assertions.rb +94 -77
  833. data/spec/runners/unified/change_stream_operations.rb +14 -3
  834. data/spec/runners/unified/client_side_encryption_operations.rb +1 -1
  835. data/spec/runners/unified/crud_operations.rb +11 -2
  836. data/spec/runners/unified/ddl_operations.rb +80 -4
  837. data/spec/runners/unified/entity_map.rb +1 -1
  838. data/spec/runners/unified/error.rb +1 -1
  839. data/spec/runners/unified/event_subscriber.rb +9 -3
  840. data/spec/runners/unified/exceptions.rb +1 -1
  841. data/spec/runners/unified/grid_fs_operations.rb +1 -1
  842. data/spec/runners/unified/support_operations.rb +66 -2
  843. data/spec/runners/unified/test.rb +98 -24
  844. data/spec/runners/unified/test_group.rb +1 -1
  845. data/spec/runners/unified/thread_operations.rb +73 -0
  846. data/spec/runners/unified.rb +9 -6
  847. data/spec/shared/lib/mrss/docker_runner.rb +4 -0
  848. data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
  849. data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
  850. data/spec/shared/lib/mrss/utils.rb +28 -6
  851. data/spec/shared/share/Dockerfile.erb +24 -19
  852. data/spec/shared/shlib/server.sh +32 -8
  853. data/spec/shared/shlib/set_env.sh +4 -4
  854. data/spec/solo/clean_exit_spec.rb +4 -11
  855. data/spec/spec_helper.rb +1 -1
  856. data/spec/spec_tests/auth_spec.rb +1 -1
  857. data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
  858. data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
  859. data/spec/spec_tests/client_side_encryption_unified_spec.rb +12 -2
  860. data/spec/spec_tests/cmap_spec.rb +29 -15
  861. data/spec/spec_tests/collection_management_spec.rb +1 -1
  862. data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
  863. data/spec/spec_tests/connection_string_spec.rb +1 -1
  864. data/spec/spec_tests/crud_spec.rb +1 -1
  865. data/spec/spec_tests/crud_unified_spec.rb +1 -1
  866. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +41 -0
  867. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
  868. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +2 -6
  869. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  870. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -3
  871. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -3
  872. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +15 -6
  873. data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
  874. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
  875. data/spec/spec_tests/data/client_side_encryption/{fle2-BypassQueryAnalysis.yml → fle2v2-BypassQueryAnalysis.yml} +18 -30
  876. data/spec/spec_tests/data/client_side_encryption/{fle2-Compact.yml → fle2v2-Compact.yml} +5 -3
  877. data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
  878. data/spec/spec_tests/data/client_side_encryption/{fle2-CreateCollection.yml → fle2v2-CreateCollection.yml} +212 -538
  879. data/spec/spec_tests/data/client_side_encryption/{fle2-DecryptExistingData.yml → fle2v2-DecryptExistingData.yml} +4 -2
  880. data/spec/spec_tests/data/client_side_encryption/{fle2-Delete.yml → fle2v2-Delete.yml} +17 -24
  881. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-EncryptedFieldsMap.yml → fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml} +5 -6
  882. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFields-vs-jsonSchema.yml → fle2v2-EncryptedFields-vs-jsonSchema.yml} +18 -6
  883. data/spec/spec_tests/data/client_side_encryption/{fle2-EncryptedFieldsMap-defaults.yml → fle2v2-EncryptedFieldsMap-defaults.yml} +6 -5
  884. data/spec/spec_tests/data/client_side_encryption/{fle2-FindOneAndUpdate.yml → fle2v2-FindOneAndUpdate.yml} +31 -44
  885. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Indexed.yml → fle2v2-InsertFind-Indexed.yml} +16 -6
  886. data/spec/spec_tests/data/client_side_encryption/{fle2-InsertFind-Unindexed.yml → fle2v2-InsertFind-Unindexed.yml} +10 -4
  887. data/spec/spec_tests/data/client_side_encryption/{fle2-MissingKey.yml → fle2v2-MissingKey.yml} +5 -3
  888. data/spec/spec_tests/data/client_side_encryption/{fle2-NoEncryption.yml → fle2v2-NoEncryption.yml} +4 -2
  889. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
  890. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
  891. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
  892. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
  893. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
  894. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
  895. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
  896. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
  897. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
  898. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
  899. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
  900. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
  901. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
  902. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
  903. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
  904. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
  905. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
  906. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
  907. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
  908. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
  909. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
  910. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
  911. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
  912. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
  913. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
  914. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
  915. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
  916. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
  917. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
  918. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
  919. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
  920. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
  921. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
  922. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
  923. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
  924. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
  925. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
  926. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
  927. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
  928. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
  929. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
  930. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
  931. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
  932. data/spec/spec_tests/data/client_side_encryption/{fle2-Update.yml → fle2v2-Update.yml} +33 -44
  933. data/spec/spec_tests/data/client_side_encryption/{fle2-validatorAndPartialFieldExpression.yml → fle2v2-validatorAndPartialFieldExpression.yml} +10 -9
  934. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +1 -1
  935. data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +1 -1
  936. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
  937. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
  938. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
  939. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
  940. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
  941. data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
  942. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
  943. data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
  944. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
  945. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
  946. data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
  947. data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
  948. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
  949. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
  950. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
  951. data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
  952. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +49 -0
  953. data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
  954. data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
  955. data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
  956. data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
  957. data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
  958. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  959. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
  960. data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
  961. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
  962. data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
  963. data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
  964. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
  965. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
  966. data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
  967. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
  968. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
  969. data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
  970. data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
  971. data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
  972. data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
  973. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +44 -0
  974. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
  975. data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
  976. data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
  977. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1266 -53
  978. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +1 -1
  979. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +706 -58
  980. data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
  981. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +1 -1
  982. data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
  983. data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
  984. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
  985. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
  986. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
  987. data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
  988. data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
  989. data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
  990. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
  991. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
  992. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
  993. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
  994. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  995. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
  996. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
  997. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
  998. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
  999. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  1000. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  1001. data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
  1002. data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
  1003. data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
  1004. data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
  1005. data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
  1006. data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
  1007. data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
  1008. data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
  1009. data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
  1010. data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
  1011. data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
  1012. data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
  1013. data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
  1014. data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
  1015. data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
  1016. data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
  1017. data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
  1018. data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
  1019. data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
  1020. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
  1021. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
  1022. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
  1023. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +1 -1
  1024. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +4 -3
  1025. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +4 -3
  1026. data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
  1027. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
  1028. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
  1029. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
  1030. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
  1031. data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
  1032. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
  1033. data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
  1034. data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
  1035. data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
  1036. data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
  1037. data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
  1038. data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
  1039. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
  1040. data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
  1041. data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
  1042. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +18 -0
  1043. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +18 -12
  1044. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
  1045. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +2 -2
  1046. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +1 -1
  1047. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +1 -1
  1048. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
  1049. data/spec/spec_tests/gridfs_spec.rb +1 -1
  1050. data/spec/spec_tests/gridfs_unified_spec.rb +1 -1
  1051. data/spec/spec_tests/load_balancers_spec.rb +1 -1
  1052. data/spec/spec_tests/max_staleness_spec.rb +1 -1
  1053. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  1054. data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
  1055. data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
  1056. data/spec/spec_tests/retryable_reads_spec.rb +3 -1
  1057. data/spec/spec_tests/retryable_reads_unified_spec.rb +1 -1
  1058. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  1059. data/spec/spec_tests/retryable_writes_unified_spec.rb +1 -1
  1060. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
  1061. data/spec/spec_tests/sdam_spec.rb +5 -1
  1062. data/spec/spec_tests/sdam_unified_spec.rb +13 -0
  1063. data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
  1064. data/spec/spec_tests/server_selection_rtt_spec.rb +1 -1
  1065. data/spec/spec_tests/server_selection_spec.rb +1 -1
  1066. data/spec/spec_tests/sessions_unified_spec.rb +1 -1
  1067. data/spec/spec_tests/transactions_api_spec.rb +1 -1
  1068. data/spec/spec_tests/transactions_spec.rb +1 -1
  1069. data/spec/spec_tests/transactions_unified_spec.rb +1 -1
  1070. data/spec/spec_tests/unified_spec.rb +1 -6
  1071. data/spec/spec_tests/uri_options_spec.rb +1 -1
  1072. data/spec/spec_tests/versioned_api_spec.rb +1 -1
  1073. data/spec/stress/cleanup_spec.rb +1 -1
  1074. data/spec/stress/connection_pool_stress_spec.rb +1 -62
  1075. data/spec/stress/connection_pool_timing_spec.rb +9 -34
  1076. data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
  1077. data/spec/stress/push_monitor_close_spec.rb +1 -1
  1078. data/spec/support/authorization.rb +1 -1
  1079. data/spec/support/aws_utils/base.rb +1 -1
  1080. data/spec/support/aws_utils/inspector.rb +1 -1
  1081. data/spec/support/aws_utils/orchestrator.rb +20 -8
  1082. data/spec/support/aws_utils/provisioner.rb +1 -1
  1083. data/spec/support/aws_utils.rb +4 -3
  1084. data/spec/support/background_thread_registry.rb +1 -1
  1085. data/spec/support/certificates/atlas-ocsp-ca.crt +67 -67
  1086. data/spec/support/certificates/atlas-ocsp.crt +103 -103
  1087. data/spec/support/certificates/retrieve-atlas-cert +2 -0
  1088. data/spec/support/client_registry.rb +6 -2
  1089. data/spec/support/client_registry_macros.rb +1 -1
  1090. data/spec/support/cluster_tools.rb +13 -8
  1091. data/spec/support/common_shortcuts.rb +30 -5
  1092. data/spec/support/constraints.rb +15 -1
  1093. data/spec/support/crypt/{encryptedFields.json → encrypted_fields/encryptedFields.json} +0 -1
  1094. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
  1095. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
  1096. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
  1097. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
  1098. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
  1099. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
  1100. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
  1101. data/spec/support/crypt.rb +13 -3
  1102. data/spec/support/dns.rb +1 -1
  1103. data/spec/support/json_ext_formatter.rb +1 -1
  1104. data/spec/support/keyword_struct.rb +1 -1
  1105. data/spec/support/local_resource_registry.rb +1 -1
  1106. data/spec/support/macros.rb +1 -0
  1107. data/spec/support/matchers.rb +5 -5
  1108. data/spec/support/mongos_macros.rb +7 -0
  1109. data/spec/support/monitoring_ext.rb +1 -1
  1110. data/spec/support/primary_socket.rb +1 -1
  1111. data/spec/support/sdam_formatter_integration.rb +1 -1
  1112. data/spec/support/shared/app_metadata.rb +15 -3
  1113. data/spec/support/shared/auth_context.rb +1 -0
  1114. data/spec/support/shared/protocol.rb +1 -1
  1115. data/spec/support/shared/scram_conversation.rb +1 -1
  1116. data/spec/support/shared/server_selector.rb +1 -1
  1117. data/spec/support/shared/session.rb +1 -1
  1118. data/spec/support/spec_config.rb +40 -3
  1119. data/spec/support/spec_setup.rb +1 -1
  1120. data/spec/support/using_hash.rb +11 -2
  1121. data/spec/support/utils.rb +277 -249
  1122. data.tar.gz.sig +0 -0
  1123. metadata +1459 -1173
  1124. metadata.gz.sig +0 -0
  1125. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
  1126. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
  1127. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
  1128. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
  1129. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -152
  1130. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -148
  1131. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -219
  1132. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
  1133. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
  1134. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
  1135. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +0 -15
  1136. data/spec/spec_tests/sdam_integration_spec.rb +0 -16
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # encoding: utf-8
2
+ # rubocop:todo all
3
3
 
4
4
  # Copyright (C) 2015-2020 MongoDB Inc.
5
5
  #
@@ -15,530 +15,59 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
+ require 'mongo/retryable/read_worker'
19
+ require 'mongo/retryable/write_worker'
20
+
18
21
  module Mongo
19
22
 
20
23
  # Defines basic behavior around retrying operations.
21
24
  #
22
25
  # @since 2.1.0
23
26
  module Retryable
27
+ extend Forwardable
24
28
 
25
- # Execute a read operation returning a cursor with retrying.
26
- #
27
- # This method performs server selection for the specified server selector
28
- # and yields to the provided block, which should execute the initial
29
- # query operation and return its result. The block will be passed the
30
- # server selected for the operation. If the block raises an exception,
31
- # and this exception corresponds to a read retryable error, and read
32
- # retries are enabled for the client, this method will perform server
33
- # selection again and yield to the block again (with potentially a
34
- # different server). If the block returns successfully, the result
35
- # of the block (which should be a Mongo::Operation::Result) is used to
36
- # construct a Mongo::Cursor object for the result set. The cursor
37
- # is then returned.
38
- #
39
- # If modern retry reads are on (which is the default), the initial read
40
- # operation will be retried once. If legacy retry reads are on, the
41
- # initial read operation will be retried zero or more times depending
42
- # on the :max_read_retries client setting, the default for which is 1.
43
- # To disable read retries, turn off modern read retries by setting
44
- # retry_reads: false and set :max_read_retries to 0 on the client.
45
- #
46
- # @api private
47
- #
48
- # @example Execute a read returning a cursor.
49
- # cursor = read_with_retry_cursor(session, server_selector, view) do |server|
50
- # # return a Mongo::Operation::Result
51
- # ...
52
- # end
53
- #
54
- # @param [ Mongo::Session ] session The session that the operation is being
55
- # run on.
56
- # @param [ Mongo::ServerSelector::Selectable ] server_selector Server
57
- # selector for the operation.
58
- # @param [ CollectionView ] view The +CollectionView+ defining the query.
59
- # @param [ Proc ] block The block to execute.
60
- #
61
- # @return [ Cursor ] The cursor for the result set.
62
- def read_with_retry_cursor(session, server_selector, view, &block)
63
- read_with_retry(session, server_selector) do |server|
64
- result = yield server
29
+ # Delegate the public read_with_retry methods to the read_worker
30
+ def_delegators :read_worker,
31
+ :read_with_retry_cursor,
32
+ :read_with_retry,
33
+ :read_with_one_retry
65
34
 
66
- # RUBY-2367: This will be updated to allow the query cache to
67
- # cache cursors with multi-batch results.
68
- if QueryCache.enabled? && !view.collection.system_collection?
69
- CachingCursor.new(view, result, server, session: session)
70
- else
71
- Cursor.new(view, result, server, session: session)
72
- end
73
- end
74
- end
35
+ # Delegate the public write_with_retry methods to the write_worker
36
+ def_delegators :write_worker,
37
+ :write_with_retry,
38
+ :nro_write_with_retry
75
39
 
76
- # Execute a read operation with retrying.
77
- #
78
- # This method performs server selection for the specified server selector
79
- # and yields to the provided block, which should execute the initial
80
- # query operation and return its result. The block will be passed the
81
- # server selected for the operation. If the block raises an exception,
82
- # and this exception corresponds to a read retryable error, and read
83
- # retries are enabled for the client, this method will perform server
84
- # selection again and yield to the block again (with potentially a
85
- # different server). If the block returns successfully, the result
86
- # of the block is returned.
87
- #
88
- # If modern retry reads are on (which is the default), the initial read
89
- # operation will be retried once. If legacy retry reads are on, the
90
- # initial read operation will be retried zero or more times depending
91
- # on the :max_read_retries client setting, the default for which is 1.
92
- # To disable read retries, turn off modern read retries by setting
93
- # retry_reads: false and set :max_read_retries to 0 on the client.
94
- #
95
- # @api private
96
- #
97
- # @example Execute the read.
98
- # read_with_retry(session, server_selector) do |server|
99
- # ...
100
- # end
101
- #
102
- # @param [ Mongo::Session ] session The session that the operation is being
103
- # run on.
104
- # @param [ Mongo::ServerSelector::Selectable ] server_selector Server
105
- # selector for the operation.
106
- # @param [ Proc ] block The block to execute.
107
- #
108
- # @return [ Result ] The result of the operation.
109
- def read_with_retry(session = nil, server_selector = nil, &block)
110
- if session.nil? && server_selector.nil?
111
- # Older versions of Mongoid call read_with_retry without arguments.
112
- # This is already not correct in a MongoDB 3.6+ environment with
113
- # sessions. For compatibility we emulate the legacy driver behavior
114
- # here but upgrading Mongoid is strongly recommended.
115
- unless $_mongo_read_with_retry_warned
116
- $_mongo_read_with_retry_warned = true
117
- Logger.logger.warn("Legacy read_with_retry invocation - please update the application and/or its dependencies")
118
- end
119
- # Since we don't have a session, we cannot use the modern read retries.
120
- # And we need to select a server but we don't have a server selector.
121
- # Use PrimaryPreferred which will work as long as there is a data
122
- # bearing node in the cluster; the block may select a different server
123
- # which is fine.
124
- server_selector = ServerSelector.get(mode: :primary_preferred)
125
- legacy_read_with_retry(nil, server_selector, &block)
126
- elsif session && session.retry_reads?
127
- modern_read_with_retry(session, server_selector, &block)
128
- elsif client.max_read_retries > 0
129
- legacy_read_with_retry(session, server_selector, &block)
130
- else
131
- server = select_server(cluster, server_selector, session)
132
- begin
133
- yield server
134
- rescue Error::SocketError, Error::SocketTimeoutError, Error::OperationFailure => e
135
- e.add_note('retries disabled')
136
- raise e
137
- end
138
- end
139
- end
140
-
141
- # Execute a read operation with a single retry on network errors.
40
+ # This is a separate method to make it possible for the test suite to
41
+ # assert that server selection is performed during retry attempts.
142
42
  #
143
- # This method is used by the driver for some of the internal housekeeping
144
- # operations. Application-requested reads should use read_with_retry
145
- # rather than this method.
43
+ # This is a public method so that it can be accessed via the read and
44
+ # write worker delegates, as needed.
146
45
  #
147
46
  # @api private
148
47
  #
149
- # @example Execute the read.
150
- # read_with_one_retry do
151
- # ...
152
- # end
153
- #
154
- # @note This only retries read operations on socket errors.
155
- #
156
- # @param [ Hash ] options Options.
157
- # @yield Calls the provided block with no arguments
158
- #
159
- # @option options [ String ] :retry_message Message to log when retrying.
160
- #
161
- # @return [ Result ] The result of the operation.
162
- #
163
- # @since 2.2.6
164
- def read_with_one_retry(options = nil)
165
- yield
166
- rescue Error::SocketError, Error::SocketTimeoutError => e
167
- retry_message = options && options[:retry_message]
168
- log_retry(e, message: retry_message)
169
- yield
48
+ # @return [ Mongo::Server ] A server matching the server preference.
49
+ def select_server(cluster, server_selector, session)
50
+ server_selector.select_server(cluster, nil, session)
170
51
  end
171
52
 
172
- # Implements write retrying functionality by yielding to the passed
173
- # block one or more times.
174
- #
175
- # If the session is provided (hence, the deployment supports sessions),
176
- # and modern retry writes are enabled on the client, the modern retry
177
- # logic is invoked. Otherwise the legacy retry logic is invoked.
178
- #
179
- # If ending_transaction parameter is true, indicating that a transaction
180
- # is being committed or aborted, the operation is executed exactly once.
181
- # Note that, since transactions require sessions, this method will raise
182
- # ArgumentError if ending_transaction is true and session is nil.
53
+ # Returns the read worker for handling retryable reads.
183
54
  #
184
55
  # @api private
185
56
  #
186
- # @example Execute the write.
187
- # write_with_retry do
188
- # ...
189
- # end
190
- #
191
- # @note This only retries operations on not master failures, since it is
192
- # the only case we can be sure a partial write did not already occur.
193
- #
194
- # @param [ nil | Hash | WriteConcern::Base ] write_concern The write concern.
195
- # @param [ true | false ] ending_transaction True if the write operation is
196
- # abortTransaction or commitTransaction, false otherwise.
197
- # @param [ Context ] context The context for the operation.
198
- # @param [ Proc ] block The block to execute.
199
- #
200
- # @yieldparam [ Connection ] connection The connection through which the
201
- # write should be sent.
202
- # @yieldparam [ Integer ] txn_num Transaction number (NOT the ACID kind).
203
- # @yieldparam [ Operation::Context ] context The operation context.
204
- #
205
- # @return [ Result ] The result of the operation.
206
- #
207
- # @since 2.1.0
208
- def write_with_retry(write_concern, ending_transaction: false, context:, &block)
209
- session = context.session
210
-
211
- if ending_transaction && !session
212
- raise ArgumentError, 'Cannot end a transaction without a session'
213
- end
214
-
215
- unless ending_transaction || retry_write_allowed?(session, write_concern)
216
- return legacy_write_with_retry(nil, context: context, &block)
217
- end
218
-
219
- # If we are here, session is not nil. A session being nil would have
220
- # failed retry_write_allowed? check.
221
-
222
- server = select_server(cluster, ServerSelector.primary, session)
223
-
224
- unless ending_transaction || server.retry_writes?
225
- return legacy_write_with_retry(server, context: context, &block)
226
- end
227
-
228
- txn_num = nil
229
-
230
- begin
231
- connection_succeeded = false
232
- server.with_connection(connection_global_id: context.connection_global_id) do |connection|
233
- connection_succeeded = true
234
-
235
- session.materialize_if_needed
236
- txn_num = if session.in_transaction?
237
- session.txn_num
238
- else
239
- session.next_txn_num
240
- end
241
-
242
- # The context needs to be duplicated here because we will be using
243
- # it later for the retry as well.
244
- yield(connection, txn_num, context.dup)
245
- end
246
- rescue Error::SocketError, Error::SocketTimeoutError, Auth::Unauthorized => e
247
- e.add_note('modern retry')
248
- e.add_note("attempt 1")
249
- if !e.label?('RetryableWriteError')
250
- # If we get an auth error, it was raised when connecting the connection
251
- # and therefore we didn't have the connection yet to add labels.
252
- # Therefore, check if it is retryable, and if it is, add the label
253
- # and retry it. We also want to retry this if there was a Socket error
254
- # when trying to create the connection.
255
- if !connection_succeeded && !session.in_transaction? && e.write_retryable?
256
- e.add_label('RetryableWriteError')
257
- else
258
- raise e
259
- end
260
- end
261
-
262
- # Context#with creates a new context, which is not necessary here
263
- # but the API is less prone to misuse this way.
264
- retry_write(e, txn_num, context: context.with(is_retry: true), &block)
265
- rescue Error::OperationFailure => e
266
- e.add_note('modern retry')
267
- e.add_note("attempt 1")
268
- if e.unsupported_retryable_write?
269
- raise_unsupported_error(e)
270
- elsif !e.label?('RetryableWriteError')
271
- raise e
272
- end
273
-
274
- # Context#with creates a new context, which is not necessary here
275
- # but the API is less prone to misuse this way.
276
- retry_write(e, txn_num, context: context.with(is_retry: true), &block)
277
- end
57
+ # @note this is only a public method so that tests can add expectations
58
+ # based on it.
59
+ def read_worker
60
+ @read_worker ||= ReadWorker.new(self)
278
61
  end
279
62
 
280
- # Retryable writes wrapper for operations not supporting modern retryable
281
- # writes.
282
- #
283
- # If the driver is configured to use modern retryable writes, this method
284
- # yields to the passed block exactly once, thus not retrying any writes.
285
- #
286
- # If the driver is configured to use legacy retryable writes, this method
287
- # delegates to legacy_write_with_retry which performs write retries using
288
- # legacy logic.
289
- #
290
- # @param [ nil | Hash | WriteConcern::Base ] write_concern The write concern.
291
- # @param [ Context ] context The context for the operation.
292
- #
293
- # @yieldparam [ Connection ] connection The connection through which the
294
- # write should be sent.
295
- # @yieldparam [ nil ] txn_num nil as transaction number.
296
- # @yieldparam [ Operation::Context ] context The operation context.
63
+ # Returns the write worker for handling retryable writes.
297
64
  #
298
65
  # @api private
299
- def nro_write_with_retry(write_concern, context:, &block)
300
- session = context.session
301
-
302
- server = select_server(cluster, ServerSelector.primary, session)
303
- if session && session.client.options[:retry_writes]
304
- begin
305
- server.with_connection(connection_global_id: context.connection_global_id) do |connection|
306
- yield connection, nil, context
307
- end
308
- rescue Error::SocketError, Error::SocketTimeoutError, Error::OperationFailure => e
309
- e.add_note('retries disabled')
310
- raise e
311
- end
312
- else
313
- legacy_write_with_retry(server, context: context, &block)
314
- end
315
- end
316
-
317
- # Implements legacy write retrying functionality by yielding to the passed
318
- # block one or more times.
319
- #
320
- # This method is used for operations which are not supported by modern
321
- # retryable writes, such as delete_many and update_many.
322
66
  #
323
- # @param [ Server ] server The server which should be used for the
324
- # operation. If not provided, the current primary will be retrieved from
325
- # the cluster.
326
- # @param [ Context ] context The context for the operation.
327
- #
328
- # @yieldparam [ Connection ] connection The connection through which the
329
- # write should be sent.
330
- # @yieldparam [ nil ] txn_num nil as transaction number.
331
- # @yieldparam [ Operation::Context ] context The operation context.
332
- #
333
- # @api private
334
- def legacy_write_with_retry(server = nil, context:)
335
- session = context.session
336
-
337
- # This is the pre-session retry logic, and is not subject to
338
- # current retryable write specifications.
339
- # In particular it does not retry on SocketError and SocketTimeoutError.
340
- attempt = 0
341
- begin
342
- attempt += 1
343
- server ||= select_server(cluster, ServerSelector.primary, session)
344
- server.with_connection(connection_global_id: context.connection_global_id) do |connection|
345
- # Legacy retries do not use txn_num
346
- yield connection, nil, context.dup
347
- end
348
- rescue Error::OperationFailure => e
349
- e.add_note('legacy retry')
350
- e.add_note("attempt #{attempt}")
351
- server = nil
352
- if attempt > client.max_write_retries
353
- raise e
354
- end
355
- if e.label?('RetryableWriteError')
356
- log_retry(e, message: 'Legacy write retry')
357
- cluster.scan!(false)
358
- retry
359
- else
360
- raise e
361
- end
362
- end
363
- end
364
-
365
- private
366
-
367
- def modern_read_with_retry(session, server_selector, &block)
368
- server = select_server(cluster, server_selector, session)
369
- begin
370
- yield server
371
- rescue Error::SocketError, Error::SocketTimeoutError => e
372
- e.add_note('modern retry')
373
- e.add_note("attempt 1")
374
- if session.in_transaction?
375
- raise e
376
- end
377
- retry_read(e, server_selector, session, &block)
378
- rescue Error::OperationFailure, Auth::Unauthorized => e
379
- e.add_note('modern retry')
380
- e.add_note("attempt 1")
381
- if session.in_transaction? || !e.write_retryable?
382
- raise e
383
- end
384
- retry_read(e, server_selector, session, &block)
385
- end
386
- end
387
-
388
- def legacy_read_with_retry(session, server_selector)
389
- attempt = 0
390
- server = select_server(cluster, server_selector, session)
391
- begin
392
- attempt += 1
393
- yield server
394
- rescue Error::SocketError, Error::SocketTimeoutError => e
395
- e.add_note('legacy retry')
396
- e.add_note("attempt #{attempt}")
397
- if attempt > client.max_read_retries || (session && session.in_transaction?)
398
- raise e
399
- end
400
- log_retry(e, message: 'Legacy read retry')
401
- server = select_server(cluster, server_selector, session)
402
- retry
403
- rescue Error::OperationFailure => e
404
- e.add_note('legacy retry')
405
- e.add_note("attempt #{attempt}")
406
- if e.retryable? && !(session && session.in_transaction?)
407
- if attempt > client.max_read_retries
408
- raise e
409
- end
410
- log_retry(e, message: 'Legacy read retry')
411
- sleep(client.read_retry_interval)
412
- server = select_server(cluster, server_selector, session)
413
- retry
414
- else
415
- raise e
416
- end
417
- end
418
- end
419
-
420
- def retry_write_allowed?(session, write_concern)
421
- unless session && session.retry_writes?
422
- return false
423
- end
424
-
425
- if write_concern.nil?
426
- true
427
- else
428
- unless write_concern.is_a?(WriteConcern::Base)
429
- write_concern = WriteConcern.get(write_concern)
430
- end
431
- write_concern.acknowledged?
432
- end
433
- end
434
-
435
- def retry_read(original_error, server_selector, session, &block)
436
- begin
437
- server = select_server(cluster, server_selector, session)
438
- rescue Error, Error::AuthError => e
439
- original_error.add_note("later retry failed: #{e.class}: #{e}")
440
-
441
- # See the corresponding note below in retry_write.
442
- raise Error::RaiseOriginalError
443
- end
444
-
445
- log_retry(original_error, message: 'Read retry')
446
-
447
- begin
448
- yield server, true
449
- rescue Error::SocketError, Error::SocketTimeoutError => e
450
- e.add_note('modern retry')
451
- e.add_note("attempt 2")
452
- raise e
453
- rescue Error::OperationFailure => e
454
- e.add_note('modern retry')
455
- unless e.write_retryable?
456
- original_error.add_note("later retry failed: #{e.class}: #{e}")
457
- raise original_error
458
- end
459
- e.add_note("attempt 2")
460
- raise e
461
- rescue Error, Error::AuthError => e
462
- e.add_note('modern retry')
463
- original_error.add_note("later retry failed: #{e.class}: #{e}")
464
- raise original_error
465
- end
466
- rescue Error::RaiseOriginalError
467
- raise original_error
468
- end
469
-
470
- def retry_write(original_error, txn_num, context:, &block)
471
- session = context.session
472
-
473
- # We do not request a scan of the cluster here, because error handling
474
- # for the error which triggered the retry should have updated the
475
- # server description and/or topology as necessary (specifically,
476
- # a socket error or a not master error should have marked the respective
477
- # server unknown). Here we just need to wait for server selection.
478
- server = select_server(cluster, ServerSelector.primary, session)
479
- unless server.retry_writes?
480
- # Do not need to add "modern retry" here, it should already be on
481
- # the first exception.
482
- original_error.add_note('did not retry because server selected for retry does not supoprt retryable writes')
483
-
484
- # When we want to raise the original error, we must not run the
485
- # rescue blocks below that add diagnostics because the diagnostics
486
- # added would either be rendundant (e.g. modern retry note) or wrong
487
- # (e.g. "attempt 2", we are raising the exception produced in the
488
- # first attempt and haven't attempted the second time). Use the
489
- # special marker class to bypass the ordinarily applicable rescues.
490
- raise Error::RaiseOriginalError
491
- end
492
- log_retry(original_error, message: 'Write retry')
493
- server.with_connection(connection_global_id: context.connection_global_id) do |connection|
494
- yield(connection, txn_num, context)
495
- end
496
- rescue Error::SocketError, Error::SocketTimeoutError => e
497
- e.add_note('modern retry')
498
- e.add_note('attempt 2')
499
- raise e
500
- rescue Error::OperationFailure => e
501
- e.add_note('modern retry')
502
- if e.label?('RetryableWriteError')
503
- e.add_note('attempt 2')
504
- raise e
505
- else
506
- original_error.add_note("later retry failed: #{e.class}: #{e}")
507
- raise original_error
508
- end
509
- rescue Error, Error::AuthError => e
510
- # Do not need to add "modern retry" here, it should already be on
511
- # the first exception.
512
- original_error.add_note("later retry failed: #{e.class}: #{e}")
513
- raise original_error
514
- rescue Error::RaiseOriginalError
515
- raise original_error
516
- end
517
-
518
- # This is a separate method to make it possible for the test suite to
519
- # assert that server selection is performed during retry attempts.
520
- def select_server(cluster, server_selector, session)
521
- server_selector.select_server(cluster, nil, session)
522
- end
523
-
524
- # Log a warning so that any application slow down is immediately obvious.
525
- def log_retry(e, options = nil)
526
- message = if options && options[:message]
527
- options[:message]
528
- else
529
- "Retry"
530
- end
531
- Logger.logger.warn "#{message} due to: #{e.class.name}: #{e.message}"
532
- end
533
-
534
- # Retry writes on MMAPv1 should raise an actionable error; append actionable
535
- # information to the error message and preserve the backtrace.
536
- def raise_unsupported_error(e)
537
- new_error = Error::OperationFailure.new("#{e.class}: #{e} "\
538
- "This MongoDB deployment does not support retryable writes. Please add "\
539
- "retryWrites=false to your connection string or use the retry_writes: false Ruby client option")
540
- new_error.set_backtrace(e.backtrace)
541
- raise new_error
67
+ # @note this is only a public method so that tests can add expectations
68
+ # based on it.
69
+ def write_worker
70
+ @write_worker ||= WriteWorker.new(self)
542
71
  end
543
72
  end
544
73
  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) 2018-2020 MongoDB Inc.
5
5
  #
@@ -23,7 +23,7 @@ module Mongo
23
23
  class Semaphore
24
24
  def initialize
25
25
  @lock = Mutex.new
26
- @cv = ConditionVariable.new
26
+ @cv = ::ConditionVariable.new
27
27
  end
28
28
 
29
29
  # Waits for the semaphore to be signaled up to timeout seconds.