mongo 2.6.2 → 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 (1777) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +12 -54
  4. data/LICENSE +1 -1
  5. data/README.md +70 -43
  6. data/Rakefile +107 -22
  7. data/lib/mongo/active_support.rb +20 -0
  8. data/lib/mongo/address/ipv4.rb +39 -6
  9. data/lib/mongo/address/ipv6.rb +39 -8
  10. data/lib/mongo/address/unix.rb +10 -4
  11. data/lib/mongo/address/validator.rb +102 -0
  12. data/lib/mongo/address.rb +153 -73
  13. data/lib/mongo/auth/aws/conversation.rb +128 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  15. data/lib/mongo/auth/aws/request.rb +286 -0
  16. data/lib/mongo/auth/aws.rb +40 -0
  17. data/lib/mongo/auth/base.rb +138 -0
  18. data/lib/mongo/auth/conversation_base.rb +87 -0
  19. data/lib/mongo/auth/cr/conversation.rb +26 -89
  20. data/lib/mongo/auth/cr.rb +14 -37
  21. data/lib/mongo/auth/credential_cache.rb +54 -0
  22. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  23. data/lib/mongo/auth/gssapi.rb +41 -0
  24. data/lib/mongo/auth/ldap/conversation.rb +14 -63
  25. data/lib/mongo/auth/ldap.rb +14 -35
  26. data/lib/mongo/auth/roles.rb +4 -1
  27. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  28. data/lib/mongo/auth/scram/conversation.rb +18 -487
  29. data/lib/mongo/auth/scram.rb +44 -56
  30. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  31. data/lib/mongo/auth/scram256.rb +34 -0
  32. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
  34. data/lib/mongo/auth/stringprep/tables.rb +5 -1
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  37. data/lib/mongo/auth/stringprep.rb +9 -5
  38. data/lib/mongo/auth/user/view.rb +31 -15
  39. data/lib/mongo/auth/user.rb +69 -19
  40. data/lib/mongo/auth/x509/conversation.rb +28 -62
  41. data/lib/mongo/auth/x509.rb +29 -33
  42. data/lib/mongo/auth.rb +96 -24
  43. data/lib/mongo/background_thread.rb +173 -0
  44. data/lib/mongo/bson.rb +4 -1
  45. data/lib/mongo/bulk_write/combineable.rb +24 -9
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
  47. data/lib/mongo/bulk_write/result.rb +5 -2
  48. data/lib/mongo/bulk_write/result_combiner.rb +18 -5
  49. data/lib/mongo/bulk_write/transformable.rb +21 -11
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +9 -2
  52. data/lib/mongo/bulk_write.rb +99 -34
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +958 -122
  55. data/lib/mongo/client_encryption.rb +106 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +39 -40
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +96 -46
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +16 -10
  59. data/lib/mongo/cluster/sdam_flow.rb +626 -0
  60. data/lib/mongo/cluster/topology/base.rb +225 -0
  61. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  62. data/lib/mongo/cluster/topology/no_replica_set_options.rb +37 -0
  63. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +172 -0
  64. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +30 -0
  65. data/lib/mongo/cluster/topology/sharded.rb +16 -116
  66. data/lib/mongo/cluster/topology/single.rb +22 -113
  67. data/lib/mongo/cluster/topology/unknown.rb +14 -152
  68. data/lib/mongo/cluster/topology.rb +78 -17
  69. data/lib/mongo/cluster.rb +833 -317
  70. data/lib/mongo/cluster_time.rb +142 -0
  71. data/lib/mongo/collection/view/aggregation.rb +39 -12
  72. data/lib/mongo/collection/view/builder/aggregation.rb +40 -11
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +21 -52
  74. data/lib/mongo/collection/view/builder.rb +4 -5
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
  76. data/lib/mongo/collection/view/change_stream.rb +102 -79
  77. data/lib/mongo/collection/view/explainable.rb +32 -10
  78. data/lib/mongo/collection/view/immutable.rb +5 -2
  79. data/lib/mongo/collection/view/iterable.rb +144 -25
  80. data/lib/mongo/collection/view/map_reduce.rb +65 -30
  81. data/lib/mongo/collection/view/readable.rb +186 -91
  82. data/lib/mongo/collection/view/writable.rb +271 -123
  83. data/lib/mongo/collection/view.rb +54 -45
  84. data/lib/mongo/collection.rb +217 -70
  85. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  86. data/lib/mongo/crypt/auto_encrypter.rb +182 -0
  87. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  88. data/lib/mongo/crypt/binary.rb +158 -0
  89. data/lib/mongo/crypt/binding.rb +1232 -0
  90. data/lib/mongo/crypt/context.rb +138 -0
  91. data/lib/mongo/crypt/data_key_context.rb +165 -0
  92. data/lib/mongo/crypt/encryption_io.rb +309 -0
  93. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  94. data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
  95. data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
  96. data/lib/mongo/crypt/handle.rb +318 -0
  97. data/lib/mongo/crypt/hooks.rb +93 -0
  98. data/lib/mongo/crypt/kms_context.rb +70 -0
  99. data/lib/mongo/crypt/status.rb +134 -0
  100. data/lib/mongo/crypt.rb +36 -0
  101. data/lib/mongo/cursor/kill_spec.rb +38 -0
  102. data/lib/mongo/cursor.rb +245 -82
  103. data/lib/mongo/database/view.rb +97 -20
  104. data/lib/mongo/database.rb +177 -29
  105. data/lib/mongo/dbref.rb +13 -3
  106. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  107. data/lib/mongo/error/auth_error.rb +32 -0
  108. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  109. data/lib/mongo/error/bulk_write_error.rb +37 -2
  110. data/lib/mongo/error/change_stream_resumable.rb +4 -1
  111. data/lib/mongo/error/closed_stream.rb +4 -1
  112. data/lib/mongo/error/connection_check_out_timeout.rb +51 -0
  113. data/lib/mongo/error/connection_perished.rb +26 -0
  114. data/lib/mongo/error/credential_check_error.rb +29 -0
  115. data/lib/mongo/error/crypt_error.rb +34 -0
  116. data/lib/mongo/error/extra_file_chunk.rb +4 -1
  117. data/lib/mongo/error/failed_string_prep_validation.rb +41 -0
  118. data/lib/mongo/error/file_not_found.rb +4 -1
  119. data/lib/mongo/error/handshake_error.rb +27 -0
  120. data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
  121. data/lib/mongo/error/internal_driver_error.rb +25 -0
  122. data/lib/mongo/error/invalid_address.rb +27 -0
  123. data/lib/mongo/error/invalid_application_name.rb +4 -1
  124. data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
  125. data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
  126. data/lib/mongo/error/invalid_collection_name.rb +4 -1
  127. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  128. data/lib/mongo/error/invalid_database_name.rb +4 -1
  129. data/lib/mongo/error/invalid_document.rb +4 -1
  130. data/lib/mongo/error/invalid_file.rb +4 -1
  131. data/lib/mongo/error/invalid_file_revision.rb +4 -1
  132. data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
  133. data/lib/mongo/error/invalid_nonce.rb +5 -2
  134. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  135. data/lib/mongo/error/invalid_read_option.rb +4 -1
  136. data/lib/mongo/error/invalid_replacement_document.rb +4 -1
  137. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  138. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  139. data/lib/mongo/error/invalid_server_preference.rb +10 -1
  140. data/lib/mongo/error/invalid_session.rb +6 -2
  141. data/lib/mongo/error/invalid_signature.rb +4 -1
  142. data/lib/mongo/error/invalid_transaction_operation.rb +5 -2
  143. data/lib/mongo/error/invalid_txt_record.rb +4 -1
  144. data/lib/mongo/error/invalid_update_document.rb +4 -1
  145. data/lib/mongo/error/invalid_uri.rb +4 -1
  146. data/lib/mongo/error/invalid_write_concern.rb +6 -3
  147. data/lib/mongo/error/kms_error.rb +25 -0
  148. data/lib/mongo/error/lint_error.rb +4 -1
  149. data/lib/mongo/error/max_bson_size.rb +18 -4
  150. data/lib/mongo/error/max_message_size.rb +4 -1
  151. data/lib/mongo/error/mismatched_domain.rb +4 -1
  152. data/lib/mongo/error/missing_file_chunk.rb +4 -1
  153. data/lib/mongo/error/missing_password.rb +32 -0
  154. data/lib/mongo/error/missing_resume_token.rb +4 -1
  155. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  156. data/lib/mongo/error/missing_service_id.rb +26 -0
  157. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  158. data/lib/mongo/error/multi_index_drop.rb +4 -1
  159. data/lib/mongo/error/need_primary_server.rb +4 -1
  160. data/lib/mongo/error/no_server_available.rb +17 -5
  161. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  162. data/lib/mongo/error/no_srv_records.rb +4 -1
  163. data/lib/mongo/error/notable.rb +90 -0
  164. data/lib/mongo/error/operation_failure.rb +168 -45
  165. data/lib/mongo/error/parser.rb +174 -19
  166. data/lib/mongo/error/pool_closed_error.rb +53 -0
  167. data/lib/mongo/error/raise_original_error.rb +32 -0
  168. data/lib/mongo/error/sdam_error_detection.rb +83 -0
  169. data/lib/mongo/error/server_api_conflict.rb +26 -0
  170. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  171. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  172. data/lib/mongo/error/session_ended.rb +30 -0
  173. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  174. data/lib/mongo/error/socket_error.rb +4 -1
  175. data/lib/mongo/error/socket_timeout_error.rb +4 -1
  176. data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
  177. data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
  178. data/lib/mongo/error/unexpected_response.rb +4 -1
  179. data/lib/mongo/error/unknown_payload_type.rb +4 -1
  180. data/lib/mongo/error/unmet_dependency.rb +24 -0
  181. data/lib/mongo/error/unsupported_array_filters.rb +10 -2
  182. data/lib/mongo/error/unsupported_collation.rb +10 -2
  183. data/lib/mongo/error/unsupported_features.rb +4 -1
  184. data/lib/mongo/error/unsupported_message_type.rb +4 -1
  185. data/lib/mongo/error/unsupported_option.rb +104 -0
  186. data/lib/mongo/error/write_retryable.rb +4 -1
  187. data/lib/mongo/error.rb +82 -7
  188. data/lib/mongo/event/base.rb +15 -3
  189. data/lib/mongo/event/listeners.rb +4 -1
  190. data/lib/mongo/event/publisher.rb +4 -1
  191. data/lib/mongo/event/subscriber.rb +4 -1
  192. data/lib/mongo/event.rb +8 -7
  193. data/lib/mongo/grid/file/chunk.rb +8 -5
  194. data/lib/mongo/grid/file/info.rb +14 -4
  195. data/lib/mongo/grid/file.rb +9 -1
  196. data/lib/mongo/grid/fs_bucket.rb +143 -62
  197. data/lib/mongo/grid/stream/read.rb +68 -31
  198. data/lib/mongo/grid/stream/write.rb +34 -9
  199. data/lib/mongo/grid/stream.rb +4 -1
  200. data/lib/mongo/grid.rb +4 -1
  201. data/lib/mongo/id.rb +69 -0
  202. data/lib/mongo/index/view.rb +94 -46
  203. data/lib/mongo/index.rb +5 -1
  204. data/lib/mongo/lint.rb +65 -5
  205. data/lib/mongo/loggable.rb +9 -2
  206. data/lib/mongo/logger.rb +7 -6
  207. data/lib/mongo/monitoring/cmap_log_subscriber.rb +56 -0
  208. data/lib/mongo/monitoring/command_log_subscriber.rb +24 -4
  209. data/lib/mongo/monitoring/event/cmap/base.rb +31 -0
  210. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +88 -0
  211. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +59 -0
  212. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +74 -0
  213. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +75 -0
  214. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +106 -0
  215. data/lib/mongo/monitoring/event/cmap/connection_created.rb +67 -0
  216. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +67 -0
  217. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +63 -0
  218. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +68 -0
  219. data/lib/mongo/monitoring/event/cmap/pool_created.rb +75 -0
  220. data/lib/mongo/monitoring/event/cmap.rb +28 -0
  221. data/lib/mongo/monitoring/event/command_failed.rb +44 -6
  222. data/lib/mongo/monitoring/event/command_started.rb +90 -5
  223. data/lib/mongo/monitoring/event/command_succeeded.rb +41 -4
  224. data/lib/mongo/monitoring/event/secure.rb +45 -5
  225. data/lib/mongo/monitoring/event/server_closed.rb +17 -1
  226. data/lib/mongo/monitoring/event/server_description_changed.rb +43 -2
  227. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +92 -0
  228. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +65 -0
  229. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +84 -0
  230. data/lib/mongo/monitoring/event/server_opening.rb +11 -4
  231. data/lib/mongo/monitoring/event/topology_changed.rb +12 -6
  232. data/lib/mongo/monitoring/event/topology_closed.rb +17 -1
  233. data/lib/mongo/monitoring/event/topology_opening.rb +11 -4
  234. data/lib/mongo/monitoring/event.rb +8 -1
  235. data/lib/mongo/monitoring/publishable.rb +49 -49
  236. data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
  237. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
  238. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
  239. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
  240. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -5
  241. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
  242. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +5 -2
  243. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  244. data/lib/mongo/monitoring.rb +116 -10
  245. data/lib/mongo/operation/aggregate/command.rb +17 -21
  246. data/lib/mongo/operation/aggregate/op_msg.rb +7 -30
  247. data/lib/mongo/operation/aggregate/result.rb +28 -11
  248. data/lib/mongo/operation/aggregate.rb +6 -20
  249. data/lib/mongo/operation/collections_info/command.rb +48 -0
  250. data/lib/mongo/operation/collections_info/result.rb +23 -3
  251. data/lib/mongo/operation/collections_info.rb +18 -29
  252. data/lib/mongo/operation/command/command.rb +6 -3
  253. data/lib/mongo/operation/command/op_msg.rb +5 -27
  254. data/lib/mongo/operation/command.rb +5 -19
  255. data/lib/mongo/operation/context.rb +120 -0
  256. data/lib/mongo/operation/count/command.rb +12 -3
  257. data/lib/mongo/operation/count/op_msg.rb +7 -7
  258. data/lib/mongo/operation/count.rb +5 -19
  259. data/lib/mongo/operation/create/command.rb +13 -4
  260. data/lib/mongo/operation/create/op_msg.rb +9 -16
  261. data/lib/mongo/operation/create.rb +5 -19
  262. data/lib/mongo/operation/create_index/command.rb +24 -5
  263. data/lib/mongo/operation/create_index/op_msg.rb +24 -20
  264. data/lib/mongo/operation/create_index.rb +5 -19
  265. data/lib/mongo/operation/create_user/command.rb +8 -4
  266. data/lib/mongo/operation/create_user/op_msg.rb +7 -19
  267. data/lib/mongo/operation/create_user.rb +5 -19
  268. data/lib/mongo/operation/delete/bulk_result.rb +7 -2
  269. data/lib/mongo/operation/delete/command.rb +15 -22
  270. data/lib/mongo/operation/delete/legacy.rb +15 -20
  271. data/lib/mongo/operation/delete/op_msg.rb +20 -28
  272. data/lib/mongo/operation/delete/result.rb +9 -3
  273. data/lib/mongo/operation/delete.rb +4 -1
  274. data/lib/mongo/operation/distinct/command.rb +12 -3
  275. data/lib/mongo/operation/distinct/op_msg.rb +9 -16
  276. data/lib/mongo/operation/distinct.rb +5 -19
  277. data/lib/mongo/operation/drop/command.rb +6 -3
  278. data/lib/mongo/operation/drop/op_msg.rb +6 -20
  279. data/lib/mongo/operation/drop.rb +5 -19
  280. data/lib/mongo/operation/drop_database/command.rb +6 -3
  281. data/lib/mongo/operation/drop_database/op_msg.rb +6 -20
  282. data/lib/mongo/operation/drop_database.rb +5 -19
  283. data/lib/mongo/operation/drop_index/command.rb +7 -4
  284. data/lib/mongo/operation/drop_index/op_msg.rb +7 -19
  285. data/lib/mongo/operation/drop_index.rb +5 -19
  286. data/lib/mongo/operation/explain/command.rb +23 -19
  287. data/lib/mongo/operation/explain/legacy.rb +18 -19
  288. data/lib/mongo/operation/explain/op_msg.rb +17 -26
  289. data/lib/mongo/operation/explain/result.rb +8 -2
  290. data/lib/mongo/operation/explain.rb +5 -21
  291. data/lib/mongo/operation/find/builder/command.rb +110 -0
  292. data/lib/mongo/operation/find/builder/flags.rb +61 -0
  293. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  294. data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
  295. data/lib/mongo/operation/find/builder.rb +21 -0
  296. data/lib/mongo/operation/find/command.rb +16 -19
  297. data/lib/mongo/operation/find/legacy/result.rb +8 -2
  298. data/lib/mongo/operation/find/legacy.rb +16 -19
  299. data/lib/mongo/operation/find/op_msg.rb +17 -33
  300. data/lib/mongo/operation/find/result.rb +18 -2
  301. data/lib/mongo/operation/find.rb +6 -21
  302. data/lib/mongo/operation/get_more/command.rb +8 -19
  303. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +5 -2
  305. data/lib/mongo/operation/get_more/op_msg.rb +10 -37
  306. data/lib/mongo/operation/get_more/result.rb +17 -2
  307. data/lib/mongo/operation/get_more.rb +6 -11
  308. data/lib/mongo/operation/indexes/command.rb +7 -19
  309. data/lib/mongo/operation/indexes/legacy.rb +11 -20
  310. data/lib/mongo/operation/indexes/op_msg.rb +7 -30
  311. data/lib/mongo/operation/indexes/result.rb +10 -2
  312. data/lib/mongo/operation/indexes.rb +15 -17
  313. data/lib/mongo/operation/insert/bulk_result.rb +15 -3
  314. data/lib/mongo/operation/insert/command.rb +14 -20
  315. data/lib/mongo/operation/insert/legacy.rb +15 -19
  316. data/lib/mongo/operation/insert/op_msg.rb +17 -27
  317. data/lib/mongo/operation/insert/result.rb +16 -5
  318. data/lib/mongo/operation/insert.rb +6 -2
  319. data/lib/mongo/operation/kill_cursors/command.rb +14 -3
  320. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  321. data/lib/mongo/operation/kill_cursors/legacy.rb +7 -3
  322. data/lib/mongo/operation/kill_cursors/op_msg.rb +12 -16
  323. data/lib/mongo/operation/kill_cursors.rb +6 -21
  324. data/lib/mongo/operation/list_collections/command.rb +9 -23
  325. data/lib/mongo/operation/list_collections/op_msg.rb +9 -31
  326. data/lib/mongo/operation/list_collections/result.rb +20 -3
  327. data/lib/mongo/operation/list_collections.rb +5 -19
  328. data/lib/mongo/operation/map_reduce/command.rb +15 -19
  329. data/lib/mongo/operation/map_reduce/op_msg.rb +8 -31
  330. data/lib/mongo/operation/map_reduce/result.rb +15 -2
  331. data/lib/mongo/operation/map_reduce.rb +5 -19
  332. data/lib/mongo/operation/op_msg_base.rb +33 -0
  333. data/lib/mongo/operation/parallel_scan/command.rb +13 -23
  334. data/lib/mongo/operation/parallel_scan/op_msg.rb +12 -30
  335. data/lib/mongo/operation/parallel_scan/result.rb +9 -2
  336. data/lib/mongo/operation/parallel_scan.rb +5 -19
  337. data/lib/mongo/operation/remove_user/command.rb +8 -4
  338. data/lib/mongo/operation/remove_user/op_msg.rb +7 -19
  339. data/lib/mongo/operation/remove_user.rb +5 -19
  340. data/lib/mongo/operation/result.rb +157 -40
  341. data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
  342. data/lib/mongo/operation/shared/causal_consistency_supported.rb +19 -7
  343. data/lib/mongo/operation/shared/executable.rb +97 -13
  344. data/lib/mongo/operation/shared/executable_no_validate.rb +32 -0
  345. data/lib/mongo/operation/shared/executable_transaction_label.rb +30 -0
  346. data/lib/mongo/operation/shared/idable.rb +6 -2
  347. data/lib/mongo/operation/shared/limited.rb +14 -2
  348. data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
  349. data/lib/mongo/operation/shared/op_msg_or_command.rb +41 -0
  350. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +44 -0
  351. data/lib/mongo/operation/shared/polymorphic_lookup.rb +36 -0
  352. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  353. data/lib/mongo/operation/shared/polymorphic_result.rb +50 -0
  354. data/lib/mongo/operation/shared/read_preference_supported.rb +82 -23
  355. data/lib/mongo/operation/shared/response_handling.rb +173 -0
  356. data/lib/mongo/operation/shared/result/aggregatable.rb +8 -9
  357. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
  358. data/lib/mongo/operation/shared/sessions_supported.rb +152 -46
  359. data/lib/mongo/operation/shared/specifiable.rb +40 -56
  360. data/lib/mongo/operation/shared/validatable.rb +87 -0
  361. data/lib/mongo/operation/shared/write.rb +33 -24
  362. data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
  363. data/lib/mongo/operation/update/bulk_result.rb +5 -2
  364. data/lib/mongo/operation/update/command.rb +15 -22
  365. data/lib/mongo/operation/update/legacy/result.rb +13 -2
  366. data/lib/mongo/operation/update/legacy.rb +25 -29
  367. data/lib/mongo/operation/update/op_msg.rb +18 -30
  368. data/lib/mongo/operation/update/result.rb +14 -3
  369. data/lib/mongo/operation/update.rb +4 -1
  370. data/lib/mongo/operation/update_user/command.rb +8 -4
  371. data/lib/mongo/operation/update_user/op_msg.rb +7 -19
  372. data/lib/mongo/operation/update_user.rb +5 -19
  373. data/lib/mongo/operation/users_info/command.rb +8 -20
  374. data/lib/mongo/operation/users_info/op_msg.rb +8 -29
  375. data/lib/mongo/operation/users_info/result.rb +8 -2
  376. data/lib/mongo/operation/users_info.rb +5 -19
  377. data/lib/mongo/operation/write_command/command.rb +51 -0
  378. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  379. data/lib/mongo/operation/write_command.rb +32 -0
  380. data/lib/mongo/operation.rb +26 -1
  381. data/lib/mongo/options/mapper.rb +13 -3
  382. data/lib/mongo/options/redacted.rb +4 -1
  383. data/lib/mongo/options.rb +4 -1
  384. data/lib/mongo/protocol/bit_vector.rb +6 -2
  385. data/lib/mongo/protocol/compressed.rb +62 -14
  386. data/lib/mongo/protocol/delete.rb +4 -1
  387. data/lib/mongo/protocol/get_more.rb +6 -2
  388. data/lib/mongo/protocol/insert.rb +7 -2
  389. data/lib/mongo/protocol/kill_cursors.rb +10 -14
  390. data/lib/mongo/protocol/message.rb +161 -29
  391. data/lib/mongo/protocol/msg.rb +271 -41
  392. data/lib/mongo/protocol/query.rb +98 -43
  393. data/lib/mongo/protocol/registry.rb +4 -1
  394. data/lib/mongo/protocol/reply.rb +4 -1
  395. data/lib/mongo/protocol/serializers.rb +67 -20
  396. data/lib/mongo/protocol/update.rb +10 -3
  397. data/lib/mongo/protocol.rb +3 -0
  398. data/lib/mongo/query_cache.rb +275 -0
  399. data/lib/mongo/retryable.rb +391 -72
  400. data/lib/mongo/semaphore.rb +49 -0
  401. data/lib/mongo/server/app_metadata.rb +267 -0
  402. data/lib/mongo/server/connection.rb +197 -135
  403. data/lib/mongo/server/connection_base.rb +276 -0
  404. data/lib/mongo/server/connection_common.rb +205 -0
  405. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  406. data/lib/mongo/server/connection_pool/populator.rb +61 -0
  407. data/lib/mongo/server/connection_pool.rb +792 -58
  408. data/lib/mongo/server/description/features.rb +50 -17
  409. data/lib/mongo/server/description/load_balancer.rb +33 -0
  410. data/lib/mongo/server/description.rb +314 -75
  411. data/lib/mongo/server/monitor/app_metadata.rb +37 -0
  412. data/lib/mongo/server/monitor/connection.rb +178 -112
  413. data/lib/mongo/server/monitor.rb +246 -110
  414. data/lib/mongo/server/pending_connection.rb +288 -0
  415. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  416. data/lib/mongo/server/push_monitor.rb +194 -0
  417. data/lib/mongo/server/round_trip_time_averager.rb +76 -0
  418. data/lib/mongo/server.rb +416 -73
  419. data/lib/mongo/server_selector/base.rb +629 -0
  420. data/lib/mongo/server_selector/nearest.rb +32 -25
  421. data/lib/mongo/server_selector/primary.rb +30 -32
  422. data/lib/mongo/server_selector/primary_preferred.rb +38 -29
  423. data/lib/mongo/server_selector/secondary.rb +32 -25
  424. data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
  425. data/lib/mongo/server_selector.rb +15 -2
  426. data/lib/mongo/session/server_session.rb +21 -7
  427. data/lib/mongo/session/session_pool.rb +32 -9
  428. data/lib/mongo/session.rb +747 -375
  429. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  430. data/lib/mongo/socket/ocsp_verifier.rb +345 -0
  431. data/lib/mongo/socket/ssl.rb +285 -69
  432. data/lib/mongo/socket/tcp.rb +49 -33
  433. data/lib/mongo/socket/unix.rb +24 -34
  434. data/lib/mongo/socket.rb +218 -48
  435. data/lib/mongo/srv/monitor.rb +113 -0
  436. data/lib/mongo/srv/resolver.rb +137 -0
  437. data/lib/mongo/srv/result.rb +128 -0
  438. data/lib/mongo/srv.rb +20 -0
  439. data/lib/mongo/timeout.rb +54 -0
  440. data/lib/mongo/topology_version.rb +92 -0
  441. data/lib/mongo/uri/options_mapper.rb +624 -0
  442. data/lib/mongo/uri/srv_protocol.rb +141 -60
  443. data/lib/mongo/uri.rb +194 -302
  444. data/lib/mongo/utils.rb +111 -0
  445. data/lib/mongo/version.rb +5 -2
  446. data/lib/mongo/write_concern/acknowledged.rb +17 -4
  447. data/lib/mongo/write_concern/base.rb +70 -0
  448. data/lib/mongo/write_concern/unacknowledged.rb +17 -4
  449. data/lib/mongo/write_concern.rb +19 -35
  450. data/lib/mongo.rb +65 -3
  451. data/mongo.gemspec +15 -9
  452. data/spec/NOTES.aws-auth.md +296 -0
  453. data/spec/README.aws-auth.md +318 -0
  454. data/spec/README.md +715 -0
  455. data/spec/USERS.md +72 -0
  456. data/spec/atlas/atlas_connectivity_spec.rb +10 -37
  457. data/spec/atlas/operations_spec.rb +28 -0
  458. data/spec/integration/auth_spec.rb +309 -0
  459. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  460. data/spec/integration/aws_auth_request_spec.rb +77 -0
  461. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  462. data/spec/integration/bson_symbol_spec.rb +39 -0
  463. data/spec/integration/bulk_insert_spec.rb +8 -3
  464. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  465. data/spec/integration/bulk_write_spec.rb +70 -0
  466. data/spec/integration/change_stream_examples_spec.rb +60 -42
  467. data/spec/integration/change_stream_spec.rb +499 -56
  468. data/spec/integration/check_clean_slate_spec.rb +19 -0
  469. data/spec/integration/client_authentication_options_spec.rb +514 -0
  470. data/spec/integration/client_connectivity_spec.rb +41 -0
  471. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  472. data/spec/integration/client_construction_spec.rb +293 -0
  473. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  474. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  475. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
  476. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  477. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
  478. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
  479. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  480. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  481. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  482. data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
  483. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
  484. data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
  485. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
  486. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  487. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  488. data/spec/integration/client_spec.rb +49 -0
  489. data/spec/integration/client_update_spec.rb +157 -0
  490. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  491. data/spec/integration/command_monitoring_spec.rb +145 -53
  492. data/spec/integration/command_spec.rb +179 -0
  493. data/spec/integration/connect_single_rs_name_spec.rb +75 -0
  494. data/spec/integration/connection_pool_populator_spec.rb +305 -0
  495. data/spec/integration/connection_spec.rb +353 -0
  496. data/spec/integration/crud_spec.rb +366 -0
  497. data/spec/integration/cursor_pinning_spec.rb +121 -0
  498. data/spec/integration/cursor_reaping_spec.rb +143 -0
  499. data/spec/integration/docs_examples_spec.rb +18 -5
  500. data/spec/integration/error_detection_spec.rb +42 -0
  501. data/spec/integration/fork_reconnect_spec.rb +200 -0
  502. data/spec/integration/get_more_spec.rb +42 -0
  503. data/spec/integration/grid_fs_bucket_spec.rb +51 -0
  504. data/spec/integration/heartbeat_events_spec.rb +102 -0
  505. data/spec/integration/map_reduce_spec.rb +77 -0
  506. data/spec/integration/mmapv1_spec.rb +31 -0
  507. data/spec/integration/mongos_pinning_spec.rb +37 -0
  508. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  509. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  510. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  511. data/spec/integration/operation_failure_code_spec.rb +29 -0
  512. data/spec/integration/operation_failure_message_spec.rb +90 -0
  513. data/spec/integration/query_cache_spec.rb +1093 -0
  514. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  515. data/spec/integration/read_concern_spec.rb +92 -0
  516. data/spec/integration/read_preference_spec.rb +544 -0
  517. data/spec/integration/reconnect_spec.rb +176 -12
  518. data/spec/integration/retryable_errors_spec.rb +286 -0
  519. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +764 -0
  520. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  521. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  522. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  523. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  524. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  525. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  526. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  527. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  528. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  529. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  530. data/spec/integration/retryable_writes_errors_spec.rb +34 -0
  531. data/spec/integration/sdam_error_handling_spec.rb +426 -0
  532. data/spec/integration/sdam_events_spec.rb +138 -0
  533. data/spec/integration/sdam_prose_spec.rb +67 -0
  534. data/spec/integration/secondary_reads_spec.rb +102 -0
  535. data/spec/integration/server_description_spec.rb +48 -0
  536. data/spec/integration/server_monitor_spec.rb +56 -0
  537. data/spec/integration/server_selection_spec.rb +39 -0
  538. data/spec/integration/server_selector_spec.rb +105 -0
  539. data/spec/integration/server_spec.rb +69 -0
  540. data/spec/integration/shell_examples_spec.rb +3 -0
  541. data/spec/integration/size_limit_spec.rb +115 -0
  542. data/spec/integration/snappy_compression_spec.rb +28 -0
  543. data/spec/integration/srv_monitoring_spec.rb +406 -0
  544. data/spec/integration/srv_spec.rb +59 -0
  545. data/spec/integration/ssl_uri_options_spec.rb +28 -0
  546. data/spec/integration/step_down_spec.rb +207 -0
  547. data/spec/integration/time_zone_querying_spec.rb +55 -0
  548. data/spec/integration/transaction_pinning_spec.rb +120 -0
  549. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  550. data/spec/integration/transactions_examples_spec.rb +42 -19
  551. data/spec/integration/truncated_utf8_spec.rb +26 -0
  552. data/spec/integration/versioned_api_examples_spec.rb +114 -0
  553. data/spec/integration/x509_auth_spec.rb +112 -0
  554. data/spec/integration/zlib_compression_spec.rb +28 -0
  555. data/spec/integration/zstd_compression_spec.rb +29 -0
  556. data/spec/kerberos/kerberos_spec.rb +94 -0
  557. data/spec/lite_spec_helper.rb +146 -47
  558. data/spec/mongo/address/ipv4_spec.rb +8 -1
  559. data/spec/mongo/address/ipv6_spec.rb +7 -0
  560. data/spec/mongo/address/unix_spec.rb +4 -0
  561. data/spec/mongo/address/validator_spec.rb +54 -0
  562. data/spec/mongo/address_spec.rb +52 -21
  563. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  564. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  565. data/spec/mongo/auth/cr_spec.rb +26 -38
  566. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  567. data/spec/mongo/auth/invalid_mechanism_spec.rb +14 -0
  568. data/spec/mongo/auth/ldap/conversation_spec.rb +6 -3
  569. data/spec/mongo/auth/ldap_spec.rb +19 -34
  570. data/spec/mongo/auth/scram/conversation_spec.rb +124 -323
  571. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  572. data/spec/mongo/auth/scram_negotiation_spec.rb +531 -0
  573. data/spec/mongo/auth/scram_spec.rb +61 -108
  574. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  575. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  576. data/spec/mongo/auth/user/view_spec.rb +162 -19
  577. data/spec/mongo/auth/user_spec.rb +164 -11
  578. data/spec/mongo/auth/x509/conversation_spec.rb +8 -5
  579. data/spec/mongo/auth/x509_spec.rb +43 -32
  580. data/spec/mongo/auth_spec.rb +7 -4
  581. data/spec/mongo/bson_spec.rb +3 -0
  582. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +9 -6
  583. data/spec/mongo/bulk_write/result_spec.rb +14 -7
  584. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +7 -4
  585. data/spec/mongo/bulk_write_spec.rb +333 -129
  586. data/spec/mongo/caching_cursor_spec.rb +73 -0
  587. data/spec/mongo/client_construction_spec.rb +2620 -0
  588. data/spec/mongo/client_encryption_spec.rb +414 -0
  589. data/spec/mongo/client_spec.rb +259 -1034
  590. data/spec/mongo/cluster/cursor_reaper_spec.rb +53 -31
  591. data/spec/mongo/cluster/periodic_executor_spec.rb +21 -0
  592. data/spec/mongo/cluster/socket_reaper_spec.rb +18 -4
  593. data/spec/mongo/cluster/topology/replica_set_spec.rb +253 -267
  594. data/spec/mongo/cluster/topology/sharded_spec.rb +59 -55
  595. data/spec/mongo/cluster/topology/single_spec.rb +94 -31
  596. data/spec/mongo/cluster/topology/unknown_spec.rb +33 -115
  597. data/spec/mongo/cluster/topology_spec.rb +114 -13
  598. data/spec/mongo/cluster_spec.rb +400 -262
  599. data/spec/mongo/cluster_time_spec.rb +151 -0
  600. data/spec/mongo/collection/view/aggregation_spec.rb +65 -32
  601. data/spec/mongo/collection/view/builder/find_command_spec.rb +24 -6
  602. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  603. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  604. data/spec/mongo/collection/view/change_stream_spec.rb +70 -282
  605. data/spec/mongo/collection/view/explainable_spec.rb +91 -5
  606. data/spec/mongo/collection/view/immutable_spec.rb +4 -1
  607. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  608. data/spec/mongo/collection/view/map_reduce_spec.rb +64 -27
  609. data/spec/mongo/collection/view/readable_spec.rb +133 -45
  610. data/spec/mongo/collection/view/writable_spec.rb +276 -34
  611. data/spec/mongo/collection/view_spec.rb +13 -9
  612. data/spec/mongo/collection_crud_spec.rb +4365 -0
  613. data/spec/mongo/collection_ddl_spec.rb +537 -0
  614. data/spec/mongo/collection_spec.rb +326 -4242
  615. data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
  616. data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
  617. data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
  618. data/spec/mongo/crypt/binary_spec.rb +113 -0
  619. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  620. data/spec/mongo/crypt/binding/context_spec.rb +255 -0
  621. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  622. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
  623. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  624. data/spec/mongo/crypt/binding/version_spec.rb +20 -0
  625. data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
  626. data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
  627. data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
  628. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
  629. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
  630. data/spec/mongo/crypt/handle_spec.rb +235 -0
  631. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  632. data/spec/mongo/crypt/status_spec.rb +150 -0
  633. data/spec/mongo/cursor/builder/get_more_command_spec.rb +20 -4
  634. data/spec/mongo/cursor/builder/op_get_more_spec.rb +20 -4
  635. data/spec/mongo/cursor_spec.rb +315 -49
  636. data/spec/mongo/database_spec.rb +749 -73
  637. data/spec/mongo/dbref_spec.rb +3 -0
  638. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  639. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  640. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  641. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  642. data/spec/mongo/error/no_server_available_spec.rb +35 -0
  643. data/spec/mongo/error/notable_spec.rb +62 -0
  644. data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
  645. data/spec/mongo/error/operation_failure_spec.rb +439 -38
  646. data/spec/mongo/error/parser_spec.rb +325 -31
  647. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  648. data/spec/mongo/event/publisher_spec.rb +3 -0
  649. data/spec/mongo/event/subscriber_spec.rb +3 -0
  650. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  651. data/spec/mongo/grid/file/info_spec.rb +6 -3
  652. data/spec/mongo/grid/file_spec.rb +4 -1
  653. data/spec/mongo/grid/fs_bucket_spec.rb +76 -70
  654. data/spec/mongo/grid/stream/read_spec.rb +44 -27
  655. data/spec/mongo/grid/stream/write_spec.rb +51 -33
  656. data/spec/mongo/grid/stream_spec.rb +4 -1
  657. data/spec/mongo/id_spec.rb +38 -0
  658. data/spec/mongo/index/view_spec.rb +374 -96
  659. data/spec/mongo/lint_spec.rb +79 -0
  660. data/spec/mongo/logger_spec.rb +16 -11
  661. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +26 -0
  663. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +22 -0
  664. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +33 -0
  665. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +33 -0
  666. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +30 -0
  667. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +27 -0
  668. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +27 -0
  669. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +22 -0
  670. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +29 -0
  671. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +36 -0
  672. data/spec/mongo/monitoring/event/command_failed_spec.rb +60 -3
  673. data/spec/mongo/monitoring/event/command_started_spec.rb +4 -1
  674. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +47 -7
  675. data/spec/mongo/monitoring/event/secure_spec.rb +29 -5
  676. data/spec/mongo/monitoring/event/server_closed_spec.rb +38 -0
  677. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +38 -0
  678. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +34 -0
  679. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +34 -0
  680. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +34 -0
  681. data/spec/mongo/monitoring/event/server_opening_spec.rb +38 -0
  682. data/spec/mongo/monitoring/event/topology_changed_spec.rb +44 -0
  683. data/spec/mongo/monitoring/event/topology_closed_spec.rb +38 -0
  684. data/spec/mongo/monitoring/event/topology_opening_spec.rb +38 -0
  685. data/spec/mongo/monitoring_spec.rb +5 -2
  686. data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
  687. data/spec/mongo/operation/aggregate_spec.rb +7 -3
  688. data/spec/mongo/operation/collections_info_spec.rb +9 -3
  689. data/spec/mongo/operation/command_spec.rb +12 -6
  690. data/spec/mongo/operation/create_index_spec.rb +17 -14
  691. data/spec/mongo/operation/create_user_spec.rb +15 -6
  692. data/spec/mongo/operation/delete/bulk_spec.rb +40 -18
  693. data/spec/mongo/operation/delete/command_spec.rb +6 -2
  694. data/spec/mongo/operation/delete/op_msg_spec.rb +69 -35
  695. data/spec/mongo/operation/delete_spec.rb +35 -17
  696. data/spec/mongo/operation/drop_index_spec.rb +14 -4
  697. data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
  698. data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
  699. data/spec/mongo/operation/find/legacy_spec.rb +37 -9
  700. data/spec/mongo/operation/get_more_spec.rb +13 -3
  701. data/spec/mongo/operation/indexes_spec.rb +10 -2
  702. data/spec/mongo/operation/insert/bulk_spec.rb +42 -11
  703. data/spec/mongo/operation/insert/command_spec.rb +10 -2
  704. data/spec/mongo/operation/insert/op_msg_spec.rb +100 -57
  705. data/spec/mongo/operation/insert_spec.rb +25 -18
  706. data/spec/mongo/operation/kill_cursors_spec.rb +8 -2
  707. data/spec/mongo/operation/limited_spec.rb +8 -3
  708. data/spec/mongo/operation/map_reduce_spec.rb +10 -4
  709. data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
  710. data/spec/mongo/operation/read_preference_op_msg_spec.rb +309 -0
  711. data/spec/mongo/operation/remove_user_spec.rb +15 -5
  712. data/spec/mongo/operation/result_spec.rb +46 -6
  713. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  714. data/spec/mongo/operation/update/bulk_spec.rb +28 -9
  715. data/spec/mongo/operation/update/command_spec.rb +15 -7
  716. data/spec/mongo/operation/update/op_msg_spec.rb +74 -40
  717. data/spec/mongo/operation/update_spec.rb +21 -13
  718. data/spec/mongo/operation/update_user_spec.rb +13 -7
  719. data/spec/mongo/options/redacted_spec.rb +3 -0
  720. data/spec/mongo/protocol/compressed_spec.rb +30 -13
  721. data/spec/mongo/protocol/delete_spec.rb +13 -9
  722. data/spec/mongo/protocol/get_more_spec.rb +13 -9
  723. data/spec/mongo/protocol/insert_spec.rb +13 -9
  724. data/spec/mongo/protocol/kill_cursors_spec.rb +10 -6
  725. data/spec/mongo/protocol/msg_spec.rb +90 -61
  726. data/spec/mongo/protocol/query_spec.rb +19 -16
  727. data/spec/mongo/protocol/registry_spec.rb +4 -1
  728. data/spec/mongo/protocol/reply_spec.rb +4 -1
  729. data/spec/mongo/protocol/update_spec.rb +14 -10
  730. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  731. data/spec/mongo/query_cache_spec.rb +287 -0
  732. data/spec/mongo/retryable_spec.rb +272 -127
  733. data/spec/mongo/semaphore_spec.rb +54 -0
  734. data/spec/mongo/server/app_metadata_spec.rb +170 -0
  735. data/spec/mongo/server/connection_auth_spec.rb +136 -0
  736. data/spec/mongo/server/connection_common_spec.rb +75 -0
  737. data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
  738. data/spec/mongo/server/connection_pool_spec.rb +862 -220
  739. data/spec/mongo/server/connection_spec.rb +830 -213
  740. data/spec/mongo/server/description/features_spec.rb +3 -0
  741. data/spec/mongo/server/description_query_methods_spec.rb +291 -0
  742. data/spec/mongo/server/description_spec.rb +619 -713
  743. data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
  744. data/spec/mongo/server/monitor/connection_spec.rb +99 -40
  745. data/spec/mongo/server/monitor_spec.rb +180 -103
  746. data/spec/mongo/server/round_trip_time_averager_spec.rb +48 -0
  747. data/spec/mongo/server_selector/nearest_spec.rb +32 -25
  748. data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
  749. data/spec/mongo/server_selector/primary_spec.rb +35 -11
  750. data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
  751. data/spec/mongo/server_selector/secondary_spec.rb +27 -20
  752. data/spec/mongo/server_selector_spec.rb +208 -5
  753. data/spec/mongo/server_spec.rb +238 -51
  754. data/spec/mongo/session/server_session_spec.rb +3 -0
  755. data/spec/mongo/session/session_pool_spec.rb +66 -18
  756. data/spec/mongo/session_spec.rb +104 -8
  757. data/spec/mongo/session_transaction_spec.rb +206 -0
  758. data/spec/mongo/socket/ssl_spec.rb +472 -173
  759. data/spec/mongo/socket/tcp_spec.rb +17 -0
  760. data/spec/mongo/socket/unix_spec.rb +13 -9
  761. data/spec/mongo/socket_spec.rb +87 -10
  762. data/spec/mongo/srv/monitor_spec.rb +233 -0
  763. data/spec/mongo/srv/result_spec.rb +57 -0
  764. data/spec/mongo/timeout_spec.rb +42 -0
  765. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  766. data/spec/mongo/uri/srv_protocol_spec.rb +264 -93
  767. data/spec/mongo/uri_option_parsing_spec.rb +625 -0
  768. data/spec/mongo/uri_spec.rb +373 -89
  769. data/spec/mongo/utils_spec.rb +56 -0
  770. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  771. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  772. data/spec/mongo/write_concern_spec.rb +72 -4
  773. data/spec/runners/auth.rb +140 -0
  774. data/spec/runners/change_streams/outcome.rb +45 -0
  775. data/spec/runners/change_streams/spec.rb +60 -0
  776. data/spec/runners/change_streams/test.rb +232 -0
  777. data/spec/runners/cmap/verifier.rb +48 -0
  778. data/spec/runners/cmap.rb +373 -0
  779. data/spec/runners/command_monitoring.rb +346 -0
  780. data/spec/runners/connection_string.rb +385 -0
  781. data/spec/runners/crud/context.rb +30 -0
  782. data/spec/runners/crud/operation.rb +471 -0
  783. data/spec/runners/crud/outcome.rb +56 -0
  784. data/spec/runners/crud/requirement.rb +134 -0
  785. data/spec/runners/crud/spec.rb +73 -0
  786. data/spec/runners/crud/test.rb +123 -0
  787. data/spec/runners/crud/test_base.rb +53 -0
  788. data/spec/runners/crud/verifier.rb +217 -0
  789. data/spec/runners/crud.rb +257 -0
  790. data/spec/runners/gridfs.rb +641 -0
  791. data/spec/runners/read_write_concern_document.rb +70 -0
  792. data/spec/runners/sdam/verifier.rb +112 -0
  793. data/spec/runners/sdam.rb +279 -0
  794. data/spec/runners/server_selection.rb +365 -0
  795. data/spec/runners/server_selection_rtt.rb +41 -0
  796. data/spec/runners/transactions/operation.rb +328 -0
  797. data/spec/runners/transactions/spec.rb +29 -0
  798. data/spec/runners/transactions/test.rb +326 -0
  799. data/spec/runners/transactions.rb +104 -0
  800. data/spec/runners/unified/assertions.rb +281 -0
  801. data/spec/runners/unified/change_stream_operations.rb +29 -0
  802. data/spec/runners/unified/crud_operations.rb +206 -0
  803. data/spec/runners/unified/ddl_operations.rb +106 -0
  804. data/spec/runners/unified/entity_map.rb +42 -0
  805. data/spec/runners/unified/error.rb +28 -0
  806. data/spec/runners/unified/event_subscriber.rb +104 -0
  807. data/spec/runners/unified/exceptions.rb +24 -0
  808. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  809. data/spec/runners/unified/support_operations.rb +261 -0
  810. data/spec/runners/unified/test.rb +426 -0
  811. data/spec/runners/unified/test_group.rb +31 -0
  812. data/spec/runners/unified.rb +99 -0
  813. data/spec/shared/LICENSE +20 -0
  814. data/spec/shared/bin/get-mongodb-download-url +17 -0
  815. data/spec/shared/bin/s3-copy +45 -0
  816. data/spec/shared/bin/s3-upload +69 -0
  817. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  818. data/spec/shared/lib/mrss/cluster_config.rb +231 -0
  819. data/spec/shared/lib/mrss/constraints.rb +385 -0
  820. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  821. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  822. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  823. data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
  824. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  825. data/spec/shared/lib/mrss/utils.rb +15 -0
  826. data/spec/shared/share/Dockerfile.erb +323 -0
  827. data/spec/shared/share/haproxy-1.conf +16 -0
  828. data/spec/shared/share/haproxy-2.conf +17 -0
  829. data/spec/shared/shlib/distro.sh +73 -0
  830. data/spec/shared/shlib/server.sh +367 -0
  831. data/spec/shared/shlib/set_env.sh +131 -0
  832. data/spec/solo/clean_exit_spec.rb +24 -0
  833. data/spec/spec_helper.rb +15 -303
  834. data/spec/spec_tests/auth_spec.rb +58 -0
  835. data/spec/spec_tests/change_streams_spec.rb +60 -9
  836. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  837. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  838. data/spec/spec_tests/cmap_spec.rb +112 -0
  839. data/spec/spec_tests/collection_management_spec.rb +13 -0
  840. data/spec/spec_tests/command_monitoring_spec.rb +49 -42
  841. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  842. data/spec/spec_tests/connection_string_spec.rb +6 -111
  843. data/spec/spec_tests/crud_spec.rb +14 -35
  844. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  845. data/spec/spec_tests/data/auth/connection-string.yml +366 -0
  846. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +101 -0
  847. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
  848. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  849. data/spec/spec_tests/data/change_streams/change-streams.yml +535 -0
  850. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  851. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  852. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  853. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  854. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  855. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  856. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  857. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  858. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  859. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  860. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  861. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  862. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  863. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  864. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  865. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  866. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  867. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  868. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  869. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  870. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  871. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  872. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  873. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  874. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  875. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  876. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  877. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  878. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  879. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  880. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +27 -0
  881. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +27 -0
  882. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +27 -0
  883. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +27 -0
  884. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +24 -0
  885. data/spec/spec_tests/data/cmap/pool-checkin.yml +19 -0
  886. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +19 -0
  887. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +36 -0
  888. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +37 -0
  889. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +35 -0
  890. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +33 -0
  891. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +28 -0
  892. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  893. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +71 -0
  894. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +34 -0
  895. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +21 -0
  896. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  897. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +124 -0
  898. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +46 -0
  899. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  900. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +49 -0
  901. data/spec/{support → spec_tests/data}/command_monitoring/command.yml +0 -0
  902. data/spec/{support → spec_tests/data}/command_monitoring/deleteMany.yml +0 -0
  903. data/spec/{support → spec_tests/data}/command_monitoring/deleteOne.yml +0 -0
  904. data/spec/spec_tests/data/command_monitoring/find.yml +266 -0
  905. data/spec/spec_tests/data/command_monitoring/insertMany.yml +75 -0
  906. data/spec/{support → spec_tests/data}/command_monitoring/insertOne.yml +0 -0
  907. data/spec/{support → spec_tests/data}/command_monitoring/unacknowledgedBulkWrite.yml +0 -0
  908. data/spec/spec_tests/data/command_monitoring/updateMany.yml +65 -0
  909. data/spec/spec_tests/data/command_monitoring/updateOne.yml +90 -0
  910. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  911. data/spec/spec_tests/data/connection_string/invalid-uris.yml +261 -0
  912. data/spec/spec_tests/data/connection_string/valid-auth.yml +257 -0
  913. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-db-with-dotted-name.yml +0 -0
  914. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-host_identifiers.yml +0 -0
  915. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-options.yml +0 -0
  916. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-absolute.yml +0 -0
  917. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-relative.yml +0 -0
  918. data/spec/spec_tests/data/connection_string/valid-warnings.yml +75 -0
  919. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +18 -0
  920. data/spec/spec_tests/data/crud/read/aggregate-out.yml +44 -0
  921. data/spec/{support/crud_tests → spec_tests/data/crud}/read/aggregate.yml +0 -0
  922. data/spec/spec_tests/data/crud/read/count-collation.yml +26 -0
  923. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  924. data/spec/{support/crud_tests → spec_tests/data/crud}/read/count.yml +0 -0
  925. data/spec/spec_tests/data/crud/read/distinct-collation.yml +18 -0
  926. data/spec/{support/crud_tests → spec_tests/data/crud}/read/distinct.yml +0 -0
  927. data/spec/spec_tests/data/crud/read/find-collation.yml +16 -0
  928. data/spec/{support/crud_tests → spec_tests/data/crud}/read/find.yml +0 -0
  929. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +45 -0
  930. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +102 -0
  931. data/spec/spec_tests/data/crud/write/bulkWrite.yml +405 -0
  932. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +23 -0
  933. data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteMany.yml +0 -0
  934. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +23 -0
  935. data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteOne.yml +0 -0
  936. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +24 -0
  937. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndDelete.yml +0 -0
  938. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +25 -0
  939. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert.yml +0 -0
  940. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert_pre_2.6.yml +0 -0
  941. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace.yml +0 -0
  942. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate-arrayFilters.yml +0 -0
  943. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +28 -0
  944. data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate.yml +0 -0
  945. data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
  946. data/spec/{support/crud_tests → spec_tests/data/crud}/write/insertOne.yml +0 -0
  947. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +25 -0
  948. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-pre_2.6.yml +0 -0
  949. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-upsert.yml +0 -0
  950. data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne.yml +0 -0
  951. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +66 -0
  952. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +29 -0
  953. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany-pre_2.6.yml +0 -0
  954. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany.yml +0 -0
  955. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +114 -0
  956. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +26 -0
  957. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne-pre_2.6.yml +0 -0
  958. data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne.yml +0 -0
  959. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  960. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  961. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  962. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +111 -0
  963. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +103 -0
  964. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  965. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  966. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  967. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  968. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  969. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  970. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +39 -0
  971. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  972. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  973. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  974. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  975. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  976. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  977. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  978. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  979. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  980. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  981. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  982. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  983. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  984. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  985. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  986. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  987. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  988. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  989. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  990. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  991. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  992. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  993. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  994. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  995. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  996. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  997. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  998. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  999. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  1000. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  1001. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  1002. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  1003. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  1004. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  1005. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  1006. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +157 -0
  1007. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/delete.yml +0 -0
  1008. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download.yml +0 -0
  1009. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download_by_name.yml +0 -0
  1010. data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/upload.yml +0 -0
  1011. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  1012. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  1013. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  1014. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  1015. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +0 -0
  1016. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +0 -0
  1017. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +0 -0
  1018. data/spec/{support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml → spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml} +0 -0
  1019. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest.yml +0 -0
  1020. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +0 -0
  1021. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
  1022. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +0 -0
  1023. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +0 -0
  1024. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Secondary.yml +0 -0
  1025. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +0 -0
  1026. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +0 -0
  1027. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +0 -0
  1028. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +0 -0
  1029. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +0 -0
  1030. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +0 -0
  1031. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +0 -0
  1032. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +0 -0
  1033. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +0 -0
  1034. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +0 -0
  1035. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest.yml +0 -0
  1036. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +0 -0
  1037. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +0 -0
  1038. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +0 -0
  1039. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +0 -0
  1040. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +0 -0
  1041. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +0 -0
  1042. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +0 -0
  1043. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +0 -0
  1044. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +0 -0
  1045. data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +0 -0
  1046. data/spec/{support → spec_tests/data}/max_staleness/Sharded/Incompatible.yml +0 -0
  1047. data/spec/{support → spec_tests/data}/max_staleness/Sharded/SmallMaxStaleness.yml +0 -0
  1048. data/spec/{support → spec_tests/data}/max_staleness/Single/Incompatible.yml +0 -0
  1049. data/spec/{support → spec_tests/data}/max_staleness/Single/SmallMaxStaleness.yml +0 -0
  1050. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +15 -0
  1051. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  1052. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
  1053. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  1054. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  1055. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  1056. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  1057. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  1058. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  1059. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  1060. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  1061. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  1062. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +150 -0
  1063. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +62 -0
  1064. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +150 -0
  1065. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +66 -0
  1066. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +154 -0
  1067. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +62 -0
  1068. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  1069. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  1070. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  1071. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  1072. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  1073. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  1074. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  1075. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-pre4.9.yml +64 -0
  1076. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  1077. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +150 -0
  1078. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  1079. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  1080. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  1081. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  1082. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  1083. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  1084. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  1085. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  1086. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  1087. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  1088. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  1089. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  1090. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  1091. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  1092. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  1093. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  1094. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  1095. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  1096. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  1097. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  1098. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  1099. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  1100. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  1101. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  1102. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +62 -0
  1103. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  1104. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +130 -0
  1105. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +402 -0
  1106. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  1107. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  1108. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +73 -0
  1109. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +57 -0
  1110. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  1111. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +74 -0
  1112. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +58 -0
  1113. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  1114. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +80 -0
  1115. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +63 -0
  1116. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  1117. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +79 -0
  1118. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +62 -0
  1119. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  1120. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +84 -0
  1121. data/spec/spec_tests/data/retryable_writes/insertMany.yml +74 -0
  1122. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  1123. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +527 -0
  1124. data/spec/spec_tests/data/retryable_writes/insertOne.yml +61 -0
  1125. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  1126. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +82 -0
  1127. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +66 -0
  1128. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  1129. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  1130. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +82 -0
  1131. data/spec/spec_tests/data/retryable_writes/updateOne.yml +129 -0
  1132. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1133. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1134. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1135. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1136. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1137. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1138. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1139. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1140. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1141. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1142. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1143. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1144. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1145. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1146. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1147. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1148. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1149. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1150. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1151. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1152. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1153. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1154. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1155. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1156. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1157. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1158. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1159. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1160. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1161. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1162. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1163. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1164. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1165. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1166. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1167. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1168. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1169. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1170. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1171. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1172. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1173. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1174. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1175. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1176. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1177. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1178. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1179. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1180. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1181. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1182. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1183. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1184. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1185. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1186. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1187. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1188. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1189. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1190. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1191. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1192. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1193. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1194. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1195. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1196. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1197. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1198. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1199. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1200. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1201. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1202. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1203. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1204. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1205. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1206. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1207. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1208. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1209. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1210. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1211. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1212. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  1213. data/spec/spec_tests/data/sdam/rs/compatible.yml +45 -0
  1214. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +34 -0
  1215. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +44 -0
  1216. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1217. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1218. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +42 -0
  1219. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1220. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1221. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +83 -0
  1222. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1223. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +43 -0
  1224. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1225. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1226. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +68 -0
  1227. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +44 -0
  1228. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1229. data/spec/spec_tests/data/sdam/rs/discovery.yml +207 -0
  1230. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +57 -0
  1231. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +37 -0
  1232. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +36 -0
  1233. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +34 -0
  1234. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +36 -0
  1235. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +249 -0
  1236. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +74 -0
  1237. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +66 -0
  1238. data/spec/spec_tests/data/sdam/rs/new_primary.yml +80 -0
  1239. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +119 -0
  1240. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +119 -0
  1241. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +77 -0
  1242. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +33 -0
  1243. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +52 -0
  1244. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +102 -0
  1245. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +175 -0
  1246. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +65 -0
  1247. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +58 -0
  1248. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +55 -0
  1249. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +63 -0
  1250. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +59 -0
  1251. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +189 -0
  1252. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +189 -0
  1253. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +64 -0
  1254. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +27 -0
  1255. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1256. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +175 -0
  1257. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -0
  1258. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +30 -0
  1259. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1260. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1261. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +69 -0
  1262. data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
  1263. data/spec/spec_tests/data/sdam/rs/ruby_secondary_wrong_set_name_with_primary_second.yml +73 -0
  1264. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +55 -0
  1265. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +87 -0
  1266. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +28 -0
  1267. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +31 -0
  1268. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +75 -0
  1269. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +79 -0
  1270. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +65 -0
  1271. data/spec/spec_tests/data/sdam/rs/too_new.yml +45 -0
  1272. data/spec/spec_tests/data/sdam/rs/too_old.yml +41 -0
  1273. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1274. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1275. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1276. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +29 -0
  1277. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +117 -0
  1278. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +38 -0
  1279. data/spec/spec_tests/data/sdam/sharded/compatible.yml +40 -0
  1280. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1281. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +101 -0
  1282. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +113 -0
  1283. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +52 -0
  1284. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +47 -0
  1285. data/spec/{support → spec_tests/data}/sdam/sharded/normalize_uri_case.yml +0 -0
  1286. data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
  1287. data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
  1288. data/spec/spec_tests/data/sdam/sharded/too_new.yml +38 -0
  1289. data/spec/spec_tests/data/sdam/sharded/too_old.yml +38 -0
  1290. data/spec/spec_tests/data/sdam/single/compatible.yml +27 -0
  1291. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +37 -0
  1292. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +36 -0
  1293. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1294. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +38 -0
  1295. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +37 -0
  1296. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +38 -0
  1297. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +35 -0
  1298. data/spec/spec_tests/data/sdam/single/direct_connection_unavailable_seed.yml +28 -0
  1299. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1300. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1301. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1302. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +36 -0
  1303. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +44 -0
  1304. data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
  1305. data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
  1306. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +35 -0
  1307. data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
  1308. data/spec/spec_tests/data/sdam/single/too_new.yml +27 -0
  1309. data/spec/spec_tests/data/sdam/single/too_old.yml +25 -0
  1310. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1311. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1312. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1313. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
  1314. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
  1315. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +160 -0
  1316. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +158 -0
  1317. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +225 -0
  1318. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
  1319. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
  1320. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1321. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +70 -0
  1322. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1323. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_chain.yml +222 -0
  1324. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_change.yml +225 -0
  1325. data/spec/spec_tests/data/sdam_monitoring/replica_set_primary_address_change.yml +251 -0
  1326. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
  1327. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +113 -0
  1328. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +112 -0
  1329. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_and_secondary.yml +198 -0
  1330. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +175 -0
  1331. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +111 -0
  1332. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_second_seed_removal.yml +106 -0
  1333. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +108 -0
  1334. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +70 -0
  1335. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +86 -0
  1336. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1337. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
  1338. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1339. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1340. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1341. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1342. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
  1343. data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
  1344. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1345. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1346. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1347. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1348. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/no-results.yml +0 -0
  1349. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1350. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1351. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1352. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1353. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1354. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1355. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1356. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1357. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1358. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1359. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1360. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1361. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1362. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1363. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1364. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1365. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1366. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1367. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1368. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1369. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1370. data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  1371. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest.yml +0 -0
  1372. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_multiple.yml +0 -0
  1373. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -0
  1374. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimary.yml +0 -0
  1375. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +0 -0
  1376. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Primary.yml +0 -0
  1377. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -0
  1378. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
  1379. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary.yml +0 -0
  1380. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -0
  1381. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
  1382. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +0 -0
  1383. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +0 -0
  1384. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -0
  1385. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest.yml +0 -0
  1386. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_multiple.yml +0 -0
  1387. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -0
  1388. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Primary.yml +0 -0
  1389. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -0
  1390. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
  1391. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary.yml +0 -0
  1392. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -0
  1393. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
  1394. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +0 -0
  1395. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -0
  1396. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Nearest.yml +0 -0
  1397. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Primary.yml +0 -0
  1398. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/PrimaryPreferred.yml +0 -0
  1399. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Secondary.yml +0 -0
  1400. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/SecondaryPreferred.yml +0 -0
  1401. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Single/read/SecondaryPreferred.yml +0 -0
  1402. data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Unknown/read/SecondaryPreferred.yml +0 -0
  1403. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value.yml +0 -0
  1404. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value_zero.yml +0 -0
  1405. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_1.yml +0 -0
  1406. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_2.yml +0 -0
  1407. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_3.yml +0 -0
  1408. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_4.yml +0 -0
  1409. data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_5.yml +0 -0
  1410. data/spec/spec_tests/data/transactions/abort.yml +413 -0
  1411. data/spec/spec_tests/data/transactions/bulk.yml +267 -0
  1412. data/spec/spec_tests/data/transactions/causal-consistency.yml +175 -0
  1413. data/spec/spec_tests/data/transactions/commit.yml +603 -0
  1414. data/spec/spec_tests/data/transactions/count.yml +67 -0
  1415. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1416. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1417. data/spec/spec_tests/data/transactions/delete.yml +192 -0
  1418. data/spec/spec_tests/data/transactions/error-labels.yml +1030 -0
  1419. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  1420. data/spec/spec_tests/data/transactions/errors.yml +133 -0
  1421. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +134 -0
  1422. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +148 -0
  1423. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +236 -0
  1424. data/spec/spec_tests/data/transactions/insert.yml +390 -0
  1425. data/spec/spec_tests/data/transactions/isolation.yml +133 -0
  1426. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1674 -0
  1427. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +350 -0
  1428. data/spec/spec_tests/data/transactions/pin-mongos.yml +559 -0
  1429. data/spec/spec_tests/data/transactions/read-concern.yml +623 -0
  1430. data/spec/spec_tests/data/transactions/read-pref.yml +348 -0
  1431. data/spec/spec_tests/data/transactions/reads.yml +261 -0
  1432. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +126 -0
  1433. data/spec/spec_tests/data/transactions/retryable-abort.yml +1317 -0
  1434. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +134 -0
  1435. data/spec/spec_tests/data/transactions/retryable-commit.yml +1462 -0
  1436. data/spec/spec_tests/data/transactions/retryable-writes.yml +218 -0
  1437. data/spec/spec_tests/data/transactions/run-command.yml +197 -0
  1438. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  1439. data/spec/spec_tests/data/transactions/transaction-options.yml +781 -0
  1440. data/spec/spec_tests/data/transactions/update.yml +246 -0
  1441. data/spec/spec_tests/data/transactions/write-concern.yml +554 -0
  1442. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +170 -0
  1443. data/spec/spec_tests/data/transactions_api/callback-commits.yml +204 -0
  1444. data/spec/spec_tests/data/transactions_api/callback-retry.yml +215 -0
  1445. data/spec/spec_tests/data/transactions_api/commit-retry.yml +324 -0
  1446. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +139 -0
  1447. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +175 -0
  1448. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +216 -0
  1449. data/spec/spec_tests/data/transactions_api/commit.yml +193 -0
  1450. data/spec/spec_tests/data/transactions_api/transaction-options.yml +274 -0
  1451. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1452. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1453. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1454. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1455. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1456. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1457. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1458. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1459. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1460. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1461. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1462. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1463. data/spec/spec_tests/data/uri_options/auth-options.yml +49 -0
  1464. data/spec/spec_tests/data/uri_options/compression-options.yml +51 -0
  1465. data/spec/spec_tests/data/uri_options/concern-options.yml +55 -0
  1466. data/spec/spec_tests/data/uri_options/connection-options.yml +209 -0
  1467. data/spec/spec_tests/data/uri_options/connection-pool-options.yml +26 -0
  1468. data/spec/spec_tests/data/uri_options/read-preference-options.yml +66 -0
  1469. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1470. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1471. data/spec/spec_tests/data/uri_options/tls-options.yml +364 -0
  1472. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1473. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1474. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1475. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1476. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1477. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1478. data/spec/spec_tests/gridfs_spec.rb +6 -1
  1479. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1480. data/spec/spec_tests/max_staleness_spec.rb +7 -120
  1481. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
  1482. data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
  1483. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1484. data/spec/spec_tests/retryable_reads_spec.rb +50 -0
  1485. data/spec/spec_tests/retryable_writes_spec.rb +14 -70
  1486. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1487. data/spec/spec_tests/sdam_monitoring_spec.rb +59 -22
  1488. data/spec/spec_tests/sdam_spec.rb +156 -20
  1489. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1490. data/spec/spec_tests/server_selection_rtt_spec.rb +11 -63
  1491. data/spec/spec_tests/server_selection_spec.rb +7 -90
  1492. data/spec/spec_tests/transactions_api_spec.rb +13 -0
  1493. data/spec/spec_tests/transactions_spec.rb +8 -44
  1494. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1495. data/spec/spec_tests/unified_spec.rb +18 -0
  1496. data/spec/spec_tests/uri_options_spec.rb +93 -0
  1497. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1498. data/spec/stress/cleanup_spec.rb +61 -0
  1499. data/spec/stress/connection_pool_stress_spec.rb +204 -0
  1500. data/spec/stress/connection_pool_timing_spec.rb +184 -0
  1501. data/spec/stress/fork_reconnect_stress_spec.rb +108 -0
  1502. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1503. data/spec/support/authorization.rb +43 -173
  1504. data/spec/support/aws_utils/base.rb +137 -0
  1505. data/spec/support/aws_utils/inspector.rb +227 -0
  1506. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1507. data/spec/support/aws_utils/provisioner.rb +363 -0
  1508. data/spec/support/aws_utils.rb +65 -0
  1509. data/spec/support/background_thread_registry.rb +70 -0
  1510. data/spec/support/certificates/README.md +106 -0
  1511. data/spec/support/certificates/atlas-ocsp-ca.crt +110 -0
  1512. data/spec/support/certificates/atlas-ocsp.crt +157 -0
  1513. data/spec/support/certificates/ca.crt +76 -0
  1514. data/spec/support/certificates/client-encrypted.key +30 -0
  1515. data/spec/support/certificates/client-int.crt +78 -0
  1516. data/spec/support/certificates/client-second-level-bundle.pem +179 -0
  1517. data/spec/support/certificates/client-second-level.crt +74 -0
  1518. data/spec/support/certificates/client-second-level.key +27 -0
  1519. data/spec/support/certificates/client-second-level.pem +101 -0
  1520. data/spec/support/certificates/client-x509.crt +78 -0
  1521. data/spec/support/certificates/client-x509.key +27 -0
  1522. data/spec/support/certificates/client-x509.pem +105 -0
  1523. data/spec/support/certificates/client.crt +74 -0
  1524. data/spec/support/certificates/client.key +27 -0
  1525. data/spec/support/certificates/client.pem +90 -90
  1526. data/spec/support/certificates/crl.pem +10 -8
  1527. data/spec/support/certificates/crl_client_revoked.pem +11 -10
  1528. data/spec/support/certificates/multi-ca.crt +152 -0
  1529. data/spec/support/certificates/python-ca.crt +76 -0
  1530. data/spec/support/certificates/server-int.crt +78 -0
  1531. data/spec/support/certificates/server-second-level-bundle.pem +179 -0
  1532. data/spec/support/certificates/server-second-level.crt +74 -0
  1533. data/spec/support/certificates/server-second-level.key +27 -0
  1534. data/spec/support/certificates/server-second-level.pem +101 -0
  1535. data/spec/support/certificates/server.pem +99 -32
  1536. data/spec/support/client_registry.rb +254 -0
  1537. data/spec/support/client_registry_macros.rb +26 -0
  1538. data/spec/support/cluster_tools.rb +379 -0
  1539. data/spec/support/common_shortcuts.rb +374 -0
  1540. data/spec/support/constraints.rb +12 -73
  1541. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1542. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1543. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  1544. data/spec/support/crypt/corpus/corpus.json +3657 -0
  1545. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  1546. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1547. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1548. data/spec/support/crypt/external/external-key.json +31 -0
  1549. data/spec/support/crypt/external/external-schema.json +19 -0
  1550. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1551. data/spec/support/crypt/limits/limits-key.json +31 -0
  1552. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1553. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1554. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1555. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1556. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1557. data/spec/support/crypt.rb +157 -0
  1558. data/spec/support/dns.rb +16 -0
  1559. data/spec/support/json_ext_formatter.rb +16 -0
  1560. data/spec/support/keyword_struct.rb +29 -0
  1561. data/spec/support/local_resource_registry.rb +37 -0
  1562. data/spec/support/matchers.rb +52 -1
  1563. data/spec/support/monitoring_ext.rb +19 -0
  1564. data/spec/support/ocsp +1 -0
  1565. data/spec/support/primary_socket.rb +5 -2
  1566. data/spec/support/sdam_formatter_integration.rb +119 -0
  1567. data/spec/support/session_registry.rb +55 -0
  1568. data/spec/support/shared/app_metadata.rb +167 -0
  1569. data/spec/support/shared/auth_context.rb +16 -0
  1570. data/spec/support/shared/protocol.rb +5 -0
  1571. data/spec/support/shared/scram_conversation.rb +103 -0
  1572. data/spec/support/shared/server_selector.rb +114 -65
  1573. data/spec/support/shared/session.rb +108 -63
  1574. data/spec/support/spec_config.rb +585 -22
  1575. data/spec/support/spec_setup.rb +83 -0
  1576. data/spec/support/using_hash.rb +31 -0
  1577. data/spec/support/utils.rb +598 -0
  1578. data.tar.gz.sig +0 -0
  1579. metadata +2227 -792
  1580. metadata.gz.sig +2 -1
  1581. data/lib/mongo/cluster/app_metadata.rb +0 -158
  1582. data/lib/mongo/cluster/topology/replica_set.rb +0 -339
  1583. data/lib/mongo/collection/view/builder/find_command.rb +0 -139
  1584. data/lib/mongo/collection/view/builder/flags.rb +0 -62
  1585. data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
  1586. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1587. data/lib/mongo/cursor/builder/get_more_command.rb +0 -74
  1588. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -90
  1589. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1590. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -84
  1591. data/lib/mongo/cursor/builder.rb +0 -18
  1592. data/lib/mongo/error/failed_stringprep_validation.rb +0 -38
  1593. data/lib/mongo/event/description_changed.rb +0 -72
  1594. data/lib/mongo/event/member_discovered.rb +0 -67
  1595. data/lib/mongo/event/primary_elected.rb +0 -55
  1596. data/lib/mongo/event/standalone_discovered.rb +0 -53
  1597. data/lib/mongo/server/connectable.rb +0 -107
  1598. data/lib/mongo/server/connection_pool/queue.rb +0 -242
  1599. data/lib/mongo/server/context.rb +0 -69
  1600. data/lib/mongo/server/description/inspector/description_changed.rb +0 -57
  1601. data/lib/mongo/server/description/inspector/member_discovered.rb +0 -59
  1602. data/lib/mongo/server/description/inspector/primary_elected.rb +0 -60
  1603. data/lib/mongo/server/description/inspector/standalone_discovered.rb +0 -56
  1604. data/lib/mongo/server/description/inspector.rb +0 -81
  1605. data/lib/mongo/server_selector/selectable.rb +0 -281
  1606. data/lib/mongo/write_concern/normalizable.rb +0 -64
  1607. data/spec/integration/retryable_writes_spec.rb +0 -737
  1608. data/spec/mongo/auth/scram/negotiation_spec.rb +0 -575
  1609. data/spec/mongo/cluster/app_metadata_spec.rb +0 -133
  1610. data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
  1611. data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
  1612. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1613. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -223
  1614. data/spec/mongo/server/description/inspector/description_changed_spec.rb +0 -78
  1615. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +0 -94
  1616. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -96
  1617. data/spec/support/certificates/ca.pem +0 -17
  1618. data/spec/support/certificates/client_cert.pem +0 -21
  1619. data/spec/support/certificates/client_key.pem +0 -28
  1620. data/spec/support/certificates/client_key_encrypted.pem +0 -30
  1621. data/spec/support/certificates/password_protected.pem +0 -51
  1622. data/spec/support/change_streams/operation.rb +0 -62
  1623. data/spec/support/change_streams.rb +0 -265
  1624. data/spec/support/change_streams_tests/change-streams-errors.yml +0 -53
  1625. data/spec/support/change_streams_tests/change-streams.yml +0 -299
  1626. data/spec/support/command_monitoring/bulkWrite.yml +0 -49
  1627. data/spec/support/command_monitoring/find.yml +0 -266
  1628. data/spec/support/command_monitoring/insertMany.yml +0 -75
  1629. data/spec/support/command_monitoring/updateMany.yml +0 -67
  1630. data/spec/support/command_monitoring/updateOne.yml +0 -95
  1631. data/spec/support/command_monitoring.rb +0 -376
  1632. data/spec/support/connection_string.rb +0 -232
  1633. data/spec/support/connection_string_tests/invalid-uris.yml +0 -241
  1634. data/spec/support/connection_string_tests/valid-auth.yml +0 -241
  1635. data/spec/support/connection_string_tests/valid-warnings.yml +0 -55
  1636. data/spec/support/crud/read.rb +0 -175
  1637. data/spec/support/crud/write.rb +0 -269
  1638. data/spec/support/crud.rb +0 -320
  1639. data/spec/support/crud_tests/read/aggregate-collation.yml +0 -17
  1640. data/spec/support/crud_tests/read/aggregate-out.yml +0 -49
  1641. data/spec/support/crud_tests/read/count-collation.yml +0 -25
  1642. data/spec/support/crud_tests/read/distinct-collation.yml +0 -17
  1643. data/spec/support/crud_tests/read/find-collation.yml +0 -15
  1644. data/spec/support/crud_tests/write/bulkWrite-arrayFilters.yml +0 -44
  1645. data/spec/support/crud_tests/write/deleteMany-collation.yml +0 -22
  1646. data/spec/support/crud_tests/write/deleteOne-collation.yml +0 -22
  1647. data/spec/support/crud_tests/write/findOneAndDelete-collation.yml +0 -23
  1648. data/spec/support/crud_tests/write/findOneAndReplace-collation.yml +0 -24
  1649. data/spec/support/crud_tests/write/findOneAndUpdate-collation.yml +0 -27
  1650. data/spec/support/crud_tests/write/insertMany.yml +0 -21
  1651. data/spec/support/crud_tests/write/replaceOne-collation.yml +0 -24
  1652. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +0 -63
  1653. data/spec/support/crud_tests/write/updateMany-collation.yml +0 -28
  1654. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +0 -109
  1655. data/spec/support/crud_tests/write/updateOne-collation.yml +0 -25
  1656. data/spec/support/event_subscriber.rb +0 -66
  1657. data/spec/support/gridfs.rb +0 -638
  1658. data/spec/support/lite_constraints.rb +0 -18
  1659. data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +0 -14
  1660. data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +0 -90
  1661. data/spec/support/retryable_writes_tests/bulkWrite.yml +0 -403
  1662. data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +0 -50
  1663. data/spec/support/retryable_writes_tests/deleteOne.yml +0 -60
  1664. data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +0 -50
  1665. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +0 -61
  1666. data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +0 -54
  1667. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +0 -66
  1668. data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +0 -54
  1669. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +0 -65
  1670. data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +0 -59
  1671. data/spec/support/retryable_writes_tests/insertMany.yml +0 -77
  1672. data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +0 -471
  1673. data/spec/support/retryable_writes_tests/insertOne.yml +0 -64
  1674. data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +0 -58
  1675. data/spec/support/retryable_writes_tests/replaceOne.yml +0 -69
  1676. data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +0 -58
  1677. data/spec/support/retryable_writes_tests/updateOne.yml +0 -138
  1678. data/spec/support/sdam/rs/compatible.yml +0 -41
  1679. data/spec/support/sdam/rs/discover_arbiters.yml +0 -43
  1680. data/spec/support/sdam/rs/discover_passives.yml +0 -81
  1681. data/spec/support/sdam/rs/discover_primary.yml +0 -42
  1682. data/spec/support/sdam/rs/discover_secondary.yml +0 -43
  1683. data/spec/support/sdam/rs/discovery.yml +0 -203
  1684. data/spec/support/sdam/rs/equal_electionids.yml +0 -53
  1685. data/spec/support/sdam/rs/ghost_discovered.yml +0 -41
  1686. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +0 -36
  1687. data/spec/support/sdam/rs/ls_timeout.yml +0 -243
  1688. data/spec/support/sdam/rs/member_reconfig.yml +0 -72
  1689. data/spec/support/sdam/rs/member_standalone.yml +0 -64
  1690. data/spec/support/sdam/rs/new_primary.yml +0 -78
  1691. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -110
  1692. data/spec/support/sdam/rs/new_primary_new_setversion.yml +0 -110
  1693. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +0 -75
  1694. data/spec/support/sdam/rs/non_rs_member.yml +0 -32
  1695. data/spec/support/sdam/rs/normalize_case.yml +0 -51
  1696. data/spec/support/sdam/rs/normalize_case_me.yml +0 -100
  1697. data/spec/support/sdam/rs/null_election_id.yml +0 -164
  1698. data/spec/support/sdam/rs/primary_becomes_standalone.yml +0 -54
  1699. data/spec/support/sdam/rs/primary_changes_set_name.yml +0 -61
  1700. data/spec/support/sdam/rs/primary_disconnect.yml +0 -58
  1701. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +0 -174
  1702. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +0 -174
  1703. data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +0 -62
  1704. data/spec/support/sdam/rs/primary_mismatched_me.yml +0 -26
  1705. data/spec/support/sdam/rs/primary_reports_new_member.yml +0 -171
  1706. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +0 -79
  1707. data/spec/support/sdam/rs/primary_wrong_set_name.yml +0 -29
  1708. data/spec/support/sdam/rs/response_from_removed.yml +0 -67
  1709. data/spec/support/sdam/rs/rsother_discovered.yml +0 -66
  1710. data/spec/support/sdam/rs/sec_not_auth.yml +0 -53
  1711. data/spec/support/sdam/rs/secondary_ignore_ok_0.yml +0 -85
  1712. data/spec/support/sdam/rs/secondary_mismatched_me.yml +0 -26
  1713. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +0 -30
  1714. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +0 -73
  1715. data/spec/support/sdam/rs/set_version_without_electionid.yml +0 -69
  1716. data/spec/support/sdam/rs/setversion_without_electionid.yml +0 -75
  1717. data/spec/support/sdam/rs/stepdown_change_set_name.yml +0 -63
  1718. data/spec/support/sdam/rs/too_new.yml +0 -41
  1719. data/spec/support/sdam/rs/too_old.yml +0 -39
  1720. data/spec/support/sdam/rs/unexpected_mongos.yml +0 -28
  1721. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +0 -108
  1722. data/spec/support/sdam/rs/wrong_set_name.yml +0 -37
  1723. data/spec/support/sdam/sharded/compatible.yml +0 -38
  1724. data/spec/support/sdam/sharded/ls_timeout_mongos.yml +0 -97
  1725. data/spec/support/sdam/sharded/mongos_disconnect.yml +0 -110
  1726. data/spec/support/sdam/sharded/multiple_mongoses.yml +0 -50
  1727. data/spec/support/sdam/sharded/non_mongos_removed.yml +0 -45
  1728. data/spec/support/sdam/sharded/single_mongos.yml +0 -33
  1729. data/spec/support/sdam/sharded/too_new.yml +0 -36
  1730. data/spec/support/sdam/sharded/too_old.yml +0 -36
  1731. data/spec/support/sdam/single/compatible.yml +0 -26
  1732. data/spec/support/sdam/single/direct_connection_external_ip.yml +0 -36
  1733. data/spec/support/sdam/single/direct_connection_mongos.yml +0 -35
  1734. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +0 -37
  1735. data/spec/support/sdam/single/direct_connection_rsprimary.yml +0 -36
  1736. data/spec/support/sdam/single/direct_connection_rssecondary.yml +0 -37
  1737. data/spec/support/sdam/single/direct_connection_slave.yml +0 -34
  1738. data/spec/support/sdam/single/direct_connection_standalone.yml +0 -34
  1739. data/spec/support/sdam/single/ls_timeout_standalone.yml +0 -35
  1740. data/spec/support/sdam/single/not_ok_response.yml +0 -42
  1741. data/spec/support/sdam/single/standalone_removed.yml +0 -34
  1742. data/spec/support/sdam/single/too_new.yml +0 -26
  1743. data/spec/support/sdam/single/too_old.yml +0 -24
  1744. data/spec/support/sdam/single/unavailable_seed.yml +0 -28
  1745. data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +0 -112
  1746. data/spec/support/sdam_monitoring/replica_set_with_primary.yml +0 -111
  1747. data/spec/support/sdam_monitoring/replica_set_with_removal.yml +0 -106
  1748. data/spec/support/sdam_monitoring/required_replica_set.yml +0 -84
  1749. data/spec/support/sdam_monitoring/standalone.yml +0 -70
  1750. data/spec/support/sdam_monitoring.rb +0 -144
  1751. data/spec/support/server_discovery_and_monitoring.rb +0 -236
  1752. data/spec/support/server_selection.rb +0 -163
  1753. data/spec/support/server_selection_rtt.rb +0 -41
  1754. data/spec/support/transactions/operation.rb +0 -373
  1755. data/spec/support/transactions.rb +0 -391
  1756. data/spec/support/transactions_tests/abort.yml +0 -403
  1757. data/spec/support/transactions_tests/bulk.yml +0 -267
  1758. data/spec/support/transactions_tests/causal-consistency.yml +0 -173
  1759. data/spec/support/transactions_tests/commit.yml +0 -593
  1760. data/spec/support/transactions_tests/delete.yml +0 -184
  1761. data/spec/support/transactions_tests/error-labels.yml +0 -948
  1762. data/spec/support/transactions_tests/errors.yml +0 -125
  1763. data/spec/support/transactions_tests/findOneAndDelete.yml +0 -126
  1764. data/spec/support/transactions_tests/findOneAndReplace.yml +0 -140
  1765. data/spec/support/transactions_tests/findOneAndUpdate.yml +0 -228
  1766. data/spec/support/transactions_tests/insert.yml +0 -264
  1767. data/spec/support/transactions_tests/isolation.yml +0 -125
  1768. data/spec/support/transactions_tests/read-pref.yml +0 -340
  1769. data/spec/support/transactions_tests/reads.yml +0 -298
  1770. data/spec/support/transactions_tests/retryable-abort.yml +0 -1292
  1771. data/spec/support/transactions_tests/retryable-commit.yml +0 -1332
  1772. data/spec/support/transactions_tests/retryable-writes.yml +0 -208
  1773. data/spec/support/transactions_tests/run-command.yml +0 -189
  1774. data/spec/support/transactions_tests/transaction-options.yml +0 -877
  1775. data/spec/support/transactions_tests/update.yml +0 -246
  1776. data/spec/support/transactions_tests/write-concern.yml +0 -236
  1777. data/spec/support/travis.rb +0 -14
