mongo 2.14.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1225) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +5 -2
  4. data/Rakefile +8 -15
  5. data/lib/mongo/active_support.rb +3 -0
  6. data/lib/mongo/address/ipv4.rb +3 -0
  7. data/lib/mongo/address/ipv6.rb +3 -0
  8. data/lib/mongo/address/unix.rb +3 -0
  9. data/lib/mongo/address/validator.rb +3 -0
  10. data/lib/mongo/address.rb +3 -0
  11. data/lib/mongo/auth/aws/conversation.rb +4 -4
  12. data/lib/mongo/auth/aws/credentials_retriever.rb +3 -0
  13. data/lib/mongo/auth/aws/request.rb +3 -0
  14. data/lib/mongo/auth/aws.rb +3 -0
  15. data/lib/mongo/auth/base.rb +17 -8
  16. data/lib/mongo/auth/conversation_base.rb +35 -0
  17. data/lib/mongo/auth/cr/conversation.rb +9 -29
  18. data/lib/mongo/auth/cr.rb +3 -0
  19. data/lib/mongo/auth/credential_cache.rb +3 -0
  20. data/lib/mongo/auth/gssapi/conversation.rb +7 -15
  21. data/lib/mongo/auth/gssapi.rb +3 -0
  22. data/lib/mongo/auth/ldap/conversation.rb +6 -14
  23. data/lib/mongo/auth/ldap.rb +3 -0
  24. data/lib/mongo/auth/roles.rb +3 -0
  25. data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
  26. data/lib/mongo/auth/scram/conversation.rb +3 -0
  27. data/lib/mongo/auth/scram.rb +5 -2
  28. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  29. data/lib/mongo/auth/scram256.rb +3 -0
  30. data/lib/mongo/auth/scram_conversation_base.rb +10 -34
  31. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  32. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  33. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  34. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -1
  35. data/lib/mongo/auth/stringprep.rb +4 -1
  36. data/lib/mongo/auth/user/view.rb +19 -9
  37. data/lib/mongo/auth/user.rb +3 -0
  38. data/lib/mongo/auth/x509/conversation.rb +7 -25
  39. data/lib/mongo/auth/x509.rb +3 -0
  40. data/lib/mongo/auth.rb +4 -1
  41. data/lib/mongo/background_thread.rb +16 -2
  42. data/lib/mongo/bson.rb +3 -0
  43. data/lib/mongo/bulk_write/combineable.rb +3 -0
  44. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  45. data/lib/mongo/bulk_write/result.rb +3 -0
  46. data/lib/mongo/bulk_write/result_combiner.rb +3 -0
  47. data/lib/mongo/bulk_write/transformable.rb +3 -0
  48. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  49. data/lib/mongo/bulk_write/validatable.rb +3 -0
  50. data/lib/mongo/bulk_write.rb +26 -20
  51. data/lib/mongo/caching_cursor.rb +3 -0
  52. data/lib/mongo/client.rb +131 -12
  53. data/lib/mongo/client_encryption.rb +3 -0
  54. data/lib/mongo/cluster/periodic_executor.rb +7 -3
  55. data/lib/mongo/cluster/reapers/cursor_reaper.rb +80 -40
  56. data/lib/mongo/cluster/reapers/socket_reaper.rb +3 -0
  57. data/lib/mongo/cluster/sdam_flow.rb +26 -3
  58. data/lib/mongo/cluster/topology/base.rb +16 -9
  59. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  60. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  61. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  62. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  63. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  64. data/lib/mongo/cluster/topology/single.rb +3 -0
  65. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  66. data/lib/mongo/cluster/topology.rb +31 -8
  67. data/lib/mongo/cluster.rb +156 -77
  68. data/lib/mongo/cluster_time.rb +3 -0
  69. data/lib/mongo/collection/view/aggregation.rb +9 -11
  70. data/lib/mongo/collection/view/builder/aggregation.rb +9 -5
  71. data/lib/mongo/collection/view/builder/map_reduce.rb +15 -49
  72. data/lib/mongo/collection/view/builder.rb +3 -4
  73. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  74. data/lib/mongo/collection/view/change_stream.rb +5 -2
  75. data/lib/mongo/collection/view/explainable.rb +3 -0
  76. data/lib/mongo/collection/view/immutable.rb +3 -0
  77. data/lib/mongo/collection/view/iterable.rb +62 -25
  78. data/lib/mongo/collection/view/map_reduce.rb +44 -17
  79. data/lib/mongo/collection/view/readable.rb +105 -65
  80. data/lib/mongo/collection/view/writable.rb +187 -181
  81. data/lib/mongo/collection/view.rb +18 -21
  82. data/lib/mongo/collection.rb +54 -28
  83. data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
  84. data/lib/mongo/crypt/auto_encrypter.rb +4 -1
  85. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  86. data/lib/mongo/crypt/binary.rb +3 -0
  87. data/lib/mongo/crypt/binding.rb +4 -1
  88. data/lib/mongo/crypt/context.rb +3 -0
  89. data/lib/mongo/crypt/data_key_context.rb +3 -0
  90. data/lib/mongo/crypt/encryption_io.rb +3 -0
  91. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  92. data/lib/mongo/crypt/explicit_encrypter.rb +3 -0
  93. data/lib/mongo/crypt/explicit_encryption_context.rb +3 -0
  94. data/lib/mongo/crypt/handle.rb +3 -0
  95. data/lib/mongo/crypt/hooks.rb +3 -0
  96. data/lib/mongo/crypt/kms_context.rb +3 -0
  97. data/lib/mongo/crypt/status.rb +3 -0
  98. data/lib/mongo/crypt.rb +3 -0
  99. data/lib/mongo/cursor/kill_spec.rb +38 -0
  100. data/lib/mongo/cursor.rb +76 -31
  101. data/lib/mongo/database/view.rb +5 -2
  102. data/lib/mongo/database.rb +26 -6
  103. data/lib/mongo/dbref.rb +3 -0
  104. data/lib/mongo/distinguishing_semaphore.rb +3 -0
  105. data/lib/mongo/error/auth_error.rb +3 -0
  106. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  107. data/lib/mongo/error/bulk_write_error.rb +20 -3
  108. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  109. data/lib/mongo/error/closed_stream.rb +3 -0
  110. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  111. data/lib/mongo/error/connection_perished.rb +3 -0
  112. data/lib/mongo/error/credential_check_error.rb +3 -0
  113. data/lib/mongo/error/crypt_error.rb +3 -0
  114. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  115. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  116. data/lib/mongo/error/file_not_found.rb +3 -0
  117. data/lib/mongo/error/handshake_error.rb +3 -0
  118. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  119. data/lib/mongo/error/internal_driver_error.rb +25 -0
  120. data/lib/mongo/error/invalid_address.rb +3 -0
  121. data/lib/mongo/error/invalid_application_name.rb +3 -0
  122. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  123. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  124. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  125. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  126. data/lib/mongo/error/invalid_database_name.rb +3 -0
  127. data/lib/mongo/error/invalid_document.rb +3 -0
  128. data/lib/mongo/error/invalid_file.rb +3 -0
  129. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  130. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  131. data/lib/mongo/error/invalid_nonce.rb +3 -0
  132. data/lib/mongo/error/invalid_read_concern.rb +3 -0
  133. data/lib/mongo/error/invalid_read_option.rb +3 -0
  134. data/lib/mongo/error/invalid_replacement_document.rb +3 -0
  135. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  136. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  137. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  138. data/lib/mongo/error/invalid_session.rb +3 -0
  139. data/lib/mongo/error/invalid_signature.rb +3 -0
  140. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  141. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  142. data/lib/mongo/error/invalid_update_document.rb +3 -0
  143. data/lib/mongo/error/invalid_uri.rb +3 -0
  144. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  145. data/lib/mongo/error/kms_error.rb +3 -0
  146. data/lib/mongo/error/lint_error.rb +3 -0
  147. data/lib/mongo/error/max_bson_size.rb +3 -0
  148. data/lib/mongo/error/max_message_size.rb +3 -0
  149. data/lib/mongo/error/mismatched_domain.rb +3 -0
  150. data/lib/mongo/error/missing_file_chunk.rb +3 -0
  151. data/lib/mongo/error/missing_password.rb +3 -0
  152. data/lib/mongo/error/missing_resume_token.rb +3 -0
  153. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  154. data/lib/mongo/error/missing_service_id.rb +26 -0
  155. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  156. data/lib/mongo/error/multi_index_drop.rb +3 -0
  157. data/lib/mongo/error/need_primary_server.rb +3 -0
  158. data/lib/mongo/error/no_server_available.rb +3 -0
  159. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  160. data/lib/mongo/error/no_srv_records.rb +3 -0
  161. data/lib/mongo/error/notable.rb +10 -0
  162. data/lib/mongo/error/operation_failure.rb +26 -4
  163. data/lib/mongo/error/parser.rb +69 -13
  164. data/lib/mongo/error/pool_closed_error.rb +3 -0
  165. data/lib/mongo/error/raise_original_error.rb +3 -0
  166. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  167. data/lib/mongo/error/server_api_conflict.rb +26 -0
  168. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  169. data/lib/mongo/error/server_certificate_revoked.rb +3 -0
  170. data/lib/mongo/error/session_ended.rb +3 -0
  171. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  172. data/lib/mongo/error/socket_error.rb +3 -0
  173. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  174. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  175. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  176. data/lib/mongo/error/unexpected_response.rb +3 -0
  177. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  178. data/lib/mongo/error/unmet_dependency.rb +24 -0
  179. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  180. data/lib/mongo/error/unsupported_collation.rb +3 -0
  181. data/lib/mongo/error/unsupported_features.rb +3 -0
  182. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  183. data/lib/mongo/error/unsupported_option.rb +3 -0
  184. data/lib/mongo/error/write_retryable.rb +3 -0
  185. data/lib/mongo/error.rb +15 -1
  186. data/lib/mongo/event/base.rb +3 -0
  187. data/lib/mongo/event/listeners.rb +3 -0
  188. data/lib/mongo/event/publisher.rb +3 -0
  189. data/lib/mongo/event/subscriber.rb +3 -0
  190. data/lib/mongo/event.rb +3 -0
  191. data/lib/mongo/grid/file/chunk.rb +4 -1
  192. data/lib/mongo/grid/file/info.rb +3 -0
  193. data/lib/mongo/grid/file.rb +3 -0
  194. data/lib/mongo/grid/fs_bucket.rb +86 -46
  195. data/lib/mongo/grid/stream/read.rb +22 -7
  196. data/lib/mongo/grid/stream/write.rb +3 -0
  197. data/lib/mongo/grid/stream.rb +3 -0
  198. data/lib/mongo/grid.rb +3 -0
  199. data/lib/mongo/id.rb +10 -5
  200. data/lib/mongo/index/view.rb +46 -52
  201. data/lib/mongo/index.rb +3 -0
  202. data/lib/mongo/lint.rb +3 -0
  203. data/lib/mongo/loggable.rb +3 -0
  204. data/lib/mongo/logger.rb +3 -0
  205. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  206. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  207. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  208. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  209. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  210. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  211. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  212. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  213. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  214. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  215. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +10 -4
  216. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  217. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  218. data/lib/mongo/monitoring/event/cmap.rb +3 -0
  219. data/lib/mongo/monitoring/event/command_failed.rb +32 -5
  220. data/lib/mongo/monitoring/event/command_started.rb +22 -2
  221. data/lib/mongo/monitoring/event/command_succeeded.rb +29 -3
  222. data/lib/mongo/monitoring/event/secure.rb +39 -5
  223. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  224. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  225. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
  226. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  227. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
  228. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  229. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  230. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  231. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  232. data/lib/mongo/monitoring/event.rb +3 -0
  233. data/lib/mongo/monitoring/publishable.rb +34 -12
  234. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  235. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  236. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  237. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  238. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  239. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  240. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  241. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  242. data/lib/mongo/monitoring.rb +20 -8
  243. data/lib/mongo/operation/aggregate/command.rb +11 -0
  244. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  245. data/lib/mongo/operation/aggregate/result.rb +3 -0
  246. data/lib/mongo/operation/aggregate.rb +3 -0
  247. data/lib/mongo/operation/collections_info/command.rb +5 -2
  248. data/lib/mongo/operation/collections_info/result.rb +3 -0
  249. data/lib/mongo/operation/collections_info.rb +21 -1
  250. data/lib/mongo/operation/command/command.rb +3 -0
  251. data/lib/mongo/operation/command/op_msg.rb +3 -0
  252. data/lib/mongo/operation/command.rb +3 -0
  253. data/lib/mongo/operation/context.rb +120 -0
  254. data/lib/mongo/operation/count/command.rb +9 -0
  255. data/lib/mongo/operation/count/op_msg.rb +9 -0
  256. data/lib/mongo/operation/count.rb +3 -0
  257. data/lib/mongo/operation/create/command.rb +10 -1
  258. data/lib/mongo/operation/create/op_msg.rb +10 -0
  259. data/lib/mongo/operation/create.rb +3 -0
  260. data/lib/mongo/operation/create_index/command.rb +20 -1
  261. data/lib/mongo/operation/create_index/op_msg.rb +20 -4
  262. data/lib/mongo/operation/create_index.rb +3 -0
  263. data/lib/mongo/operation/create_user/command.rb +3 -0
  264. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  265. data/lib/mongo/operation/create_user.rb +3 -0
  266. data/lib/mongo/operation/delete/bulk_result.rb +3 -0
  267. data/lib/mongo/operation/delete/command.rb +9 -3
  268. data/lib/mongo/operation/delete/legacy.rb +12 -2
  269. data/lib/mongo/operation/delete/op_msg.rb +11 -1
  270. data/lib/mongo/operation/delete/result.rb +3 -0
  271. data/lib/mongo/operation/delete.rb +3 -0
  272. data/lib/mongo/operation/distinct/command.rb +9 -0
  273. data/lib/mongo/operation/distinct/op_msg.rb +10 -0
  274. data/lib/mongo/operation/distinct.rb +3 -0
  275. data/lib/mongo/operation/drop/command.rb +3 -0
  276. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  277. data/lib/mongo/operation/drop.rb +3 -0
  278. data/lib/mongo/operation/drop_database/command.rb +3 -0
  279. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  280. data/lib/mongo/operation/drop_database.rb +3 -0
  281. data/lib/mongo/operation/drop_index/command.rb +3 -0
  282. data/lib/mongo/operation/drop_index/op_msg.rb +3 -0
  283. data/lib/mongo/operation/drop_index.rb +3 -0
  284. data/lib/mongo/operation/explain/command.rb +16 -1
  285. data/lib/mongo/operation/explain/legacy.rb +15 -5
  286. data/lib/mongo/operation/explain/op_msg.rb +12 -1
  287. data/lib/mongo/operation/explain/result.rb +3 -0
  288. data/lib/mongo/operation/explain.rb +3 -0
  289. data/lib/mongo/operation/find/builder/command.rb +110 -0
  290. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +13 -14
  291. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  292. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +34 -25
  293. data/lib/mongo/{cursor → operation/find}/builder.rb +7 -4
  294. data/lib/mongo/operation/find/command.rb +12 -0
  295. data/lib/mongo/operation/find/legacy/result.rb +3 -0
  296. data/lib/mongo/operation/find/legacy.rb +13 -1
  297. data/lib/mongo/operation/find/op_msg.rb +15 -0
  298. data/lib/mongo/operation/find/result.rb +3 -0
  299. data/lib/mongo/operation/find.rb +4 -0
  300. data/lib/mongo/operation/get_more/command.rb +4 -0
  301. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  302. data/lib/mongo/operation/get_more/legacy.rb +3 -0
  303. data/lib/mongo/operation/get_more/op_msg.rb +4 -0
  304. data/lib/mongo/operation/get_more/result.rb +3 -0
  305. data/lib/mongo/operation/get_more.rb +4 -0
  306. data/lib/mongo/operation/indexes/command.rb +3 -0
  307. data/lib/mongo/operation/indexes/legacy.rb +3 -0
  308. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  309. data/lib/mongo/operation/indexes/result.rb +3 -0
  310. data/lib/mongo/operation/indexes.rb +18 -1
  311. data/lib/mongo/operation/insert/bulk_result.rb +3 -0
  312. data/lib/mongo/operation/insert/command.rb +5 -2
  313. data/lib/mongo/operation/insert/legacy.rb +5 -2
  314. data/lib/mongo/operation/insert/op_msg.rb +5 -2
  315. data/lib/mongo/operation/insert/result.rb +3 -0
  316. data/lib/mongo/operation/insert.rb +3 -0
  317. data/lib/mongo/operation/kill_cursors/command.rb +11 -0
  318. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  319. data/lib/mongo/operation/kill_cursors/legacy.rb +5 -1
  320. data/lib/mongo/operation/kill_cursors/op_msg.rb +13 -0
  321. data/lib/mongo/operation/kill_cursors.rb +4 -0
  322. data/lib/mongo/operation/list_collections/command.rb +3 -0
  323. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  324. data/lib/mongo/operation/list_collections/result.rb +7 -1
  325. data/lib/mongo/operation/list_collections.rb +3 -0
  326. data/lib/mongo/operation/map_reduce/command.rb +11 -0
  327. data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
  328. data/lib/mongo/operation/map_reduce/result.rb +3 -0
  329. data/lib/mongo/operation/map_reduce.rb +3 -0
  330. data/lib/mongo/operation/op_msg_base.rb +3 -0
  331. data/lib/mongo/operation/parallel_scan/command.rb +4 -2
  332. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  333. data/lib/mongo/operation/parallel_scan/result.rb +3 -0
  334. data/lib/mongo/operation/parallel_scan.rb +3 -0
  335. data/lib/mongo/operation/remove_user/command.rb +3 -0
  336. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  337. data/lib/mongo/operation/remove_user.rb +3 -0
  338. data/lib/mongo/operation/result.rb +5 -0
  339. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -0
  340. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -0
  341. data/lib/mongo/operation/shared/executable.rb +39 -15
  342. data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
  343. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  344. data/lib/mongo/operation/shared/idable.rb +3 -0
  345. data/lib/mongo/operation/shared/limited.rb +3 -0
  346. data/lib/mongo/operation/shared/object_id_generator.rb +3 -0
  347. data/lib/mongo/operation/shared/op_msg_or_command.rb +4 -7
  348. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +4 -7
  349. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  350. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  351. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  352. data/lib/mongo/operation/shared/read_preference_supported.rb +44 -37
  353. data/lib/mongo/operation/shared/response_handling.rb +27 -23
  354. data/lib/mongo/operation/shared/result/aggregatable.rb +3 -0
  355. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  356. data/lib/mongo/operation/shared/sessions_supported.rb +31 -16
  357. data/lib/mongo/operation/shared/specifiable.rb +14 -29
  358. data/lib/mongo/operation/shared/validatable.rb +87 -0
  359. data/lib/mongo/operation/shared/write.rb +12 -19
  360. data/lib/mongo/operation/shared/write_concern_supported.rb +3 -0
  361. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  362. data/lib/mongo/operation/update/command.rb +9 -3
  363. data/lib/mongo/operation/update/legacy/result.rb +3 -0
  364. data/lib/mongo/operation/update/legacy.rb +22 -11
  365. data/lib/mongo/operation/update/op_msg.rb +10 -4
  366. data/lib/mongo/operation/update/result.rb +3 -0
  367. data/lib/mongo/operation/update.rb +3 -0
  368. data/lib/mongo/operation/update_user/command.rb +3 -0
  369. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  370. data/lib/mongo/operation/update_user.rb +3 -0
  371. data/lib/mongo/operation/users_info/command.rb +3 -0
  372. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  373. data/lib/mongo/operation/users_info/result.rb +3 -0
  374. data/lib/mongo/operation/users_info.rb +3 -0
  375. data/lib/mongo/operation/write_command/command.rb +51 -0
  376. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  377. data/lib/mongo/operation/write_command.rb +32 -0
  378. data/lib/mongo/operation.rb +15 -2
  379. data/lib/mongo/options/mapper.rb +3 -0
  380. data/lib/mongo/options/redacted.rb +3 -0
  381. data/lib/mongo/options.rb +3 -0
  382. data/lib/mongo/protocol/bit_vector.rb +3 -0
  383. data/lib/mongo/protocol/compressed.rb +54 -5
  384. data/lib/mongo/protocol/delete.rb +3 -0
  385. data/lib/mongo/protocol/get_more.rb +3 -0
  386. data/lib/mongo/protocol/insert.rb +3 -0
  387. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  388. data/lib/mongo/protocol/message.rb +23 -2
  389. data/lib/mongo/protocol/msg.rb +39 -16
  390. data/lib/mongo/protocol/query.rb +53 -32
  391. data/lib/mongo/protocol/registry.rb +3 -0
  392. data/lib/mongo/protocol/reply.rb +3 -0
  393. data/lib/mongo/protocol/serializers.rb +3 -0
  394. data/lib/mongo/protocol/update.rb +3 -0
  395. data/lib/mongo/protocol.rb +3 -0
  396. data/lib/mongo/query_cache.rb +33 -0
  397. data/lib/mongo/retryable.rb +4 -1
  398. data/lib/mongo/semaphore.rb +3 -0
  399. data/lib/mongo/server/app_metadata.rb +89 -33
  400. data/lib/mongo/server/connection.rb +34 -4
  401. data/lib/mongo/server/connection_base.rb +47 -21
  402. data/lib/mongo/server/connection_common.rb +71 -1
  403. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  404. data/lib/mongo/server/connection_pool/populator.rb +3 -0
  405. data/lib/mongo/server/connection_pool.rb +108 -30
  406. data/lib/mongo/server/description/features.rb +30 -25
  407. data/lib/mongo/server/description/load_balancer.rb +33 -0
  408. data/lib/mongo/server/description.rb +112 -16
  409. data/lib/mongo/server/monitor/app_metadata.rb +4 -1
  410. data/lib/mongo/server/monitor/connection.rb +56 -47
  411. data/lib/mongo/server/monitor.rb +28 -14
  412. data/lib/mongo/server/pending_connection.rb +75 -42
  413. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  414. data/lib/mongo/server/push_monitor.rb +38 -17
  415. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  416. data/lib/mongo/server.rb +97 -41
  417. data/lib/mongo/server_selector/base.rb +11 -4
  418. data/lib/mongo/server_selector/nearest.rb +6 -4
  419. data/lib/mongo/server_selector/primary.rb +6 -4
  420. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  421. data/lib/mongo/server_selector/secondary.rb +6 -4
  422. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  423. data/lib/mongo/server_selector.rb +3 -0
  424. data/lib/mongo/session/server_session.rb +3 -0
  425. data/lib/mongo/session/session_pool.rb +18 -2
  426. data/lib/mongo/session.rb +39 -12
  427. data/lib/mongo/socket/ocsp_cache.rb +3 -0
  428. data/lib/mongo/socket/ocsp_verifier.rb +15 -38
  429. data/lib/mongo/socket/ssl.rb +11 -0
  430. data/lib/mongo/socket/tcp.rb +3 -0
  431. data/lib/mongo/socket/unix.rb +3 -0
  432. data/lib/mongo/socket.rb +36 -6
  433. data/lib/mongo/srv/monitor.rb +3 -11
  434. data/lib/mongo/srv/resolver.rb +3 -0
  435. data/lib/mongo/srv/result.rb +3 -0
  436. data/lib/mongo/srv.rb +3 -0
  437. data/lib/mongo/timeout.rb +3 -0
  438. data/lib/mongo/topology_version.rb +4 -1
  439. data/lib/mongo/uri/options_mapper.rb +42 -0
  440. data/lib/mongo/uri/srv_protocol.rb +9 -8
  441. data/lib/mongo/uri.rb +21 -0
  442. data/lib/mongo/utils.rb +38 -0
  443. data/lib/mongo/version.rb +4 -1
  444. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  445. data/lib/mongo/write_concern/base.rb +3 -0
  446. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  447. data/lib/mongo/write_concern.rb +3 -0
  448. data/lib/mongo.rb +26 -0
  449. data/mongo.gemspec +1 -1
  450. data/spec/README.md +24 -1
  451. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  452. data/spec/atlas/operations_spec.rb +3 -0
  453. data/spec/integration/auth_spec.rb +58 -15
  454. data/spec/integration/awaited_ismaster_spec.rb +9 -6
  455. data/spec/integration/aws_auth_request_spec.rb +3 -0
  456. data/spec/integration/aws_credentials_retriever_spec.rb +3 -0
  457. data/spec/integration/bson_symbol_spec.rb +4 -1
  458. data/spec/integration/bulk_insert_spec.rb +3 -0
  459. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  460. data/spec/integration/bulk_write_spec.rb +4 -1
  461. data/spec/integration/change_stream_examples_spec.rb +3 -0
  462. data/spec/integration/change_stream_spec.rb +10 -7
  463. data/spec/integration/check_clean_slate_spec.rb +3 -0
  464. data/spec/integration/client_authentication_options_spec.rb +21 -8
  465. data/spec/integration/client_connectivity_spec.rb +4 -1
  466. data/spec/integration/client_construction_aws_auth_spec.rb +3 -0
  467. data/spec/integration/client_construction_spec.rb +57 -0
  468. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +4 -1
  469. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +4 -1
  470. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -0
  471. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  472. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +3 -0
  473. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +3 -0
  474. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +4 -1
  475. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +4 -1
  476. data/spec/integration/client_side_encryption/client_close_spec.rb +3 -0
  477. data/spec/integration/client_side_encryption/corpus_spec.rb +3 -0
  478. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -0
  479. data/spec/integration/client_side_encryption/data_key_spec.rb +4 -1
  480. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +3 -0
  481. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +3 -0
  482. data/spec/integration/client_side_encryption/views_spec.rb +3 -0
  483. data/spec/integration/client_spec.rb +7 -2
  484. data/spec/integration/client_update_spec.rb +3 -0
  485. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  486. data/spec/integration/command_monitoring_spec.rb +64 -26
  487. data/spec/integration/command_spec.rb +4 -1
  488. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  489. data/spec/integration/connection_pool_populator_spec.rb +3 -0
  490. data/spec/integration/connection_spec.rb +58 -36
  491. data/spec/integration/crud_spec.rb +205 -1
  492. data/spec/integration/cursor_pinning_spec.rb +121 -0
  493. data/spec/integration/cursor_reaping_spec.rb +11 -4
  494. data/spec/integration/docs_examples_spec.rb +11 -1
  495. data/spec/integration/error_detection_spec.rb +3 -0
  496. data/spec/integration/fork_reconnect_spec.rb +9 -7
  497. data/spec/integration/get_more_spec.rb +4 -1
  498. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  499. data/spec/integration/heartbeat_events_spec.rb +8 -5
  500. data/spec/integration/map_reduce_spec.rb +77 -0
  501. data/spec/integration/mmapv1_spec.rb +3 -0
  502. data/spec/integration/mongos_pinning_spec.rb +3 -0
  503. data/spec/integration/ocsp_connectivity_spec.rb +3 -0
  504. data/spec/integration/ocsp_verifier_cache_spec.rb +3 -0
  505. data/spec/integration/ocsp_verifier_spec.rb +29 -8
  506. data/spec/integration/operation_failure_code_spec.rb +4 -1
  507. data/spec/integration/operation_failure_message_spec.rb +90 -0
  508. data/spec/integration/query_cache_spec.rb +50 -2
  509. data/spec/integration/query_cache_transactions_spec.rb +4 -1
  510. data/spec/integration/read_concern_spec.rb +4 -1
  511. data/spec/integration/read_preference_spec.rb +4 -1
  512. data/spec/integration/reconnect_spec.rb +34 -13
  513. data/spec/integration/retryable_errors_spec.rb +4 -1
  514. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +4 -1
  515. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +4 -1
  516. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  517. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  518. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  519. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +3 -0
  520. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  521. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  522. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  523. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  524. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  525. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  526. data/spec/integration/sdam_error_handling_spec.rb +11 -6
  527. data/spec/integration/sdam_events_spec.rb +50 -30
  528. data/spec/integration/sdam_prose_spec.rb +5 -2
  529. data/spec/integration/secondary_reads_spec.rb +102 -0
  530. data/spec/integration/server_description_spec.rb +3 -0
  531. data/spec/integration/server_monitor_spec.rb +5 -1
  532. data/spec/integration/server_selection_spec.rb +3 -0
  533. data/spec/integration/server_selector_spec.rb +25 -5
  534. data/spec/integration/server_spec.rb +5 -0
  535. data/spec/integration/shell_examples_spec.rb +3 -0
  536. data/spec/integration/size_limit_spec.rb +3 -0
  537. data/spec/integration/snappy_compression_spec.rb +28 -0
  538. data/spec/integration/srv_monitoring_spec.rb +5 -2
  539. data/spec/integration/srv_spec.rb +3 -0
  540. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  541. data/spec/integration/step_down_spec.rb +4 -1
  542. data/spec/integration/time_zone_querying_spec.rb +3 -0
  543. data/spec/integration/transaction_pinning_spec.rb +120 -0
  544. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  545. data/spec/integration/transactions_examples_spec.rb +9 -0
  546. data/spec/integration/truncated_utf8_spec.rb +26 -0
  547. data/spec/integration/versioned_api_examples_spec.rb +114 -0
  548. data/spec/integration/x509_auth_spec.rb +5 -2
  549. data/spec/integration/zlib_compression_spec.rb +4 -1
  550. data/spec/integration/zstd_compression_spec.rb +29 -0
  551. data/spec/kerberos/kerberos_spec.rb +3 -0
  552. data/spec/lite_spec_helper.rb +12 -3
  553. data/spec/mongo/address/ipv4_spec.rb +3 -0
  554. data/spec/mongo/address/ipv6_spec.rb +3 -0
  555. data/spec/mongo/address/unix_spec.rb +4 -0
  556. data/spec/mongo/address/validator_spec.rb +3 -0
  557. data/spec/mongo/address_spec.rb +18 -11
  558. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  559. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  560. data/spec/mongo/auth/cr_spec.rb +5 -3
  561. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  562. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  563. data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
  564. data/spec/mongo/auth/ldap_spec.rb +10 -4
  565. data/spec/mongo/auth/scram/conversation_spec.rb +3 -0
  566. data/spec/mongo/auth/scram256/conversation_spec.rb +3 -0
  567. data/spec/mongo/auth/scram_negotiation_spec.rb +4 -1
  568. data/spec/mongo/auth/scram_spec.rb +5 -3
  569. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  570. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  571. data/spec/mongo/auth/user/view_spec.rb +4 -1
  572. data/spec/mongo/auth/user_spec.rb +3 -0
  573. data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
  574. data/spec/mongo/auth/x509_spec.rb +5 -3
  575. data/spec/mongo/auth_spec.rb +3 -0
  576. data/spec/mongo/bson_spec.rb +3 -0
  577. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  578. data/spec/mongo/bulk_write/result_spec.rb +3 -0
  579. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  580. data/spec/mongo/bulk_write_spec.rb +6 -3
  581. data/spec/mongo/caching_cursor_spec.rb +3 -0
  582. data/spec/mongo/client_construction_spec.rb +472 -62
  583. data/spec/mongo/client_encryption_spec.rb +3 -0
  584. data/spec/mongo/client_spec.rb +26 -4
  585. data/spec/mongo/cluster/cursor_reaper_spec.rb +39 -21
  586. data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
  587. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  588. data/spec/mongo/cluster/topology/replica_set_spec.rb +12 -9
  589. data/spec/mongo/cluster/topology/sharded_spec.rb +5 -2
  590. data/spec/mongo/cluster/topology/single_spec.rb +5 -2
  591. data/spec/mongo/cluster/topology/unknown_spec.rb +3 -0
  592. data/spec/mongo/cluster/topology_spec.rb +3 -0
  593. data/spec/mongo/cluster_spec.rb +51 -21
  594. data/spec/mongo/cluster_time_spec.rb +3 -0
  595. data/spec/mongo/collection/view/aggregation_spec.rb +4 -1
  596. data/spec/mongo/collection/view/builder/find_command_spec.rb +7 -0
  597. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  598. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -2
  599. data/spec/mongo/collection/view/change_stream_spec.rb +16 -0
  600. data/spec/mongo/collection/view/explainable_spec.rb +4 -1
  601. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  602. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  603. data/spec/mongo/collection/view/map_reduce_spec.rb +4 -1
  604. data/spec/mongo/collection/view/readable_spec.rb +51 -18
  605. data/spec/mongo/collection/view/writable_spec.rb +3 -0
  606. data/spec/mongo/collection/view_spec.rb +3 -0
  607. data/spec/mongo/collection_crud_spec.rb +4365 -0
  608. data/spec/mongo/collection_ddl_spec.rb +537 -0
  609. data/spec/mongo/collection_spec.rb +9 -4860
  610. data/spec/mongo/crypt/auto_decryption_context_spec.rb +3 -0
  611. data/spec/mongo/crypt/auto_encrypter_spec.rb +3 -0
  612. data/spec/mongo/crypt/auto_encryption_context_spec.rb +3 -0
  613. data/spec/mongo/crypt/binary_spec.rb +3 -0
  614. data/spec/mongo/crypt/binding/binary_spec.rb +3 -0
  615. data/spec/mongo/crypt/binding/context_spec.rb +3 -0
  616. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -0
  617. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +3 -0
  618. data/spec/mongo/crypt/binding/status_spec.rb +3 -0
  619. data/spec/mongo/crypt/binding/version_spec.rb +3 -0
  620. data/spec/mongo/crypt/binding_unloaded_spec.rb +3 -0
  621. data/spec/mongo/crypt/data_key_context_spec.rb +3 -0
  622. data/spec/mongo/crypt/encryption_io_spec.rb +3 -0
  623. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +3 -0
  624. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -0
  625. data/spec/mongo/crypt/handle_spec.rb +3 -0
  626. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  627. data/spec/mongo/crypt/status_spec.rb +3 -0
  628. data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -2
  629. data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -2
  630. data/spec/mongo/cursor_spec.rb +89 -12
  631. data/spec/mongo/database_spec.rb +90 -25
  632. data/spec/mongo/dbref_spec.rb +3 -0
  633. data/spec/mongo/distinguishing_semaphore_spec.rb +3 -0
  634. data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
  635. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  636. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  637. data/spec/mongo/error/no_server_available_spec.rb +3 -0
  638. data/spec/mongo/error/notable_spec.rb +3 -0
  639. data/spec/mongo/error/operation_failure_heavy_spec.rb +4 -1
  640. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  641. data/spec/mongo/error/parser_spec.rb +40 -6
  642. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  643. data/spec/mongo/event/publisher_spec.rb +3 -0
  644. data/spec/mongo/event/subscriber_spec.rb +3 -0
  645. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  646. data/spec/mongo/grid/file/info_spec.rb +3 -0
  647. data/spec/mongo/grid/file_spec.rb +4 -1
  648. data/spec/mongo/grid/fs_bucket_spec.rb +40 -17
  649. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  650. data/spec/mongo/grid/stream/write_spec.rb +6 -9
  651. data/spec/mongo/grid/stream_spec.rb +4 -1
  652. data/spec/mongo/id_spec.rb +3 -0
  653. data/spec/mongo/index/view_spec.rb +13 -4
  654. data/spec/mongo/lint_spec.rb +3 -0
  655. data/spec/mongo/logger_spec.rb +3 -0
  656. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  657. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  658. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  661. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  663. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  664. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  665. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  666. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  667. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  668. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  669. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  670. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  671. data/spec/mongo/monitoring/event/server_closed_spec.rb +3 -0
  672. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  673. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  674. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  675. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  676. data/spec/mongo/monitoring/event/server_opening_spec.rb +3 -0
  677. data/spec/mongo/monitoring/event/topology_changed_spec.rb +3 -0
  678. data/spec/mongo/monitoring/event/topology_closed_spec.rb +3 -0
  679. data/spec/mongo/monitoring/event/topology_opening_spec.rb +3 -0
  680. data/spec/mongo/monitoring_spec.rb +3 -0
  681. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  682. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  683. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  684. data/spec/mongo/operation/command_spec.rb +11 -5
  685. data/spec/mongo/operation/create_index_spec.rb +9 -3
  686. data/spec/mongo/operation/create_user_spec.rb +9 -3
  687. data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
  688. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  689. data/spec/mongo/operation/delete/op_msg_spec.rb +4 -1
  690. data/spec/mongo/operation/delete_spec.rb +14 -7
  691. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  692. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +5 -2
  693. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +5 -2
  694. data/spec/mongo/operation/find/legacy_spec.rb +8 -2
  695. data/spec/mongo/operation/get_more_spec.rb +6 -1
  696. data/spec/mongo/operation/indexes_spec.rb +8 -1
  697. data/spec/mongo/operation/insert/bulk_spec.rb +14 -8
  698. data/spec/mongo/operation/insert/command_spec.rb +3 -0
  699. data/spec/mongo/operation/insert/op_msg_spec.rb +4 -1
  700. data/spec/mongo/operation/insert_spec.rb +18 -12
  701. data/spec/mongo/operation/kill_cursors_spec.rb +7 -1
  702. data/spec/mongo/operation/limited_spec.rb +3 -0
  703. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  704. data/spec/mongo/operation/read_preference_legacy_spec.rb +39 -42
  705. data/spec/mongo/operation/read_preference_op_msg_spec.rb +8 -3
  706. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  707. data/spec/mongo/operation/result_spec.rb +10 -5
  708. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  709. data/spec/mongo/operation/update/bulk_spec.rb +13 -7
  710. data/spec/mongo/operation/update/command_spec.rb +3 -0
  711. data/spec/mongo/operation/update/op_msg_spec.rb +4 -1
  712. data/spec/mongo/operation/update_spec.rb +13 -7
  713. data/spec/mongo/operation/update_user_spec.rb +7 -1
  714. data/spec/mongo/options/redacted_spec.rb +3 -0
  715. data/spec/mongo/protocol/compressed_spec.rb +29 -12
  716. data/spec/mongo/protocol/delete_spec.rb +3 -0
  717. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  718. data/spec/mongo/protocol/insert_spec.rb +3 -0
  719. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  720. data/spec/mongo/protocol/msg_spec.rb +4 -1
  721. data/spec/mongo/protocol/query_spec.rb +6 -3
  722. data/spec/mongo/protocol/registry_spec.rb +3 -0
  723. data/spec/mongo/protocol/reply_spec.rb +3 -0
  724. data/spec/mongo/protocol/update_spec.rb +3 -0
  725. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  726. data/spec/mongo/query_cache_spec.rb +9 -2
  727. data/spec/mongo/retryable_spec.rb +6 -2
  728. data/spec/mongo/semaphore_spec.rb +3 -0
  729. data/spec/mongo/server/app_metadata_spec.rb +46 -21
  730. data/spec/mongo/server/connection_auth_spec.rb +6 -9
  731. data/spec/mongo/server/connection_common_spec.rb +75 -0
  732. data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
  733. data/spec/mongo/server/connection_pool_spec.rb +77 -8
  734. data/spec/mongo/server/connection_spec.rb +167 -56
  735. data/spec/mongo/server/description/features_spec.rb +3 -0
  736. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  737. data/spec/mongo/server/description_spec.rb +624 -611
  738. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  739. data/spec/mongo/server/monitor/connection_spec.rb +57 -7
  740. data/spec/mongo/server/monitor_spec.rb +26 -14
  741. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  742. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  743. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  744. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  745. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  746. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  747. data/spec/mongo/server_selector_spec.rb +5 -1
  748. data/spec/mongo/server_spec.rb +18 -2
  749. data/spec/mongo/session/server_session_spec.rb +3 -0
  750. data/spec/mongo/session/session_pool_spec.rb +45 -10
  751. data/spec/mongo/session_spec.rb +3 -0
  752. data/spec/mongo/session_transaction_spec.rb +17 -37
  753. data/spec/mongo/socket/ssl_spec.rb +43 -0
  754. data/spec/mongo/socket/tcp_spec.rb +3 -0
  755. data/spec/mongo/socket/unix_spec.rb +4 -0
  756. data/spec/mongo/socket_spec.rb +5 -2
  757. data/spec/mongo/srv/monitor_spec.rb +3 -0
  758. data/spec/mongo/srv/result_spec.rb +3 -0
  759. data/spec/mongo/timeout_spec.rb +3 -0
  760. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  761. data/spec/mongo/uri/srv_protocol_spec.rb +4 -0
  762. data/spec/mongo/uri_option_parsing_spec.rb +41 -5
  763. data/spec/mongo/uri_spec.rb +3 -0
  764. data/spec/mongo/utils_spec.rb +17 -0
  765. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  766. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  767. data/spec/mongo/write_concern_spec.rb +3 -0
  768. data/spec/runners/auth.rb +22 -1
  769. data/spec/runners/change_streams/outcome.rb +3 -0
  770. data/spec/runners/change_streams/spec.rb +3 -0
  771. data/spec/runners/change_streams/test.rb +4 -1
  772. data/spec/runners/cmap/verifier.rb +3 -0
  773. data/spec/runners/cmap.rb +4 -1
  774. data/spec/runners/command_monitoring.rb +3 -0
  775. data/spec/runners/connection_string.rb +10 -7
  776. data/spec/runners/crud/context.rb +3 -0
  777. data/spec/runners/crud/operation.rb +8 -3
  778. data/spec/runners/crud/outcome.rb +3 -0
  779. data/spec/runners/crud/requirement.rb +68 -3
  780. data/spec/runners/crud/spec.rb +3 -0
  781. data/spec/runners/crud/test.rb +3 -0
  782. data/spec/runners/crud/test_base.rb +3 -0
  783. data/spec/runners/crud/verifier.rb +11 -0
  784. data/spec/runners/crud.rb +23 -1
  785. data/spec/runners/gridfs.rb +3 -0
  786. data/spec/runners/read_write_concern_document.rb +3 -0
  787. data/spec/runners/sdam/verifier.rb +3 -0
  788. data/spec/runners/sdam.rb +8 -4
  789. data/spec/runners/server_selection.rb +3 -0
  790. data/spec/runners/server_selection_rtt.rb +4 -1
  791. data/spec/runners/transactions/operation.rb +16 -2
  792. data/spec/runners/transactions/spec.rb +3 -0
  793. data/spec/runners/transactions/test.rb +6 -2
  794. data/spec/runners/transactions.rb +3 -0
  795. data/spec/runners/unified/assertions.rb +281 -0
  796. data/spec/runners/unified/change_stream_operations.rb +29 -0
  797. data/spec/runners/unified/crud_operations.rb +206 -0
  798. data/spec/runners/unified/ddl_operations.rb +106 -0
  799. data/spec/runners/unified/entity_map.rb +42 -0
  800. data/spec/runners/unified/error.rb +28 -0
  801. data/spec/runners/unified/event_subscriber.rb +104 -0
  802. data/spec/runners/unified/exceptions.rb +24 -0
  803. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  804. data/spec/runners/unified/support_operations.rb +261 -0
  805. data/spec/runners/unified/test.rb +426 -0
  806. data/spec/runners/unified/test_group.rb +31 -0
  807. data/spec/runners/unified.rb +99 -0
  808. data/spec/shared/bin/get-mongodb-download-url +17 -0
  809. data/spec/shared/bin/s3-copy +45 -0
  810. data/spec/shared/bin/s3-upload +69 -0
  811. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  812. data/spec/shared/lib/mrss/constraints.rb +92 -10
  813. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  814. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  815. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  816. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  817. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  818. data/spec/shared/lib/mrss/utils.rb +15 -0
  819. data/spec/shared/share/Dockerfile.erb +323 -0
  820. data/spec/shared/share/haproxy-1.conf +16 -0
  821. data/spec/shared/share/haproxy-2.conf +17 -0
  822. data/spec/shared/shlib/distro.sh +73 -0
  823. data/spec/shared/shlib/server.sh +367 -0
  824. data/spec/shared/shlib/set_env.sh +131 -0
  825. data/spec/solo/clean_exit_spec.rb +24 -0
  826. data/spec/spec_helper.rb +8 -3
  827. data/spec/spec_tests/auth_spec.rb +30 -13
  828. data/spec/spec_tests/change_streams_spec.rb +4 -1
  829. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  830. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  831. data/spec/spec_tests/cmap_spec.rb +7 -1
  832. data/spec/spec_tests/collection_management_spec.rb +13 -0
  833. data/spec/spec_tests/command_monitoring_spec.rb +32 -27
  834. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  835. data/spec/spec_tests/connection_string_spec.rb +3 -0
  836. data/spec/spec_tests/crud_spec.rb +3 -0
  837. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  838. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +5 -5
  839. data/spec/spec_tests/data/change_streams/{change-streams-resume-whitelist.yml → change-streams-resume-allowlist.yml} +58 -58
  840. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +46 -46
  841. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  842. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  843. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  844. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  845. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  846. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  847. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  848. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  849. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  850. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  851. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  852. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  853. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  854. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  855. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  856. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  857. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  858. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  859. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  860. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  861. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  862. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  863. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  864. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  865. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  866. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  867. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  868. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  869. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  870. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  871. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +7 -6
  872. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +2 -1
  873. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +7 -6
  874. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +2 -1
  875. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +7 -6
  876. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +2 -1
  877. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  878. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  879. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  880. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  881. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  882. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  883. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +3 -1
  884. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  885. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  886. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  887. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  888. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  889. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  890. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  891. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  892. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  893. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  894. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  895. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  896. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  897. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  898. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  899. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +5 -4
  900. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  901. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  902. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  903. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  904. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  905. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  906. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml} +5 -4
  907. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterOrSecondary.yml → non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml} +5 -4
  908. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMaster.yml → non-stale-topologyVersion-greater-NotWritablePrimary.yml} +5 -4
  909. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  910. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  911. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  912. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  913. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  914. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml} +5 -4
  915. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterOrSecondary.yml → non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml} +5 -4
  916. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMaster.yml → non-stale-topologyVersion-missing-NotWritablePrimary.yml} +5 -4
  917. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  918. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  919. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  920. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  921. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  922. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml} +5 -4
  923. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml} +5 -4
  924. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMaster.yml → non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml} +5 -4
  925. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  926. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  927. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  928. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  929. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  930. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterNoSlaveOk.yml → post-42-NotPrimaryNoSecondaryOk.yml} +5 -4
  931. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterOrSecondary.yml → post-42-NotPrimaryOrSecondary.yml} +5 -4
  932. data/spec/spec_tests/data/sdam/errors/{post-42-NotMaster.yml → post-42-NotWritablePrimary.yml} +5 -4
  933. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  934. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  935. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  936. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  937. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMaster.yml → pre-42-LegacyNotPrimary.yml} +6 -5
  938. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  939. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterOrSecondary.yml → pre-42-NotPrimaryOrSecondary.yml} +5 -4
  940. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterNoSlaveOk.yml → pre-42-NotWritablePrimary.yml} +6 -5
  941. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  942. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  943. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  944. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  945. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  946. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterNoSlaveOk.yml → stale-generation-NotPrimaryNoSecondaryOk.yml} +7 -5
  947. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterOrSecondary.yml → stale-generation-NotPrimaryOrSecondary.yml} +7 -5
  948. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMaster.yml → stale-generation-NotWritablePrimary.yml} +7 -5
  949. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  950. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  951. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  952. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  953. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMaster.yml → stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  954. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  955. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  956. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  957. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  958. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  959. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  960. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  961. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  962. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  963. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMaster.yml → stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  964. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  965. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  966. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  967. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  968. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  969. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  970. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  971. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  972. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  973. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  974. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterNoSlaveOk.yml → stale-topologyVersion-NotPrimaryNoSecondaryOk.yml} +7 -6
  975. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterOrSecondary.yml → stale-topologyVersion-NotPrimaryOrSecondary.yml} +7 -6
  976. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMaster.yml → stale-topologyVersion-NotWritablePrimary.yml} +7 -6
  977. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  978. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  979. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  980. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  981. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  982. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  983. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  984. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  985. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  986. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  987. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  988. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  989. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  990. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  991. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  992. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  993. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  994. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  995. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  996. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  997. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  998. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  999. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  1000. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  1001. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  1002. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  1003. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  1004. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  1005. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  1006. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  1007. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  1008. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  1009. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  1010. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  1011. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  1012. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  1013. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  1014. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  1015. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  1016. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  1017. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  1018. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  1019. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  1020. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  1021. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  1022. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  1023. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  1024. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  1025. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  1026. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1027. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1028. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1029. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1030. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1031. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1032. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1033. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1034. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1035. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1036. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1037. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1038. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1039. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1040. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1041. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1042. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1043. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1044. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1045. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1046. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1047. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1048. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1049. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1050. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1051. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1052. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1053. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1054. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1055. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1056. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1057. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1058. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1059. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1060. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1061. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1062. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1063. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1064. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1065. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1066. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +3 -3
  1067. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1068. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1069. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1070. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +1 -1
  1071. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +2 -2
  1072. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  1073. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  1074. data/spec/spec_tests/data/sdam_integration/{isMaster-command-error.yml → hello-command-error.yml} +22 -30
  1075. data/spec/spec_tests/data/sdam_integration/{isMaster-network-error.yml → hello-network-error.yml} +12 -16
  1076. data/spec/spec_tests/data/sdam_integration/{isMaster-timeout.yml → hello-timeout.yml} +9 -13
  1077. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  1078. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  1079. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +14 -3
  1080. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  1081. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1082. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1083. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1084. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +3 -2
  1085. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1086. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  1087. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  1088. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1089. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1090. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1091. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1092. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  1093. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  1094. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1095. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1096. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1097. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1098. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  1099. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1100. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1101. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1102. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1103. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1104. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1105. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1106. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1107. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1108. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1109. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1110. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1111. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1112. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1113. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1114. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1115. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1116. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1117. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1118. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1119. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1120. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  1121. data/spec/spec_tests/data/transactions/error-labels.yml +3 -0
  1122. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1123. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +2 -0
  1124. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1125. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  1126. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  1127. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  1128. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  1129. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  1130. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1131. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1132. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1133. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1134. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1135. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1136. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1137. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1138. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1139. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1140. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1141. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1142. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  1143. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  1144. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1145. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1146. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1147. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1148. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1149. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1150. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1151. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1152. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1153. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1154. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1155. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1156. data/spec/spec_tests/retryable_reads_spec.rb +5 -2
  1157. data/spec/spec_tests/retryable_writes_spec.rb +10 -7
  1158. data/spec/spec_tests/sdam_integration_spec.rb +4 -1
  1159. data/spec/spec_tests/sdam_monitoring_spec.rb +14 -6
  1160. data/spec/spec_tests/sdam_spec.rb +5 -2
  1161. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1162. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1163. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1164. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1165. data/spec/spec_tests/transactions_spec.rb +3 -0
  1166. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1167. data/spec/spec_tests/unified_spec.rb +18 -0
  1168. data/spec/spec_tests/uri_options_spec.rb +21 -2
  1169. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1170. data/spec/stress/cleanup_spec.rb +3 -0
  1171. data/spec/stress/connection_pool_stress_spec.rb +3 -0
  1172. data/spec/stress/connection_pool_timing_spec.rb +3 -0
  1173. data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
  1174. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1175. data/spec/support/authorization.rb +3 -0
  1176. data/spec/support/aws_utils/base.rb +3 -0
  1177. data/spec/support/aws_utils/inspector.rb +3 -0
  1178. data/spec/support/aws_utils/orchestrator.rb +3 -0
  1179. data/spec/support/aws_utils/provisioner.rb +3 -0
  1180. data/spec/support/aws_utils.rb +3 -0
  1181. data/spec/support/background_thread_registry.rb +4 -1
  1182. data/spec/support/certificates/README.md +3 -2
  1183. data/spec/support/certificates/atlas-ocsp-ca.crt +107 -25
  1184. data/spec/support/certificates/atlas-ocsp.crt +156 -40
  1185. data/spec/support/client_registry.rb +12 -5
  1186. data/spec/support/client_registry_macros.rb +7 -4
  1187. data/spec/support/cluster_tools.rb +4 -1
  1188. data/spec/support/common_shortcuts.rb +39 -7
  1189. data/spec/support/constraints.rb +3 -0
  1190. data/spec/support/crypt.rb +3 -0
  1191. data/spec/support/dns.rb +3 -0
  1192. data/spec/support/json_ext_formatter.rb +3 -0
  1193. data/spec/support/keyword_struct.rb +3 -0
  1194. data/spec/support/local_resource_registry.rb +3 -0
  1195. data/spec/support/matchers.rb +17 -1
  1196. data/spec/support/monitoring_ext.rb +3 -0
  1197. data/spec/support/primary_socket.rb +3 -0
  1198. data/spec/support/sdam_formatter_integration.rb +3 -0
  1199. data/spec/support/session_registry.rb +3 -0
  1200. data/spec/{mongo/server/app_metadata_shared.rb → support/shared/app_metadata.rb} +38 -7
  1201. data/spec/support/shared/auth_context.rb +16 -0
  1202. data/spec/support/shared/protocol.rb +3 -0
  1203. data/spec/support/shared/scram_conversation.rb +3 -0
  1204. data/spec/support/shared/server_selector.rb +6 -3
  1205. data/spec/support/shared/session.rb +7 -4
  1206. data/spec/support/spec_config.rb +99 -23
  1207. data/spec/support/spec_setup.rb +51 -38
  1208. data/spec/support/using_hash.rb +31 -0
  1209. data/spec/support/utils.rb +69 -5
  1210. data.tar.gz.sig +0 -0
  1211. metadata +1265 -1053
  1212. metadata.gz.sig +0 -0
  1213. data/lib/mongo/collection/view/builder/find_command.rb +0 -170
  1214. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1215. data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
  1216. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
  1217. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1218. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
  1219. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  1220. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  1221. data/lib/mongo/server/context.rb +0 -69
  1222. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -61
  1223. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -76
  1224. data/spec/support/cluster_config.rb +0 -207
  1225. data/spec/support/event_subscriber.rb +0 -212
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -83,11 +86,24 @@ module Mongo
83
86
  # @param [ Mongo::Server ] server The server the connection is for.
