mongo 2.14.0 → 2.16.0

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