data/lib/mongo/cluster.rb CHANGED
@@ -1,4 +1,7 @@
1
- # Copyright (C) 2014-2018 MongoDB, Inc.
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
4
7
  # you may not use this file except in compliance with the License.
@@ -16,7 +19,6 @@ require 'mongo/cluster/topology'
16
19
  require 'mongo/cluster/reapers/socket_reaper'
17
20
  require 'mongo/cluster/reapers/cursor_reaper'
18
21
  require 'mongo/cluster/periodic_executor'
19
- require 'mongo/cluster/app_metadata'
20
22
 
21
23
  module Mongo
22
24
 
@@ -29,18 +31,20 @@ module Mongo
29
31
  include Monitoring::Publishable
30
32
  include Event::Subscriber
31
33
  include Loggable
34
+ include ClusterTime::Consumer
32
35
 
33
- # The default number of mongos read retries.
36
+ # The default number of legacy read retries.
34
37
  #
35
38
  # @since 2.1.1
36
39
  MAX_READ_RETRIES = 1
37
40
 
38
- # The default number of mongos write retries.
41
+ # The default number of legacy write retries.
39
42
  #
40
43
  # @since 2.4.2
41
44
  MAX_WRITE_RETRIES = 1
42
45
 
43
- # The default mongos read retry interval, in seconds.
46
+ # The default read retry interval, in seconds, when using legacy read
47
+ # retries.
44
48
  #