84
87
  # @param [ Hash ] options The connection options.
85
88
  #
86
- # @option options [ Integer ] :generation Connection pool's generation
87
- # for this connection.
89
+ # @option options [ Integer ] :generation The generation of this
90
+ # connection. The generation should only be specified in this option
91
+ # when not in load-balancing mode, and it should be the generation
92
+ # of the connection pool when the connection is created. In
93
+ # load-balancing mode, the generation is set on the connection
94
+ # after the handshake completes.
95
+ # @option options [ Hash ] :server_api The requested server API version.
96
+ # This hash can have the following items:
97
+ # - *:version* -- string
98
+ # - *:strict* -- boolean
99
+ # - *:deprecation_errors* -- boolean
88
100
  #
89
101
  # @since 2.0.0
90
102
  def initialize(server, options = {})
103
+ if server.load_balancer? && options[:generation]
104
+ raise ArgumentError, "Generation cannot be set when server is a load balancer"
105
+ end
106
+
91
107
  @id = server.next_connection_id
92
108
  @monitoring = server.monitoring
93
109
  @options = options.freeze
@@ -165,6 +181,15 @@ module Mongo
165
181
  # authenticated and be usable.
166
182
  @socket, @description, @compressor = do_connect
167
183
 
184
+ if server.load_balancer?
185
+ if Lint.enabled?
186
+ unless service_id
187
+ raise Error::InternalDriverError, "The connection is to a load balancer and it must have service_id set here, but does not"
188
+ end
189
+ end
190
+ @generation = connection_pool.generation_manager.generation(service_id: service_id)
191
+ end
192
+
168
193
  publish_cmap_event(
169
194
  Monitoring::Event::Cmap::ConnectionReady.new(address, id)
170
195
  )
