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