45
49
  # @since 2.1.1
46
50
  READ_RETRY_INTERVAL = 5
@@ -53,105 +57,9 @@ module Mongo
53
57
  # The cluster time key in responses from mongos servers.
54
58
  #
55
59
  # @since 2.5.0
60
+ # @deprecated
56
61
  CLUSTER_TIME = 'clusterTime'.freeze
57
62
 
58
- # @return [ Hash ] The options hash.
59
- attr_reader :options
60
-
61
- # @return [ Monitoring ] monitoring The monitoring.
62
- attr_reader :monitoring
63
-
64
- # @return [ Object ] The cluster topology.
65
- attr_reader :topology
66
-
67
- # @return [ Mongo::Cluster::AppMetadata ] The application metadata, used for connection
68
- # handshakes.
69
- #
70
- # @since 2.4.0
71
- attr_reader :app_metadata
72
-
73
- # @return [ BSON::Document ] The latest cluster time seen.
74
- #
75
- # @since 2.5.0
76
- attr_reader :cluster_time
77
-
78
- # @private
79
- #
80
- # @since 2.5.1
81
- attr_reader :session_pool
82
-
83
- def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
84
- :single?, :unknown?, :member_discovered
85
- def_delegators :@cursor_reaper, :register_cursor, :schedule_kill_cursor, :unregister_cursor
86
-
87
- # Determine if this cluster of servers is equal to another object. Checks the
88
- # servers currently in the cluster, not what was configured.
89
- #
90
- # @example Is the cluster equal to the object?
91
- # cluster == other
92
- #
93
- # @param [ Object ] other The object to compare to.
94
- #
95
- # @return [ true, false ] If the objects are equal.
96
- #
97
- # @since 2.0.0
98
- def ==(other)
99
- return false unless other.is_a?(Cluster)
100
- addresses == other.addresses && options == other.options
101
- end
102
-
103
- # Add a server to the cluster with the provided address. Useful in
104
- # auto-discovery of new servers when an existing server executes an ismaster
105
- # and potentially non-configured servers were included.
106
- #
107
- # @example Add the server for the address to the cluster.
108
- # cluster.add('127.0.0.1:27018')
109
- #
110
- # @param [ String ] host The address of the server to add.
111
- #
112
- # @return [ Server ] The newly added server, if not present already.
113
- #
114
- # @since 2.0.0
115
- def add(host)
116
- address = Address.new(host, options)
117
- if !addresses.include?(address)
118
- if addition_allowed?(address)
119
- @update_lock.synchronize { @addresses.push(address) }
120
- server = Server.new(address, self, @monitoring, event_listeners, options)
121
- @update_lock.synchronize { @servers.push(server) }
122
- server
123
- end
124
- end
125
- end
126
-
127
- # Determine if the cluster would select a readable server for the
128
- # provided read preference.
129
- #
130
- # @example Is a readable server present?
131
- # topology.has_readable_server?(server_selector)
132
- #
133
- # @param [ ServerSelector ] server_selector The server
134
- # selector.
135
- #
136
- # @return [ true, false ] If a readable server is present.
137
- #
138
- # @since 2.4.0
139
- def has_readable_server?(server_selector = nil)
140
- topology.has_readable_server?(self, server_selector)
141
- end
142
-
143
- # Determine if the cluster would select a writable server.
144
- #
145
- # @example Is a writable server present?
146
- # topology.has_writable_server?
147
- #
148
- # @return [ true, false ] If a writable server is present.
149
- #
150
- # @since 2.4.0
151
- def has_writable_server?
152
- topology.has_writable_server?(self)
153
- end
154
-
155
63
  # Instantiate the new cluster.