@@ -177,7 +202,7 @@ module Mongo
177
202
  # Separate method to permit easier mocking in the test suite.
178
203
  #
179
204
  # @return [ Array<Socket, Server::Description> ] Connected socket and
180
- # a server description instance from the ismaster response of the
205
+ # a server description instance from the hello response of the
181
206
  # returned socket.
182
207
  private def do_connect
183
208
  socket = add_server_diagnostics do
@@ -306,7 +331,12 @@ module Mongo
306
331
  yield
307
332
  rescue Error::SocketError => e
308
333
  @error = e
309
- @server.unknown!(generation: e.generation, stop_push_monitor: true)
334
+ @server.unknown!(
335
+ generation: e.generation,
336
+ # or description.service_id?
337
+ service_id: e.service_id,
338
+ stop_push_monitor: true,
339
+ )
310
340
  raise
311
341
  rescue Error::SocketTimeoutError => e
312
342
  @error = e
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2019-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +30,7 @@ module Mongo
27
30
  include Monitoring::Publishable
28
31
 
29
32
  # The maximum allowed size in bytes that a user-supplied document may
30
- # take up when serialized, if the server's ismaster response does not
33
+ # take up when serialized, if the server's hello response does not
31
34
  # include maxBsonObjectSize field.
32
35
  #
33
36
  # The commands that are sent to the server may exceed this size by
@@ -63,7 +66,7 @@ module Mongo
63
66
  :update_cluster_time
64
67
 
65
68
  # Returns the server description for this connection, derived from
66
- # the isMaster response for the handshake performed on this connection.
69
+ # the hello response for the handshake performed on this connection.
67
70
  #
68
71
  # @note A connection object that hasn't yet connected (handshaken and
69
72
  # authenticated, if authentication is required) does not have a
@@ -85,12 +88,20 @@ module Mongo
85
88
  :max_message_size,
86
89
  :mongos?
87
90
 
91
+ # @return [ nil | Object ] The service id, if any.
92
+ def service_id
93
+ description&.service_id
94
+ end
95
+
88
96
  # Connection pool generation from which this connection was created.
89
97
  # May be nil.
90
98
  #
91
99
  # @return [ Integer | nil ] Connection pool generation.
92
100
  def generation
93
- options[:generation]
101
+ # If the connection is to a load balancer, @generation is set
102
+ # after handshake completes. If the connection is to another server
103
+ # type, generation is specified during connection creation.
104
+ @generation || options[:generation]
94
105
  end
95
106
 
96
107
  def app_metadata
@@ -105,7 +116,7 @@ module Mongo
105
116
  if same