156
64
  #
157
65
  # @api private
@@ -172,143 +80,305 @@ module Mongo
172
80
  # options to Cluster constructor, although Cluster recognizes
173
81
  # only a subset of the options recognized by Client.
174
82
  #
83
+ # @option options [ true | false ] :direct_connection Whether to connect
84
+ # directly to the specified seed, bypassing topology discovery. Exactly
85
+ # one seed must be provided.
86
+ # @option options [ Symbol ] :connect Deprecated - use :direct_connection
87
+ # option instead of this option. The connection method to use. This
88
+ # forces the cluster to behave in the specified way instead of
89
+ # auto-discovering. One of :direct, :replica_set, :sharded
90
+ # @option options [ Symbol ] :replica_set The name of the replica set to
91
+ # connect to. Servers not in this replica set will be ignored.
92
+ # @option options [ true | false ] :scan Whether to scan all seeds
93
+ # in constructor. The default in driver version 2.x is to do so;
94
+ # driver version 3.x will not scan seeds in constructor. Opt in to the
95
+ # new behavior by setting this option to false. *Note:* setting
96
+ # this option to nil enables scanning seeds in constructor in driver
97
+ # version 2.x. Driver version 3.x will recognize this option but
98
+ # will ignore it and will never scan seeds in the constructor.
99
+ # @option options [ true | false ] :monitoring_io For internal driver
100
+ # use only. Set to false to prevent SDAM-related I/O from being
101
+ # done by this cluster or servers under it. Note: setting this option
102
+ # to false will make the cluster non-functional. It is intended for
103
+ # use in tests which manually invoke SDAM state transitions.
104
+ # @option options [ true | false ] :cleanup For internal driver use only.
105
+ # Set to false to prevent endSessions command being sent to the server
106
+ # to clean up server sessions when the cluster is disconnected, and to
107
+ # to not start the periodic executor. If :monitoring_io is false,
108
+ # :cleanup automatically defaults to false as well.
109
+ # @option options [ Float ] :heartbeat_frequency The interval, in seconds,
110
+ # for the server monitor to refresh its description via hello.
111
+ # @option options [ Hash ] :resolv_options For internal driver use only.
112
+ # Options to pass through to Resolv::DNS constructor for SRV lookups.
113
+ # @option options [ Hash ] :server_api The requested server API version.
114
+ # This hash can have the following items:
115
+ # - *:version* -- string
116
+ # - *:strict* -- boolean
117
+ # - *:deprecation_errors* -- boolean
118
+ #
175
119
  # @since 2.0.0
176
120
  def initialize(seeds, monitoring, options = Options::Redacted.new)
177
- @addresses = []
121
+ if seeds.nil?
122
+ raise ArgumentError, 'Seeds cannot be nil'
123
+ end
124
+
125
+ options = options.dup
126
+ if options[:monitoring_io] == false && !options.key?(:cleanup)
127
+ options[:cleanup] = false
128
+ end
129
+ @options = options.freeze
130
+
131
+ # @update_lock covers @servers, @connecting, @connected, @topology and
132
+ # @sessions_supported. Generally instance variables that do not have a
133
+ # designated for them lock should only be modified under the update lock.
134
+ # Note that topology change is locked by @update_lock and not by
135
+ # @sdam_flow_lock.
136
+ @update_lock = Mutex.new
178
137
  @servers = []
179
138
  @monitoring = monitoring
180
139
  @event_listeners = Event::Listeners.new
181
- @options = options.freeze
182
- @app_metadata = AppMetadata.new(self)
183
- @update_lock = Mutex.new
184
- @pool_lock = Mutex.new
185
- @cluster_time = nil
140
+ @app_metadata = Server::AppMetadata.new(@options.merge(purpose: :application))
141
+ @monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :monitor))
142
+ @push_monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :push_monitor))
186
143
  @cluster_time_lock = Mutex.new