106
117
  @server.app_metadata
107
118
  else
108
- AppMetadata.new(options)
119
+ AppMetadata.new(options.merge(purpose: @server.app_metadata.purpose))
109
120
  end
110
121
  end
111
122
  end
@@ -124,7 +135,7 @@ module Mongo
124
135
  #
125
136
  # @param [ Array<Message> ] messages A one-element array containing
126
137
  # the message to dispatch.
127
- # @param [ Integer ] operation_id The operation id to link messages.
138
+ # @param [ Operation::Context ] context The operation context.
128
139
  # @param [ Hash ] options
129
140
  #
130
141
  # @option options [ Boolean ] :deserialize_as_bson Whether to deserialize
@@ -133,33 +144,40 @@ module Mongo
133
144
  #
134
145
  # @return [ Protocol::Message | nil ] The reply if needed.
135
146
  #
147
+ # @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error.
148
+ #
136
149
  # @since 2.0.0
137
- def dispatch(messages, operation_id = nil, client = nil, options = {})
150
+ def dispatch(messages, context, options = {})
138
151
  # The monitoring code does not correctly handle multiple messages,
139
152
  # and the driver internally does not send more than one message at
140
153
  # a time ever. Thus prohibit multiple message use for now.
141
154
  if messages.length != 1
142
155
  raise ArgumentError, 'Can only dispatch one message at a time'
143
156
  end
157
+ if description.unknown?
158
+ raise Error::InternalDriverError, "Cannot dispatch a message on a connection with unknown description: #{description.inspect}"
159
+ end
144
160
  message = messages.first
145
- deliver(message, client, options)
161
+ deliver(message, context, options)
146
162
  end
147
163
 
148
164
  private
149
165
 
150
- def deliver(message, client, options = {})
166
+ # @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error.
167
+ def deliver(message, context, options = {})
151
168
  if Lint.enabled? && !@socket
152
169
  raise Error::LintError, "Trying to deliver a message over a disconnected connection (to #{address})"
153
170
  end
154
- buffer = serialize(message, client)
171
+ buffer = serialize(message, context)
155
172
  ensure_connected do |socket|
156
173
  operation_id = Monitoring.next_operation_id
157
- command_started(address, operation_id, message.payload,
174
+ started_event = command_started(address, operation_id, message.payload,
158
175
  socket_object_id: socket.object_id, connection_id: id,
159
176
  connection_generation: generation,
160
177
  server_connection_id: description.server_connection_id,
178
+ service_id: description.service_id,
161
179
  )
162
- start = Time.now
180
+ start = Utils.monotonic_time
163
181
  result = nil
164
182
  begin
165
183
  result = add_server_diagnostics do
@@ -171,30 +189,38 @@ module Mongo
171
189
  end
172
190
  end
173
191
  rescue Exception => e
174
- total_duration = Time.now - start
175
- command_failed(nil, address, operation_id, message.payload, e.message, total_duration)
192
+ total_duration = Utils.monotonic_time - start
193
+ command_failed(nil, address, operation_id, message.payload,
194
+ e.message, total_duration,
195
+ started_event: started_event,
196
+ service_id: description.service_id,
197
+ )
176
198
  raise
177
199
  else
178
- total_duration = Time.now - start
179
- command_completed(result, address, operation_id, message.payload, total_duration)
200
+ total_duration = Utils.monotonic_time - start
201
+ command_completed(result, address, operation_id, message.payload,
202
+ total_duration,
203
+ started_event: started_event,
204
+ service_id: description.service_id,
205
+ )
180
206
  end
181
- if client && result
182
- result = result.maybe_decrypt(client)
207
+ if result && context.decrypt?
208
+ result = result.maybe_decrypt(context)
183
209
  end
184
210
  result
185
211
  end
186
212
  end
187
213
 
188
- def serialize(message, client, buffer = BSON::ByteBuffer.new)
214
+ def serialize(message, context, buffer = BSON::ByteBuffer.new)
189
215
  # Driver specifications only mandate the fixed 16MiB limit for
190
216
  # serialized BSON documents. However, the server returns its
191
- # active serialized BSON document size limit in the ismaster response,
217
+ # active serialized BSON document size limit in the hello response,
192
218
  # which is +max_bson_object_size+ below. The +DEFAULT_MAX_BSON_OBJECT_SIZE+
193
219
  # is the 16MiB value mandated by the specifications which we use
194
- # only as the default if the server's ismaster did not contain
220
+ # only as the default if the server's hello did not contain
195
221
  # maxBsonObjectSize.
196
222
  max_bson_size = max_bson_object_size || DEFAULT_MAX_BSON_OBJECT_SIZE
197
- if client && client.encrypter && client.encrypter.encrypt?
223
+ if context.encrypt?
198
224
  # The client-side encryption specification requires bulk writes to
199
225
  # be split at a reduced maxBsonObjectSize. If this message is a bulk
200
226
  # write and its size exceeds the reduced size limit, the serializer
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -49,8 +52,67 @@ module Mongo
49
52
  # @api private
50
53
  attr_reader :pid
51
54
 
55
+ # Build a document that should be used for connection handshake.
56
+ #
57
+ # @param [ Server::AppMetadata ] app_metadata Application metadata
58
+ # @param [ BSON::Document ] speculative_auth_doc The speculative
59
+ # authentication document, if any.
60
+ # @param [ true | false ] load_balancer Whether the connection is to
61
+ # a load balancer.
62
+ # @param server_api [ Hash | nil ] server_api Server API version.
63
+ #
64
+ # @return [BSON::Document] Document that should be sent to a server
65
+ # for handshake purposes.
66
+ #
67
+ # @api private
68
+ def handshake_document(app_metadata, speculative_auth_doc: nil, load_balancer: false, server_api: nil)
69
+ serv_api = app_metadata.server_api || server_api
70
+ document = if serv_api
71
+ HELLO_DOC.merge(Utils.transform_server_api(serv_api))
72
+ else
73
+ LEGACY_HELLO_DOC
74
+ end
75
+ document.merge(app_metadata.validated_document).tap do |doc|
76
+ if speculative_auth_doc
77
+ doc.update(speculativeAuthenticate: speculative_auth_doc)
78
+ end
79
+ if load_balancer
80
+ doc.update(loadBalanced: true)
81
+ end
82
+ end
83
+ end
84
+
85
+ # Build a command that should be used for connection handshake.
86
+ #
87
+ # @param [ BSON::Document ] handshake_document Document that should be
88
+ # sent to a server for handshake purpose.
89
+ #
90
+ # @return [ Protocol::Message ] Command that should be sent to a server
91
+ # for handshake purposes.
92
+ #
93
+ # @api private
94
+ def handshake_command(handshake_document)
95
+ if handshake_document['apiVersion']
96
+ Protocol::Msg.new(
97
+ [], {}, handshake_document.merge({'$db' => Database::ADMIN})
98
+ )
99
+ else
100
+ Protocol::Query.new(
101
+ Database::ADMIN,
102
+ Database::COMMAND,
103
+ handshake_document,
104
+ :limit => -1
105
+ )
106
+ end
107
+ end
108
+
109
+
52
110
  private
53
111
 
112
+ HELLO_DOC = BSON::Document.new({ hello: 1 }).freeze
113
+
114
+ LEGACY_HELLO_DOC = BSON::Document.new({ isMaster: 1, helloOk: true }).freeze
115
+
54
116
  attr_reader :socket
55
117
 
56
118
  def set_compressor!(reply)
@@ -88,14 +150,22 @@ module Mongo
88
150
  # Server::Monitor::Connection does not reference its server, but
89
151
  # knows its address. Server::Connection delegates the address to its
90
152
  # server.
91
- note = "on #{address.seed}"
153
+ note = +"on #{address.seed}"
92
154
  if respond_to?(:id)
93
155
  note << ", connection #{generation}:#{id}"
94
156
  end
157
+ # Non-monitoring connections have service id.
158
+ # Monitoring connections do not.
159
+ if respond_to?(:service_id) && service_id
160
+ note << ", service id #{service_id}"
161
+ end
95
162
  e.add_note(note)
96
163
  if respond_to?(:generation)
97
164
  # Non-monitoring connections
98
165
  e.generation = generation
166
+ if respond_to?(:description)
167
+ e.service_id = service_id
168
+ end
99
169
  end
100
170
  raise e
101
171
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Server
20
+ class ConnectionPool
21
+
22
+ # @api private
23
+ class GenerationManager
24
+
25
+ def initialize(server:)
26
+ @map = Hash.new { |hash, key| hash[key] = 1 }
27
+ @server = server
28
+ @lock = Mutex.new
29
+ end
30
+
31
+ attr_reader :server
32
+
33
+ def generation(service_id: nil)
34
+ if service_id
35
+ unless server.load_balancer?
36
+ raise ArgumentError, "Generation scoping to services is only available in load-balanced mode, but the server at #{server.address} is not a load balancer"
37
+ end
38
+ else
39
+ if server.load_balancer?
40
+ raise ArgumentError, "The server at #{server.address} is a load balancer and therefore does not have a single global generation"
41
+ end
42
+ end
43
+ @lock.synchronize do
44
+ @map[service_id]
45
+ end
46
+ end
47
+
48
+ def bump(service_id: nil)
49
+ @lock.synchronize do
50
+ if service_id
51
+ @map[service_id] += 1
52
+ else
53
+ # When service id is not supplied, one of two things may be
54
+ # happening;
55
+ #
56
+ # 1. The pool is not to a load balancer, in which case we only
57
+ # need to increment the generation for the nil service_id.
58
+ # 2. The pool is to a load balancer, in which case we need to
59
+ # increment the generation for each service.
60
+ #
61
+ # Incrementing everything in the map accomplishes both tasks.
62
+ @map.each do |k, v|
63
+ @map[k] += 1
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2019-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -11,7 +14,6 @@
11
14
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
15
  # See the License for the specific language governing permissions and
13
16
  # limitations under the License.
14
- require 'mongo/server/connection_pool/populator'
15
17
 
16
18
  module Mongo
17
19
  class Server
@@ -108,7 +110,7 @@ module Mongo
108
110
  @server = server
109
111
  @options = options.freeze
110
112
 
111
- @generation = 1
113
+ @generation_manager = GenerationManager.new(server: server)
112
114
  @closed = false
113
115
 
114
116
  # A connection owned by this pool should be either in the
@@ -186,12 +188,14 @@ module Mongo
186
188
  @max_idle_time ||= options[:max_idle_time]
187
189
  end
188
190
 
191
+ # @api private
192
+ attr_reader :generation_manager
193
+
189
194
  # @return [ Integer ] generation Generation of connections currently
190
195
  # being used by the queue.
191
196
  #
192
- # @since 2.9.0
193
197
  # @api private
194
- attr_reader :generation
198
+ def_delegator :generation_manager, :generation
195
199
 
196
200
  # Size of the connection pool.
197
201
  #
@@ -274,7 +278,7 @@ module Mongo
274
278
  # and remains so for longer than the wait timeout.
275
279
  #
276
280
  # @since 2.9.0
277
- def check_out
281
+ def check_out(service_id: nil)
278
282
  check_invariants
279
283
 
280
284
  publish_cmap_event(
@@ -291,7 +295,7 @@ module Mongo
291
295
  raise Error::PoolClosedError.new(@server.address, self)
292
296
  end
293
297
 
294
- deadline = Time.now + wait_timeout
298
+ deadline = Utils.monotonic_time + wait_timeout
295
299
  pid = Process.pid
296
300
  connection = nil
297
301
  # It seems that synchronize sets up its own loop, thus a simple break
@@ -303,7 +307,12 @@ module Mongo
303
307
  # a connection while this thread is waiting for one.
304
308
  @lock.synchronize do
305
309
  until @available_connections.empty?
306
- connection = @available_connections.pop
310
+ connection = next_available_connection(service_id: service_id)
311
+
312
+ # If service_id is not nil, connection may be nil here
313
+ # even if there are available connections in the pool
314
+ # (they could be to other services).
315
+ break unless connection
307
316
 
308
317
  if connection.pid != pid
309
318
  log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
@@ -312,7 +321,7 @@ module Mongo
312
321
  next
313
322
  end
314
323
 
315
- if connection.generation != generation
324
+ if connection.generation != generation(service_id: connection.service_id)
316
325
  # Stale connections should be disconnected in the clear
317
326
  # method, but if any don't, check again here
318
327
  connection.disconnect!(reason: :stale)
@@ -332,16 +341,26 @@ module Mongo
332
341
  throw(:done)
333
342
  end
334
343
 
335
- # Ruby does not allow a thread to lock a mutex which it already
336
- # holds.
337
- if unsynchronized_size < max_size
338
- connection = create_connection
339
- @pending_connections << connection
340
- throw(:done)
344
+ if service_id
345
+ # If we need a connection to a particular service, we can't
346
+ # create one if we don't already have one, but we can wait
347
+ # for an in-progress operation to return such a connection
348
+ # to the pool, or for the populator to create a suitable
349
+ # connection.
350
+ else
351
+ # If we are below pool capacity, create a new connection.
352
+ #
353
+ # Ruby does not allow a thread to lock a mutex which it already
354
+ # holds.
355
+ if unsynchronized_size < max_size
356
+ connection = create_connection
357
+ @pending_connections << connection
358
+ throw(:done)
359
+ end
341
360
  end
342
361
  end
343
362
 
344
- wait = deadline - Time.now
363
+ wait = deadline - Utils.monotonic_time
345
364
  if wait <= 0
346
365
  publish_cmap_event(
347
366
  Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
@@ -351,8 +370,14 @@ module Mongo
351
370
  )
352
371
 
353
372
  msg = @lock.synchronize do
373
+ service_id_msg = if service_id
374
+ " for service #{service_id}"
375
+ else
376
+ ''
377
+ end
378
+
354
379
  "Timed out attempting to check out a connection " +
355
- "from pool for #{@server.address} after #{wait_timeout} sec. " +
380
+ "from pool for #{@server.address}#{service_id_msg} after #{wait_timeout} sec. " +
356
381
  "Connections in pool: #{@available_connections.length} available, " +
357
382
  "#{@checked_out_connections.length} checked out, " +
358
383
  "#{@pending_connections.length} pending " +
@@ -446,7 +471,7 @@ module Mongo
446
471
  # Connection was closed - for example, because it experienced
447
472
  # a network error. Nothing else needs to be done here.
448
473
  @populate_semaphore.signal
449
- elsif connection.generation != @generation
474
+ elsif connection.generation != generation(service_id: connection.service_id)
450
475
  connection.disconnect!(reason: :stale)
451
476
  @populate_semaphore.signal
452
477
  else
@@ -470,8 +495,12 @@ module Mongo
470
495
  # @option options [ true | false ] :lazy If true, do not close any of
471
496
  # the idle connections and instead let them be closed during a
472
497
  # subsequent check out operation.
498
+ # @option options [ Object ] :service_id Discard state for the specified
499
+ # service id only.
473
500
  # @option options [ true | false ] :stop_populator Whether to stop
474
501
  # the populator background thread. For internal driver use only.
502
+ # @option options [ Object ] :service_id Clear connections with
503
+ # the specified service id only.
475
504
  #
476
505
  # @return [ true ] true.
477
506
  #
@@ -485,18 +514,38 @@ module Mongo
485
514
  stop_populator
486
515
  end
487
516
 
517
+ service_id = options && options[:service_id]
518
+
488
519
  @lock.synchronize do
489
- @generation += 1
520
+ @generation_manager.bump(service_id: service_id)
490
521
 
491
522
  publish_cmap_event(
492
- Monitoring::Event::Cmap::PoolCleared.new(@server.address)
523
+ Monitoring::Event::Cmap::PoolCleared.new(
524
+ @server.address,
525
+ service_id: service_id,
526
+ )
493
527
  )
494
528
 
495
529
  unless options && options[:lazy]
496
- until @available_connections.empty?
497
- connection = @available_connections.pop
498
- connection.disconnect!(reason: :stale)
499
- @populate_semaphore.signal
530
+ if service_id
531
+ loop do
532
+ conn = @available_connections.detect do |conn|
533
+ conn.service_id == service_id
534
+ end
535
+ if conn
536
+ @available_connections.delete(conn)
537
+ conn.disconnect!(reason: :stale)
538
+ @populate_semaphore.signal
539
+ else
540
+ break
541
+ end
542
+ end
543
+ else
544
+ until @available_connections.empty?
545
+ connection = @available_connections.pop
546
+ connection.disconnect!(reason: :stale)
547
+ @populate_semaphore.signal
548
+ end
500
549
  end
501
550
  end
502
551
  end
@@ -583,10 +632,10 @@ module Mongo
583
632
  # @return [ Object ] The result of the block.
584
633
  #
585
634
  # @since 2.0.0
586
- def with_connection
635
+ def with_connection(service_id: nil)
587
636
  raise_if_closed!
588
637
 
589
- connection = check_out
638
+ connection = check_out(service_id: service_id)
590
639
  yield(connection)
591
640
  ensure
592
641
  if connection
@@ -684,8 +733,6 @@ module Mongo
684
733
  # @return [ Proc ] The Finalizer.
685
734
  def self.finalize(available_connections, pending_connections, populator)
686
735
  proc do
687
- populator.stop!
688
-
689
736
  available_connections.each do |connection|
690
737
  connection.disconnect!(reason: :pool_closed)
691
738
  end
@@ -704,9 +751,33 @@ module Mongo
704
751
 
705
752
  private
706
753
 
754
+ # Returns the next available connection, optionally scoped to the
755
+ # specified service. If no suitable connections are available,
756
+ # returns nil.
757
+ def next_available_connection(service_id: nil)
758
+ if service_id
759
+ conn = @available_connections.detect do |conn|
760
+ conn.service_id == service_id
761
+ end
762
+ if conn
763
+ @available_connections.delete(conn)
764
+ end
765
+ conn
766
+ else
767
+ @available_connections.pop
768
+ end
769
+ end
770
+
707
771
  def create_connection
708
- connection = Connection.new(@server, options.merge(generation: generation,
709
- connection_pool: self))
772
+ opts = options.merge(
773
+ connection_pool: self,
774
+ # Do not pass app metadata - this will be retrieved by the connection
775
+ # based on the auth needs.
776
+ )
777
+ unless @server.load_balancer?
778
+ opts[:generation] = generation
779
+ end
780
+ connection = Connection.new(@server, opts)
710
781
  end
711
782
 
712
783
  # Create a connection, connect it, and add it to the pool.
@@ -767,7 +838,11 @@ module Mongo
767
838
  raise
768
839
  end
769
840
  rescue Error::SocketError, Error::SocketTimeoutError => exc
770
- @server.unknown!(generation: exc.generation, stop_push_monitor: true)
841
+ @server.unknown!(
842
+ generation: exc.generation,
843
+ service_id: exc.service_id,
844
+ stop_push_monitor: true,
845
+ )
771
846
  raise
772
847
  end
773
848
 
@@ -795,3 +870,6 @@ module Mongo
795
870
  end
796
871
  end
797
872
  end
873
+
874
+ require 'mongo/server/connection_pool/generation_manager'
875
+ require 'mongo/server/connection_pool/populator'