187
- @topology = Topology.initial(seeds, monitoring, options)
144
+ @cluster_time = nil
145
+ @srv_monitor_lock = Mutex.new
146
+ @srv_monitor = nil
147
+ @server_selection_semaphore = Semaphore.new
148
+ @topology = Topology.initial(self, monitoring, options)
149
+ # State change lock is similar to the sdam flow lock, but is designed
150
+ # to serialize state changes initated by consumers of Cluster
151
+ # (e.g. application connecting or disconnecting the cluster), so that
152
+ # e.g. an application calling disconnect-connect-disconnect rapidly
153
+ # does not put the cluster into an inconsistent state.
154
+ # Monitoring updates performed internally by the driver do not take
155
+ # the state change lock.
156
+ @state_change_lock = Mutex.new
157
+ # @sdam_flow_lock covers just the sdam flow. Note it does not apply
158
+ # to @topology replacements which are done under @update_lock.
159
+ @sdam_flow_lock = Mutex.new
188
160
  Session::SessionPool.create(self)
189
161
 
162
+ if seeds.empty? && load_balanced?
163
+ raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited'
164
+ end
165
+
166
+ # The opening topology is always unknown with no servers.
167
+ # https://github.com/mongodb/specifications/pull/388
168
+ opening_topology = Topology::Unknown.new(options, monitoring, self)
169
+
190
170
  publish_sdam_event(
191
171
  Monitoring::TOPOLOGY_OPENING,
192
- Monitoring::Event::TopologyOpening.new(@topology)
172
+ Monitoring::Event::TopologyOpening.new(opening_topology)
193
173
  )
194
174
 
195
- subscribe_to(Event::STANDALONE_DISCOVERED, Event::StandaloneDiscovered.new(self))
196
- subscribe_to(Event::DESCRIPTION_CHANGED, Event::DescriptionChanged.new(self))
197
- subscribe_to(Event::MEMBER_DISCOVERED, Event::MemberDiscovered.new(self))
175
+ @seeds = seeds = seeds.uniq
176
+ servers = seeds.map do |seed|
177
+ # Server opening events must be sent after topology change events.
178
+ # Therefore separate server addition, done here before topology change
179
+ # event is published, from starting to monitor the server which is
180
+ # done later.
181
+ add(seed, monitor: false)
182
+ end
198
183
 
199
- seeds.each{ |seed| add(seed) }
184
+ if seeds.size >= 1
185
+ # Recreate the topology to get the current server list into it
186
+ recreate_topology(topology, opening_topology)
187
+ end
200
188
 
201
- publish_sdam_event(
202
- Monitoring::TOPOLOGY_CHANGED,
203
- Monitoring::Event::TopologyChanged.new(@topology, @topology)
204
- ) if @servers.size > 1
189
+ if load_balanced?
190
+ # We are required by the specifications to produce certain SDAM events
191
+ # when in load-balanced topology.
192
+ # These events don't make a lot of sense from the standpoint of the
193
+ # driver's SDAM implementation, nor from the standpoint of the
194
+ # driver's load balancer implementation.
195
+ # They are just required boilerplate.
196
+ #
197
+ # Note that this call must be done above the monitoring_io check
198
+ # because that short-circuits the rest of the constructor.
199
+ fabricate_lb_sdam_events_and_set_server_type
200
+ end
205
201
 
206
- @cursor_reaper = CursorReaper.new
207
- @socket_reaper = SocketReaper.new(self)
208
- @periodic_executor = PeriodicExecutor.new(@cursor_reaper, @socket_reaper)
209
- @periodic_executor.run!
202
+ if options[:monitoring_io] == false
203
+ # Omit periodic executor construction, because without servers
204
+ # no commands can be sent to the cluster and there shouldn't ever
205
+ # be anything that needs to be cleaned up.
206
+ #
207
+ # Omit monitoring individual servers and the legacy single round of
208
+ # of SDAM on the main thread, as it would race with tests that mock
209
+ # SDAM responses.
210
+ @connecting = @connected = false
211
+ return
212
+ end
210
213
 
211
- ObjectSpace.define_finalizer(self, self.class.finalize(pools, @periodic_executor, @session_pool))
212
- end
214
+ # Update instance variables prior to starting monitoring threads.
215
+ @connecting = false
216
+ @connected = true
213
217
 
214
- # Finalize the cluster for garbage collection. Disconnects all the scoped
215
- # connection pools.
216
- #
217
- # @example Finalize the cluster.
218
- # Cluster.finalize(pools)
219
- #
220
- # @param [ Hash<Address, Server::ConnectionPool> ] pools The connection pools.
221
- # @param [ PeriodicExecutor ] periodic_executor The periodic executor.
222
- # @param [ SessionPool ] session_pool The session pool.
223
- #
224
- # @return [ Proc ] The Finalizer.
225
- #
226
- # @since 2.2.0
227
- def self.finalize(pools, periodic_executor, session_pool)
228
- proc do
229
- session_pool.end_sessions
230
- periodic_executor.stop!
231
- pools.values.each do |pool|
232
- pool.disconnect!
233
- end
218
+ if options[:cleanup] != false
219
+ @cursor_reaper = CursorReaper.new(self)
220
+ @socket_reaper = SocketReaper.new(self)
221
+ @periodic_executor = PeriodicExecutor.new([
222
+ @cursor_reaper, @socket_reaper,
223
+ ], options)
224
+
225
+ @periodic_executor.run!
234
226
  end
235
- end
236
227
 
237
- # Get the nicer formatted string for use in inspection.
238
- #
239
- # @example Inspect the cluster.
240
- # cluster.inspect
241
- #
242
- # @return [ String ] The cluster inspection.
243
- #
244
- # @since 2.0.0
245
- def inspect
246
- "#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.display_name}>"
228
+ unless load_balanced?
229
+ # Need to record start time prior to starting monitoring
230
+ start_monotime = Utils.monotonic_time
231
+
232
+ servers.each do |server|
233
+ server.start_monitoring
234
+ end
235
+
236
+ if options[:scan] != false
237
+ server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
238
+ # The server selection timeout can be very short especially in
239
+ # tests, when the client waits for a synchronous scan before
240
+ # starting server selection. Limiting the scan to server selection time
241
+ # then aborts the scan before it can process even local servers.
242
+ # Therefore, allow at least 3 seconds for the scan here.
243
+ if server_selection_timeout < 3
244
+ server_selection_timeout = 3
245
+ end
246
+ deadline = start_monotime + server_selection_timeout
247
+ # Wait for the first scan of each server to complete, for
248
+ # backwards compatibility.
249
+ # If any servers are discovered during this SDAM round we are going to
250
+ # wait for these servers to also be queried, and so on, up to the
251
+ # server selection timeout or the 3 second minimum.
252
+ loop do
253
+ # Ensure we do not try to read the servers list while SDAM is running
254
+ servers = @sdam_flow_lock.synchronize do
255
+ servers_list.dup
256
+ end
257
+ if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
258
+ break
259
+ end
260
+ if (time_remaining = deadline - Utils.monotonic_time) <= 0
261
+ break
262
+ end
263
+ log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
264
+ # Since the semaphore may have been signaled between us checking
265
+ # the servers list above and the wait call below, we should not
266
+ # wait for the full remaining time - wait for up to 1 second, then
267
+ # recheck the state.
268
+ begin
269
+ server_selection_semaphore.wait([time_remaining, 1].min)
270
+ rescue ::Timeout::Error
271
+ # nothing
272
+ end
273
+ end
274
+ end
275
+
276
+ start_stop_srv_monitor
277
+ end
247
278
  end
248
279
 
249
- # Get the next primary server we can send an operation to.
280
+ # Create a cluster for the provided client, for use when we don't want the
281
+ # client's original cluster instance to be the same.
250
282
  #
251
- # @example Get the next primary server.
252
- # cluster.next_primary
283
+ # @api private
253
284
  #
254
- # @param [ true, false ] ping Whether to ping the server before selection. Deprecated,
255
- # not necessary with the implementation of the Server Selection specification.
285
+ # @example Create a cluster for the client.
286
+ # Cluster.create(client)
256
287
  #
288
+ # @param [ Client ] client The client to create on.
257
289
  #
258
- # @return [ Mongo::Server ] A primary server.
290
+ # @return [ Cluster ] The cluster.
259
291
  #
260
292
  # @since 2.0.0
261
- def next_primary(ping = true)
262
- @primary_selector ||= ServerSelector.get(ServerSelector::PRIMARY)
263
- @primary_selector.select_server(self)
293
+ def self.create(client)
294
+ cluster = Cluster.new(
295
+ client.cluster.addresses.map(&:to_s),
296
+ Monitoring.new,
297
+ client.cluster_options,
298
+ )
299
+ client.instance_variable_set(:@cluster, cluster)
264
300
  end
265
301
 
266
- # Elect a primary server from the description that has just changed to a
267
- # primary.
302
+ # @return [ Hash ] The options hash.
303
+ attr_reader :options
304
+
305
+ # @return [ Monitoring ] monitoring The monitoring.
306
+ attr_reader :monitoring
307
+
308
+ # @return [ Object ] The cluster topology.
309
+ attr_reader :topology
310
+
311
+ # @return [ Mongo::Server::AppMetadata ] The application metadata, used for
312
+ # connection handshakes.
268
313
  #
269
- # @example Elect a primary server.
270
- # cluster.elect_primary!(description)
314
+ # @since 2.4.0
315
+ attr_reader :app_metadata
316
+
317
+ # @api private
318
+ attr_reader :monitor_app_metadata
319
+
320
+ # @api private
321
+ attr_reader :push_monitor_app_metadata
322
+
323
+ # @return [ Array<String> ] The addresses of seed servers. Contains
324
+ # addresses that were given to Cluster when it was instantiated, not
325
+ # current addresses that the cluster is using as a result of SDAM.
271
326
  #
272
- # @param [ Server::Description ] description The newly elected primary.
327
+ # @since 2.7.0
328
+ # @api private
329
+ attr_reader :seeds
330
+
331
+ # @private
273
332
  #
274
- # @return [ Topology ] The cluster topology.
333
+ # @since 2.5.1
334
+ attr_reader :session_pool
335
+
336
+ def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
337
+ :single?, :unknown?
338
+
339
+ # Returns whether the cluster is configured to be in the load-balanced
340
+ # topology.
275
341
  #
276
- # @since 2.0.0
277
- def elect_primary!(description)
278
- @topology = topology.elect_primary(description, servers_list)
342
+ # @return [ true | false ] Whether the topology is load-balanced.
343
+ def load_balanced?
344
+ topology.is_a?(Topology::LoadBalanced)
345
+ end
346
+
347
+ [:register_cursor, :schedule_kill_cursor, :unregister_cursor].each do |m|
348
+ define_method(m) do |*args|
349
+ if options[:cleanup] != false
350
+ @cursor_reaper.send(m, *args)
351
+ end
352
+ end
279
353
  end
280
354
 
281
- # Get the maximum number of times the cluster can retry a read operation on
282
- # a mongos.
355
+ # @api private
356
+ attr_reader :srv_monitor
357
+
358
+ # Get the maximum number of times the client can retry a read operation
359
+ # when using legacy read retries.
360
+ #
361
+ # @note max_read_retries should be retrieved from the Client instance,
362
+ # not from a Cluster instance, because clusters may be shared between
363
+ # clients with different values for max read retries.
283
364
  #
284
365
  # @example Get the max read retries.
285
366
  # cluster.max_read_retries
286
367
  #
287
- # @return [ Integer ] The maximum retries.
368
+ # @return [ Integer ] The maximum number of retries.
288
369
  #
289
370
  # @since 2.1.1
371
+ # @deprecated
290
372
  def max_read_retries
291
373
  options[:max_read_retries] || MAX_READ_RETRIES
292
374
  end
293
375
 
294
- # Get the scoped connection pool for the server.
376
+ # Get the interval, in seconds, in which read retries when using legacy
377
+ # read retries.
295
378
  #
296
- # @example Get the connection pool.
297
- # cluster.pool(server)
298
- #
299
- # @param [ Server ] server The server.
300
- #
301
- # @return [ Server::ConnectionPool ] The connection pool.
302
- #
303
- # @since 2.2.0
304
- def pool(server)
305
- @pool_lock.synchronize do
306
- pools[server.address] ||= Server::ConnectionPool.get(server)
307
- end
308
- end
309
-
310
- # Get the interval, in seconds, in which a mongos read operation is
311
- # retried.
379
+ # @note read_retry_interval should be retrieved from the Client instance,
380
+ # not from a Cluster instance, because clusters may be shared between
381
+ # clients with different values for the read retry interval.
312
382
  #
313
383
  # @example Get the read retry interval.
314
384
  # cluster.read_retry_interval
@@ -316,57 +386,43 @@ module Mongo
316
386
  # @return [ Float ] The interval.
317
387
  #
318
388
  # @since 2.1.1
389
+ # @deprecated
319
390
  def read_retry_interval
320
391
  options[:read_retry_interval] || READ_RETRY_INTERVAL
321
392
  end
322
393
 
323
- # Notify the cluster that a standalone server was discovered so that the
324
- # topology can be updated accordingly.
325
- #
326
- # @example Notify the cluster that a standalone server was discovered.
327
- # cluster.standalone_discovered
394
+ # Get the refresh interval for the server. This will be defined via an
395
+ # option or will default to 10.
328
396
  #
329
- # @return [ Topology ] The cluster topology.
397
+ # @return [ Float ] The heartbeat interval, in seconds.
330
398
  #
331
- # @since 2.0.6
332
- def standalone_discovered
333
- @topology = topology.standalone_discovered
399
+ # @since 2.10.0
400
+ # @api private
401
+ def heartbeat_interval
402
+ options[:heartbeat_frequency] || Server::Monitor::DEFAULT_HEARTBEAT_INTERVAL
334
403
  end
335
404
 
336
- # Remove the server from the cluster for the provided address, if it
337
- # exists.
405
+ # Whether the cluster object is in the process of connecting to its cluster.
338
406
  #
339
- # @example Remove the server from the cluster.
340
- # server.remove('127.0.0.1:27017')
407
+ # @return [ true|false ] Whether the cluster is connecting.
341
408
  #
342
- # @param [ String ] host The host/port or socket address.
343
- #
344
- # @since 2.0.0
345
- def remove(host)
346
- address = Address.new(host)
347
- removed_servers = @servers.select { |s| s.address == address }
348
- @update_lock.synchronize { @servers = @servers - removed_servers }
349
- removed_servers.each{ |server| server.disconnect! } if removed_servers
350
- publish_sdam_event(
351
- Monitoring::SERVER_CLOSED,
352
- Monitoring::Event::ServerClosed.new(address, topology)
353
- )
354
- @update_lock.synchronize { @addresses.reject! { |addr| addr == address } }
409
+ # @api private
410
+ def connecting?
411
+ @update_lock.synchronize do
412
+ !!@connecting
413
+ end
355
414
  end
356
415
 
357
- # Force a scan of all known servers in the cluster.
358
- #
359
- # @example Force a full cluster scan.
360
- # cluster.scan!
416
+ # Whether the cluster object is connected to its cluster.
361
417
  #
362
- # @note This operation is done synchronously. If servers in the cluster are
363
- # down or slow to respond this can potentially be a slow operation.
418
+ # @return [ true|false ] Whether the cluster is connected.
364
419
  #
365
- # @return [ true ] Always true.
366
- #
367
- # @since 2.0.0
368
- def scan!
369
- servers_list.each{ |server| server.scan! } and true
420
+ # @api private
421
+ # @since 2.7.0
422
+ def connected?
423
+ @update_lock.synchronize do
424
+ !!@connected
425
+ end
370
426
  end
371
427
 
372
428
  # Get a list of server candidates from the cluster that can have operations
@@ -379,20 +435,101 @@ module Mongo
379
435
  #
380
436
  # @since 2.0.0
381
437
  def servers
382
- topology.servers(servers_list.compact).compact
438
+ topology.servers(servers_list)
383
439
  end
384
440
 
385
- # Disconnect all servers.
441
+ # The addresses in the cluster.
386
442
  #
387
- # @example Disconnect the cluster's servers.
388
- # cluster.disconnect!
443
+ # @example Get the addresses in the cluster.
444
+ # cluster.addresses
445
+ #
446
+ # @return [ Array<Mongo::Address> ] The addresses.
447
+ #
448
+ # @since 2.0.6
449
+ def addresses
450
+ servers_list.map(&:address)
451
+ end
452
+
453
+ # The logical session timeout value in minutes.
454
+ #
455
+ # @example Get the logical session timeout in minutes.
456
+ # cluster.logical_session_timeout
457
+ #
458
+ # @return [ Integer, nil ] The logical session timeout.
459
+ #
460
+ # @since 2.5.0
461
+ def_delegators :topology, :logical_session_timeout
462
+
463
+ # Get the nicer formatted string for use in inspection.
464
+ #
465
+ # @example Inspect the cluster.
466
+ # cluster.inspect
467
+ #
468
+ # @return [ String ] The cluster inspection.
469
+ #
470
+ # @since 2.0.0
471
+ def inspect
472
+ "#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.summary}>"
473
+ end
474
+
475
+ # @note This method is experimental and subject to change.
476
+ #
477
+ # @api experimental
478
+ # @since 2.7.0
479
+ def summary
480
+ "#<Cluster " +
481
+ "topology=#{topology.summary} "+
482
+ "servers=[#{servers_list.map(&:summary).join(',')}]>"
483
+ end
484
+
485
+ # @api private
486
+ attr_reader :server_selection_semaphore
487
+
488
+ # Closes the cluster.
489
+ #
490
+ # @note Applications should call Client#close to disconnect from
491
+ # the cluster rather than calling this method. This method is for
492
+ # internal driver use only.
493
+ #
494
+ # Disconnects all servers in the cluster, publishing appropriate SDAM
495
+ # events in the process. Stops SRV monitoring if it is active.
496
+ # Marks the cluster disconnected.
389
497
  #
390
498
  # @return [ true ] Always true.
391
499
  #
392
500
  # @since 2.1.0
393
501
  def disconnect!
394
- @periodic_executor.stop!
395
- @servers.each { |server| server.disconnect! } and true
502
+ @state_change_lock.synchronize do
503
+ unless connecting? || connected?
504
+ return true
505
+ end
506
+ if options[:cleanup] != false
507
+ session_pool.end_sessions
508
+ @periodic_executor.stop!
509
+ end
510
+ @srv_monitor_lock.synchronize do
511
+ if @srv_monitor
512
+ @srv_monitor.stop!
513
+ end
514
+ end
515
+ @servers.each do |server|
516
+ if server.connected?
517
+ server.disconnect!
518
+ publish_sdam_event(
519
+ Monitoring::SERVER_CLOSED,
520
+ Monitoring::Event::ServerClosed.new(server.address, topology)
521
+ )
522
+ end
523
+ end
524
+ publish_sdam_event(
525
+ Monitoring::TOPOLOGY_CLOSED,
526
+ Monitoring::Event::TopologyClosed.new(topology)
527
+ )
528
+ @update_lock.synchronize do
529
+ @connecting = @connected = false
530
+ end
531
+ end
532
+ true
396
533
  end
397
534
 
398
535
  # Reconnect all servers.
@@ -403,89 +540,249 @@ module Mongo
403
540
  # @return [ true ] Always true.
404
541
  #
405
542
  # @since 2.1.0
543
+ # @deprecated Use Client#reconnect to reconnect to the cluster instead of
544
+ # calling this method. This method does not send SDAM events.
406
545
  def reconnect!
407
- scan!
408
- servers.each { |server| server.reconnect! }
409
- @periodic_executor.restart! and true
546
+ @state_change_lock.synchronize do
547
+ @update_lock.synchronize do
548
+ @connecting = true
549
+ end
550
+ scan!
551
+ servers.each do |server|
552
+ server.reconnect!
553
+ end
554
+ @periodic_executor.restart!
555
+ @srv_monitor_lock.synchronize do
556
+ if @srv_monitor
557
+ @srv_monitor.run!
558
+ end
559
+ end
560
+ @update_lock.synchronize do
561
+ @connecting = false
562
+ @connected = true
563
+ end
564
+ end
410
565
  end
411
566
 
412
- # Add hosts in a description to the cluster.
567
+ # Force a scan of all known servers in the cluster.
413
568
  #
414
- # @example Add hosts in a description to the cluster.
415
- # cluster.add_hosts(description)
569
+ # If the sync parameter is true which is the default, the scan is
570
+ # performed synchronously in the thread which called this method.
571
+ # Each server in the cluster is checked sequentially. If there are
572
+ # many servers in the cluster or they are slow to respond, this
573
+ # can be a long running operation.
416
574
  #
417
- # @param [ Mongo::Server::Description ] description The description.
575
+ # If the sync parameter is false, this method instructs all server
576
+ # monitor threads to perform an immediate scan and returns without
577
+ # waiting for scan results.
418
578
  #
419
- # @since 2.0.6
420
- def add_hosts(description)
421
- if topology.add_hosts?(description, servers_list)
422
- description.servers.each { |s| add(s) }
579
+ # @note In both synchronous and asynchronous scans, each monitor
580
+ # thread maintains a minimum interval between scans, meaning
581
+ # calling this method may not initiate a scan on a particular server
582
+ # the very next instant.
583
+ #
584
+ # @example Force a full cluster scan.
585
+ # cluster.scan!
586
+ #
587
+ # @return [ true ] Always true.
588
+ #
589
+ # @since 2.0.0
590
+ def scan!(sync=true)
591
+ if sync
592
+ servers_list.each do |server|
593
+ if server.monitor
594
+ server.monitor.scan!
595
+ else
596
+ log_warn("Synchronous scan requested on cluster #{summary} but server #{server} has no monitor")
597
+ end
598
+ end
599
+ else
600
+ servers_list.each do |server|
601
+ server.scan_semaphore.signal
602
+ end
423
603
  end
604
+ true
424
605
  end
425
606
 
426
- # Remove hosts in a description from the cluster.
427
- #
428
- # @example Remove hosts in a description from the cluster.
429
- # cluster.remove_hosts(description)
430
- #
431
- # @param [ Mongo::Server::Description ] description The description.
607
+ # Runs SDAM flow on the cluster.
608
+ #
609
+ # This method can be invoked to process a new server description returned
610
+ # by the server on a monitoring or non-monitoring connection, and also
611
+ # by the driver when it marks a server unknown as a result of a (network)
612
+ # error.
613
+ #
614
+ # @param [ Server::Description ] previous_desc Previous server description.
615
+ # @param [ Server::Description ] updated_desc The changed description.
616
+ # @param [ Hash ] options Options.
617
+ #
618
+ # @option options [ true | false ] :keep_connection_pool Usually when the
619
+ # new server description is unknown, the connection pool on the
620
+ # respective server is cleared. Set this option to true to keep the
621
+ # existing connection pool (required when handling not master errors
622
+ # on 4.2+ servers).
623
+ # @option aptions [ true | false ] :awaited Whether the updated description
624
+ # was a result of processing an awaited hello.
625
+ # @option options [ Object ] :service_id Change state for the specified
626
+ # service id only.
432
627
  #
433
- # @since 2.0.6
434
- def remove_hosts(description)
435
- if topology.remove_hosts?(description)
436
- servers_list.each do |s|
437
- remove(s.address.to_s) if topology.remove_server?(description, s)
628
+ # @api private
629
+ def run_sdam_flow(previous_desc, updated_desc, options = {})
630
+ if load_balanced?
631
+ if updated_desc.config.empty?
632
+ unless options[:keep_connection_pool]
633
+ servers_list.each do |server|
634
+ # TODO should service id be taken out of updated_desc?
635
+ # We could also assert that
636
+ # options[:service_id] == updated_desc.service_id
637
+ server.clear_connection_pool(service_id: options[:service_id])
638
+ end
639
+ end
438
640
  end
641
+ return
642
+ end
643
+
644
+ @sdam_flow_lock.synchronize do
645
+ flow = SdamFlow.new(self, previous_desc, updated_desc,
646
+ awaited: options[:awaited])
647
+ flow.server_description_changed
648
+
649
+ # SDAM flow may alter the updated description - grab the final
650
+ # version for the purposes of broadcasting if a server is available
651
+ updated_desc = flow.updated_desc
652
+
653
+ unless options[:keep_connection_pool]
654
+ if flow.became_unknown?
655
+ servers_list.each do |server|
656
+ if server.address == updated_desc.address
657
+ server.clear_connection_pool
658
+ end
659
+ end
660
+ end
661
+ end
662
+
663
+ start_stop_srv_monitor
664
+ end
665
+
666
+ # Some updated descriptions, e.g. a mismatched me one, result in the
667
+ # server whose description we are processing being removed from
668
+ # the topology. When this happens, the server's monitoring thread gets
669
+ # killed. As a result, any code after the flow invocation may not run
670
+ # a particular monitor instance, hence there should generally not be
671
+ # any code in this method past the flow invocation.
672
+ #
673
+ # However, this broadcast call can be here because if the monitoring
674
+ # thread got killed the server should have been closed and no client
675
+ # should be currently waiting for it, thus not signaling the semaphore
676
+ # shouldn't cause any problems.
677
+ unless updated_desc.unknown?
678
+ server_selection_semaphore.broadcast
439
679
  end
440
680
  end
441
681
 
442
- # Create a cluster for the provided client, for use when we don't want the
443
- # client's original cluster instance to be the same.
682
+ # Sets the list of servers to the addresses in the provided list of address
683
+ # strings.
684
+ #
685
+ # This method is called by the SRV monitor after receiving new DNS records
686
+ # for the monitored hostname.
687
+ #
688
+ # Removes servers in the cluster whose addresses are not in the passed
689
+ # list of server addresses, and adds servers for any addresses in the
690
+ # argument which are not already in the cluster.
691
+ #
692
+ # @param [ Array<String> ] server_address_strs List of server addresses
693
+ # to sync the cluster servers to.
444
694
  #
445
695
  # @api private
696
+ def set_server_list(server_address_strs)
697
+ @sdam_flow_lock.synchronize do
698
+ server_address_strs.each do |address_str|
699
+ unless servers_list.any? { |server| server.address.seed == address_str }
700
+ add(address_str)
701
+ end
702
+ end
703
+
704
+ servers_list.each do |server|
705
+ unless server_address_strs.any? { |address_str| server.address.seed == address_str }
706
+ remove(server.address.seed)
707
+ end
708
+ end
709
+ end
710
+ end
711
+
712
+ # Determine if this cluster of servers is equal to another object. Checks the
713
+ # servers currently in the cluster, not what was configured.
446
714
  #
447
- # @example Create a cluster for the client.
448
- # Cluster.create(client)
715
+ # @example Is the cluster equal to the object?
716
+ # cluster == other
449
717
  #
450
- # @param [ Client ] client The client to create on.
718
+ # @param [ Object ] other The object to compare to.
451
719
  #
452
- # @return [ Cluster ] The cluster.
720
+ # @return [ true, false ] If the objects are equal.
453
721
  #
454
722
  # @since 2.0.0
455
- def self.create(client)
456
- cluster = Cluster.new(
457
- client.cluster.addresses.map(&:to_s),
458
- Monitoring.new,
459
- client.options
460
- )
461
- client.instance_variable_set(:@cluster, cluster)
723
+ def ==(other)
724
+ return false unless other.is_a?(Cluster)
725
+ addresses == other.addresses && options == other.options
462
726
  end
463
727
 
464
- # The addresses in the cluster.
728
+ # Determine if the cluster would select a readable server for the
729
+ # provided read preference.
465
730
  #
466
- # @example Get the addresses in the cluster.
467
- # cluster.addresses
731
+ # @example Is a readable server present?
732
+ # topology.has_readable_server?(server_selector)
468
733
  #
469
- # @return [ Array<Mongo::Address> ] The addresses.
734
+ # @param [ ServerSelector ] server_selector The server
735
+ # selector.
470
736
  #
471
- # @since 2.0.6
472
- def addresses
473
- addresses_list
737
+ # @return [ true, false ] If a readable server is present.
738
+ #
739
+ # @since 2.4.0
740
+ def has_readable_server?(server_selector = nil)
741
+ topology.has_readable_server?(self, server_selector)
474
742
  end
475
743
 
476
- # The logical session timeout value in minutes.
744
+ # Determine if the cluster would select a writable server.
477
745
  #
478
- # @example Get the logical session timeout in minutes.
479
- # cluster.logical_session_timeout
746
+ # @example Is a writable server present?
747
+ # topology.has_writable_server?
480
748
  #
481
- # @return [ Integer, nil ] The logical session timeout.
749
+ # @return [ true, false ] If a writable server is present.
482
750
  #
483
- # @since 2.5.0
484
- def logical_session_timeout
485
- servers.inject(nil) do |min, server|
486
- break unless timeout = server.logical_session_timeout
487
- [timeout, (min || timeout)].min
488
- end
751
+ # @since 2.4.0
752
+ def has_writable_server?
753
+ topology.has_writable_server?(self)
754
+ end
755
+
756
+ # Get the next primary server we can send an operation to.
757
+ #
758
+ # @example Get the next primary server.
759
+ # cluster.next_primary
760
+ #
761
+ # @param [ true, false ] ping Whether to ping the server before selection.
762
+ # Deprecated and ignored.
763
+ # @param [ Session | nil ] session Optional session to take into account
764
+ # for mongos pinning.
765
+ #
766
+ # @return [ Mongo::Server ] A primary server.
767
+ #
768
+ # @since 2.0.0
769
+ def next_primary(ping = nil, session = nil)
770
+ ServerSelector.primary.select_server(self, nil, session)
771
+ end
772
+
773
+ # Get the connection pool for the server.
774
+ #
775
+ # @example Get the connection pool.
776
+ # cluster.pool(server)
777
+ #
778
+ # @param [ Server ] server The server.
779
+ #
780
+ # @return [ Server::ConnectionPool ] The connection pool.
781
+ #
782
+ # @since 2.2.0
783
+ # @deprecated
784
+ def pool(server)
785
+ server.pool
489
786
  end
490
787
 
491
788
  # Update the max cluster time seen in a response.
@@ -501,57 +798,276 @@ module Mongo
501
798
  def update_cluster_time(result)
502
799
  if cluster_time_doc = result.cluster_time
503
800
  @cluster_time_lock.synchronize do
504
- if @cluster_time.nil?
505
- @cluster_time = cluster_time_doc
506
- elsif cluster_time_doc[CLUSTER_TIME] > @cluster_time[CLUSTER_TIME]
507
- @cluster_time = cluster_time_doc
801
+ advance_cluster_time(cluster_time_doc)
802
+ end
803
+ end
804
+ end
805
+
806
+ # Add a server to the cluster with the provided address. Useful in
807
+ # auto-discovery of new servers when an existing server executes a hello
808
+ # and potentially non-configured servers were included.
809
+ #
810
+ # @example Add the server for the address to the cluster.
811
+ # cluster.add('127.0.0.1:27018')
812
+ #
813
+ # @param [ String ] host The address of the server to add.
814
+ #
815
+ # @option options [ Boolean ] :monitor For internal driver use only:
816
+ # whether to monitor the newly added server.
817
+ #
818
+ # @return [ Server ] The newly added server, if not present already.
819
+ #
820
+ # @since 2.0.0
821
+ def add(host, add_options=nil)
822
+ address = Address.new(host, options)
823
+ if !addresses.include?(address)
824
+ opts = options.merge(monitor: false)
825
+ # Note that in a load-balanced topology, every server must be a
826
+ # load balancer (load_balancer: true is specified in the options)
827
+ # but this option isn't set here because we are required by the
828
+ # specifications to pretent the server started out as an unknown one
829
+ # and publish server description change event into the load balancer
830
+ # one. The actual correct description for this server will be set
831
+ # by the fabricate_lb_sdam_events_and_set_server_type method.
832
+ server = Server.new(address, self, @monitoring, event_listeners, opts)
833
+ @update_lock.synchronize do
834
+ # Need to recheck whether server is present in @servers, because
835
+ # the previous check was not under a lock.
836
+ # Since we are under the update lock here, we cannot call servers_list.
837
+ return if @servers.map(&:address).include?(address)
838
+
839
+ @servers.push(server)
840
+ end
841
+ if add_options.nil? || add_options[:monitor] != false
842
+ server.start_monitoring
843
+ end
844
+ server
845
+ end
846
+ end
847
+
848
+ # Remove the server from the cluster for the provided address, if it
849
+ # exists.
850
+ #
851
+ # @example Remove the server from the cluster.
852
+ # server.remove('127.0.0.1:27017')
853
+ #
854
+ # @param [ String ] host The host/port or socket address.
855
+ # @param [ true | false ] disconnect Whether to disconnect the servers
856
+ # being removed. For internal driver use only.
857
+ #
858
+ # @return [ Array<Server> | true | false ] If disconnect is any value other
859
+ # than false, including nil, returns whether any servers were removed.
860
+ # If disconnect is false, returns an array of servers that were removed
861
+ # (and should be disconnected by the caller).
862
+ #
863
+ # @note The return value of this method is not part of the driver's
864
+ # public API.
865
+ #
866
+ # @since 2.0.0
867
+ def remove(host, disconnect: true)
868
+ address = Address.new(host)
869
+ removed_servers = []
870
+ @update_lock.synchronize do
871
+ @servers.delete_if do |server|
872
+ (server.address == address).tap do |delete|
873
+ if delete
874
+ removed_servers << server
875
+ end
508
876
  end
509
877
  end
510
878
  end
879
+ if disconnect != false
880
+ removed_servers.each do |server|
881
+ disconnect_server_if_connected(server)
882
+ end
883
+ end
884
+ if disconnect != false
885
+ removed_servers.any?
886
+ else
887
+ removed_servers
888
+ end
511
889
  end
512
890
 
513
- private
891
+ # @api private
892
+ def update_topology(new_topology)
893
+ old_topology = nil
894
+ @update_lock.synchronize do
895
+ old_topology = topology
896
+ @topology = new_topology
897
+ end
514
898
 
515
- def get_session(client, options = {})
516
- return options[:session].validate!(self) if options[:session]
517
- if sessions_supported?
518
- Session.new(@session_pool.checkout, client, { implicit: true }.merge(options))
899
+ # If new topology has data bearing servers, we know for sure whether
900
+ # sessions are supported - update our cached value.
901
+ # If new topology has no data bearing servers, leave the old value
902
+ # as it is and sessions_supported? method will perform server selection
903
+ # to try to determine session support accurately, falling back to the
904
+ # last known value.
905
+ if topology.data_bearing_servers?
906
+ sessions_supported = !!topology.logical_session_timeout
907
+ @update_lock.synchronize do
908
+ @sessions_supported = sessions_supported
909
+ end
519
910
  end
911
+
912
+ publish_sdam_event(
913
+ Monitoring::TOPOLOGY_CHANGED,
914
+ Monitoring::Event::TopologyChanged.new(old_topology, topology)
915
+ )
520
916
  end
521
917
 
522
- def with_session(client, options = {})
523
- session = get_session(client, options)
524
- yield(session)
525
- ensure
526
- session.end_session if (session && session.implicit?)
918
+ # @api private
919
+ def servers_list
920
+ @update_lock.synchronize do
921
+ @servers.dup
922
+ end
527
923
  end
528
924
 
529
- def sessions_supported?
530
- if servers.empty? && !topology.single?
531
- ServerSelector.get(mode: :primary_preferred).select_server(self)
925
+ # @api private
926
+ def disconnect_server_if_connected(server)
927
+ if server.connected?
928
+ server.disconnect!
929
+ publish_sdam_event(
930
+ Monitoring::SERVER_CLOSED,
931
+ Monitoring::Event::ServerClosed.new(server.address, topology)
932
+ )
532
933
  end
533
- !!logical_session_timeout
534
- rescue Error::NoServerAvailable
535
934
  end
536
935
 
537
- def direct_connection?(address)
538
- address.seed == @topology.seed
936
+ # Raises Error::SessionsNotAvailable if the deployment that the driver
937
+ # is connected to does not support sessions.
938
+ #
939
+ # Session support may change over time, for example due to servers in the
940
+ # deployment being upgraded or downgraded. If the client is currently not
941
+ # connected to any data bearing servers, this method considers the state
942
+ # of session support as of when the client was last connected to at
943
+ # least one server. If the client has never connected to any servers,
944
+ # the deployment is considered to not support sessions.
945
+ #
946
+ # @api private
947
+ def validate_session_support!
948
+ if topology.is_a?(Topology::LoadBalanced)
949
+ return
950
+ end
951
+
952
+ @state_change_lock.synchronize do
953
+ @sdam_flow_lock.synchronize do
954
+ if topology.data_bearing_servers?
955
+ unless topology.logical_session_timeout
956
+ raise_sessions_not_supported
957
+ end
958
+ end
959
+ end
960
+ end
961
+
962
+ # No data bearing servers known - perform server selection to try to
963
+ # get a response from at least one of them, to return an accurate
964
+ # assessment of whether sessions are currently supported.
965
+ begin
966
+ ServerSelector.get(mode: :primary_preferred).select_server(self)
967
+ @state_change_lock.synchronize do
968
+ @sdam_flow_lock.synchronize do
969
+ unless topology.logical_session_timeout
970
+ raise_sessions_not_supported
971
+ end
972
+ end
973
+ end
974
+ rescue Error::NoServerAvailable
975
+ # We haven't been able to contact any servers - use last known
976
+ # value for session support.
977
+ @state_change_lock.synchronize do
978
+ @sdam_flow_lock.synchronize do
979
+ @update_lock.synchronize do
980
+ unless @sessions_supported
981
+ raise_sessions_not_supported
982
+ end
983
+ end
984
+ end
985
+ end
986
+ end
539
987
  end
540
988
 
541
- def addition_allowed?(address)
542
- !@topology.single? || direct_connection?(address)
989
+ private
990
+
991
+ # @api private
992
+ def start_stop_srv_monitor
993
+ # SRV URI is either always given or not for a given cluster, if one
994
+ # wasn't given we shouldn't ever have an SRV monitor to manage.
995
+ return unless options[:srv_uri]
996
+
997
+ if topology.is_a?(Topology::Sharded) || topology.is_a?(Topology::Unknown)
998
+ # Start SRV monitor
999
+ @srv_monitor_lock.synchronize do
1000
+ unless @srv_monitor
1001
+ monitor_options = Utils.shallow_symbolize_keys(options.merge(
1002
+ timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
1003
+ @srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
1004
+ end
1005
+ @srv_monitor.run!
1006
+ end
1007
+ else
1008
+ # Stop SRV monitor if running. This path is taken when the client
1009
+ # is given an SRV URI to a standalone/replica set; when the topology
1010
+ # is discovered, since it's not a sharded cluster, the SRV monitor
1011
+ # needs to be stopped.
1012
+ @srv_monitor_lock.synchronize do
1013
+ if @srv_monitor
1014
+ @srv_monitor.stop!
1015
+ end
1016
+ end
1017
+ end
543
1018
  end
544
1019
 
545
- def pools
546
- @pools ||= {}
1020
+ def raise_sessions_not_supported
1021
+ # Intentionally using @servers instead of +servers+ here because we
1022
+ # are supposed to be already holding the @update_lock and we cannot
1023
+ # recursively acquire it again.
1024
+ offending_servers = @servers.select do |server|
1025
+ server.description.data_bearing? && server.logical_session_timeout.nil?
1026
+ end
1027
+ reason = if offending_servers.empty?
1028
+ "There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
1029
+ else
1030
+ "The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
1031
+ end
1032
+ msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
1033
+ raise Error::SessionsNotSupported, msg
547
1034
  end
548
1035
 
549
- def servers_list
550
- @update_lock.synchronize { @servers.dup }
1036
+ def fabricate_lb_sdam_events_and_set_server_type
1037
+ # Although there is no monitoring connection in load balanced mode,
1038
+ # we must emit the following series of SDAM events.
1039
+ server = @servers.first
1040
+ # We are guaranteed to have the server here.
1041
+ server.publish_opening_event
1042
+ server_desc = server.description
1043
+ # This is where a load balancer actually gets its correct server
1044
+ # description.
1045
+ server.update_description(
1046
+ Server::Description.new(server.address, {},
1047
+ load_balancer: true,
1048
+ force_load_balancer: options[:connect] == :load_balanced,
1049
+ )
1050
+ )
1051
+ publish_sdam_event(
1052
+ Monitoring::SERVER_DESCRIPTION_CHANGED,
1053
+ Monitoring::Event::ServerDescriptionChanged.new(
1054
+ server.address,
1055
+ topology,
1056
+ server_desc,
1057
+ server.description
1058
+ )
1059
+ )
1060
+ recreate_topology(topology, topology)
551
1061
  end
552
1062
 
553
- def addresses_list
554
- @update_lock.synchronize { @addresses.dup }
1063
+ def recreate_topology(new_topology_template, previous_topology)
1064
+ @topology = topology.class.new(new_topology_template.options, new_topology_template.monitoring, self)
1065
+ publish_sdam_event(
1066
+ Monitoring::TOPOLOGY_CHANGED,
1067
+ Monitoring::Event::TopologyChanged.new(previous_topology, @topology)
1068
+ )
555
1069
  end
556
1070
  end
557
1071
  end
1072
+
1073
+ require 'mongo/cluster/sdam_flow'