mongo 2.3.1 → 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 (1820) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +12 -54
  4. data/LICENSE +1 -1
  5. data/README.md +74 -44
  6. data/Rakefile +110 -22
  7. data/lib/mongo/active_support.rb +20 -0
  8. data/lib/mongo/address/ipv4.rb +41 -8
  9. data/lib/mongo/address/ipv6.rb +64 -12
  10. data/lib/mongo/address/unix.rb +12 -6
  11. data/lib/mongo/address/validator.rb +102 -0
  12. data/lib/mongo/address.rb +163 -59
  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 +29 -73
  20. data/lib/mongo/auth/cr.rb +17 -35
  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 -53
  25. data/lib/mongo/auth/ldap.rb +14 -33
  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 +13 -411
  29. data/lib/mongo/auth/scram.rb +45 -37
  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 +77 -0
  34. data/lib/mongo/auth/stringprep/tables.rb +3236 -0
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +175 -0
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1171 -0
  37. data/lib/mongo/auth/stringprep.rb +118 -0
  38. data/lib/mongo/auth/user/view.rb +62 -24
  39. data/lib/mongo/auth/user.rb +76 -10
  40. data/lib/mongo/auth/x509/conversation.rb +28 -50
  41. data/lib/mongo/auth/x509.rb +29 -31
  42. data/lib/mongo/auth.rb +96 -17
  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 +26 -2
  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 +21 -8
  49. data/lib/mongo/bulk_write/transformable.rb +36 -12
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +16 -2
  52. data/lib/mongo/bulk_write.rb +146 -51
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +1181 -92
  55. data/lib/mongo/client_encryption.rb +106 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +105 -0
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +192 -0
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +65 -0
  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 +38 -92
  66. data/lib/mongo/cluster/topology/single.rb +46 -86
  67. data/lib/mongo/cluster/topology/unknown.rb +39 -121
  68. data/lib/mongo/cluster/topology.rb +92 -20
  69. data/lib/mongo/cluster.rb +889 -228
  70. data/lib/mongo/cluster_time.rb +142 -0
  71. data/lib/mongo/collection/view/aggregation.rb +52 -14
  72. data/lib/mongo/collection/view/builder/aggregation.rb +52 -7
  73. data/lib/mongo/collection/view/builder/map_reduce.rb +39 -37
  74. data/lib/mongo/collection/view/builder.rb +4 -5
  75. data/lib/mongo/collection/view/change_stream/retryable.rb +43 -0
  76. data/lib/mongo/collection/view/change_stream.rb +372 -0
  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 +145 -24
  80. data/lib/mongo/collection/view/map_reduce.rb +101 -38
  81. data/lib/mongo/collection/view/readable.rb +292 -70
  82. data/lib/mongo/collection/view/writable.rb +327 -65
  83. data/lib/mongo/collection/view.rb +74 -30
  84. data/lib/mongo/collection.rb +387 -63
  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 +290 -63
  103. data/lib/mongo/database/view.rb +107 -26
  104. data/lib/mongo/database.rb +242 -31
  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 +38 -3
  110. data/lib/mongo/error/change_stream_resumable.rb +40 -0
  111. data/lib/mongo/error/closed_stream.rb +5 -2
  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 +41 -0
  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 +41 -0
  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 +38 -0
  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 +38 -0
  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 +37 -5
  140. data/lib/mongo/error/invalid_session.rb +40 -0
  141. data/lib/mongo/error/invalid_signature.rb +4 -1
  142. data/lib/mongo/error/invalid_transaction_operation.rb +85 -0
  143. data/lib/mongo/error/invalid_txt_record.rb +30 -0
  144. data/lib/mongo/error/invalid_update_document.rb +4 -1
  145. data/lib/mongo/error/invalid_uri.rb +11 -7
  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 +38 -0
  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 +30 -0
  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 +42 -0
  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 +29 -0
  163. data/lib/mongo/error/notable.rb +90 -0
  164. data/lib/mongo/error/operation_failure.rb +266 -13
  165. data/lib/mongo/error/parser.rb +220 -15
  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 +8 -2
  175. data/lib/mongo/error/socket_timeout_error.rb +8 -2
  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 +44 -0
  180. data/lib/mongo/error/unmet_dependency.rb +24 -0
  181. data/lib/mongo/error/unsupported_array_filters.rb +59 -0
  182. data/lib/mongo/error/unsupported_collation.rb +59 -0
  183. data/lib/mongo/error/unsupported_features.rb +4 -19
  184. data/lib/mongo/error/unsupported_message_type.rb +26 -0
  185. data/lib/mongo/error/unsupported_option.rb +104 -0
  186. data/lib/mongo/error/write_retryable.rb +30 -0
  187. data/lib/mongo/error.rb +147 -2
  188. data/lib/mongo/event/base.rb +45 -0
  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 +18 -8
  193. data/lib/mongo/grid/file/chunk.rb +10 -7
  194. data/lib/mongo/grid/file/info.rb +38 -5
  195. data/lib/mongo/grid/file.rb +9 -1
  196. data/lib/mongo/grid/fs_bucket.rb +147 -65
  197. data/lib/mongo/grid/stream/read.rb +68 -30
  198. data/lib/mongo/grid/stream/write.rb +37 -12
  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 +112 -38
  203. data/lib/mongo/index.rb +5 -1
  204. data/lib/mongo/lint.rb +105 -0
  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 +25 -5
  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 +59 -8
  222. data/lib/mongo/monitoring/event/command_started.rb +102 -6
  223. data/lib/mongo/monitoring/event/command_succeeded.rb +45 -6
  224. data/lib/mongo/monitoring/event/secure.rb +59 -5
  225. data/lib/mongo/monitoring/event/server_closed.rb +62 -0
  226. data/lib/mongo/monitoring/event/server_description_changed.rb +99 -0
  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 +62 -0
  231. data/lib/mongo/monitoring/event/topology_changed.rb +63 -0
  232. data/lib/mongo/monitoring/event/topology_closed.rb +57 -0
  233. data/lib/mongo/monitoring/event/topology_opening.rb +57 -0
  234. data/lib/mongo/monitoring/event.rb +15 -1
  235. data/lib/mongo/monitoring/publishable.rb +60 -44
  236. data/lib/mongo/monitoring/sdam_log_subscriber.rb +57 -0
  237. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +33 -0
  238. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +44 -0
  239. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +33 -0
  240. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +43 -0
  241. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
  242. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +33 -0
  243. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  244. data/lib/mongo/monitoring.rb +245 -61
  245. data/lib/mongo/operation/aggregate/command.rb +55 -0
  246. data/lib/mongo/operation/aggregate/op_msg.rb +34 -0
  247. data/lib/mongo/operation/aggregate/result.rb +104 -0
  248. data/lib/mongo/operation/aggregate.rb +39 -0
  249. data/lib/mongo/operation/collections_info/command.rb +48 -0
  250. data/lib/mongo/operation/collections_info/result.rb +59 -0
  251. data/lib/mongo/operation/collections_info.rb +51 -0
  252. data/lib/mongo/operation/command/command.rb +41 -0
  253. data/lib/mongo/operation/command/op_msg.rb +31 -0
  254. data/lib/mongo/operation/command.rb +34 -0
  255. data/lib/mongo/operation/context.rb +120 -0
  256. data/lib/mongo/operation/count/command.rb +47 -0
  257. data/lib/mongo/operation/count/op_msg.rb +38 -0
  258. data/lib/mongo/operation/count.rb +34 -0
  259. data/lib/mongo/operation/create/command.rb +47 -0
  260. data/lib/mongo/operation/create/op_msg.rb +39 -0
  261. data/lib/mongo/operation/create.rb +34 -0
  262. data/lib/mongo/operation/create_index/command.rb +61 -0
  263. data/lib/mongo/operation/create_index/op_msg.rb +54 -0
  264. data/lib/mongo/operation/create_index.rb +34 -0
  265. data/lib/mongo/operation/create_user/command.rb +46 -0
  266. data/lib/mongo/operation/create_user/op_msg.rb +38 -0
  267. data/lib/mongo/operation/create_user.rb +34 -0
  268. data/lib/mongo/operation/delete/bulk_result.rb +51 -0
  269. data/lib/mongo/operation/delete/command.rb +52 -0
  270. data/lib/mongo/operation/delete/legacy.rb +64 -0
  271. data/lib/mongo/operation/delete/op_msg.rb +55 -0
  272. data/lib/mongo/operation/delete/result.rb +48 -0
  273. data/lib/mongo/operation/delete.rb +41 -0
  274. data/lib/mongo/operation/distinct/command.rb +47 -0
  275. data/lib/mongo/operation/distinct/op_msg.rb +40 -0
  276. data/lib/mongo/operation/distinct.rb +34 -0
  277. data/lib/mongo/operation/drop/command.rb +41 -0
  278. data/lib/mongo/operation/drop/op_msg.rb +32 -0
  279. data/lib/mongo/operation/drop.rb +34 -0
  280. data/lib/mongo/operation/drop_database/command.rb +41 -0
  281. data/lib/mongo/operation/drop_database/op_msg.rb +32 -0
  282. data/lib/mongo/operation/drop_database.rb +34 -0
  283. data/lib/mongo/operation/drop_index/command.rb +45 -0
  284. data/lib/mongo/operation/drop_index/op_msg.rb +38 -0
  285. data/lib/mongo/operation/drop_index.rb +34 -0
  286. data/lib/mongo/operation/explain/command.rb +58 -0
  287. data/lib/mongo/operation/explain/legacy.rb +52 -0
  288. data/lib/mongo/operation/explain/op_msg.rb +48 -0
  289. data/lib/mongo/operation/explain/result.rb +56 -0
  290. data/lib/mongo/operation/explain.rb +36 -0
  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 +51 -0
  297. data/lib/mongo/operation/find/legacy/result.rb +46 -0
  298. data/lib/mongo/operation/find/legacy.rb +52 -0
  299. data/lib/mongo/operation/find/op_msg.rb +46 -0
  300. data/lib/mongo/operation/find/result.rb +76 -0
  301. data/lib/mongo/operation/find.rb +37 -0
  302. data/lib/mongo/operation/get_more/command.rb +43 -0
  303. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +39 -0
  305. data/lib/mongo/operation/get_more/op_msg.rb +34 -0
  306. data/lib/mongo/operation/get_more/result.rb +75 -0
  307. data/lib/mongo/operation/get_more.rb +37 -0
  308. data/lib/mongo/operation/indexes/command.rb +42 -0
  309. data/lib/mongo/operation/indexes/legacy.rb +48 -0
  310. data/lib/mongo/operation/indexes/op_msg.rb +34 -0
  311. data/lib/mongo/operation/indexes/result.rb +105 -0
  312. data/lib/mongo/operation/indexes.rb +50 -0
  313. data/lib/mongo/operation/insert/bulk_result.rb +112 -0
  314. data/lib/mongo/operation/insert/command.rb +59 -0
  315. data/lib/mongo/operation/insert/legacy.rb +68 -0
  316. data/lib/mongo/operation/insert/op_msg.rb +54 -0
  317. data/lib/mongo/operation/insert/result.rb +75 -0
  318. data/lib/mongo/operation/insert.rb +44 -0
  319. data/lib/mongo/operation/kill_cursors/command.rb +48 -0
  320. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  321. data/lib/mongo/operation/kill_cursors/legacy.rb +41 -0
  322. data/lib/mongo/operation/kill_cursors/op_msg.rb +42 -0
  323. data/lib/mongo/operation/kill_cursors.rb +12 -16
  324. data/lib/mongo/operation/list_collections/command.rb +46 -0
  325. data/lib/mongo/operation/list_collections/op_msg.rb +39 -0
  326. data/lib/mongo/operation/list_collections/result.rb +113 -0
  327. data/lib/mongo/operation/list_collections.rb +35 -0
  328. data/lib/mongo/operation/map_reduce/command.rb +51 -0
  329. data/lib/mongo/operation/map_reduce/op_msg.rb +34 -0
  330. data/lib/mongo/operation/map_reduce/result.rb +142 -0
  331. data/lib/mongo/operation/map_reduce.rb +35 -0
  332. data/lib/mongo/operation/op_msg_base.rb +33 -0
  333. data/lib/mongo/operation/parallel_scan/command.rb +57 -0
  334. data/lib/mongo/operation/parallel_scan/op_msg.rb +46 -0
  335. data/lib/mongo/operation/parallel_scan/result.rb +68 -0
  336. data/lib/mongo/operation/parallel_scan.rb +35 -0
  337. data/lib/mongo/operation/remove_user/command.rb +46 -0
  338. data/lib/mongo/operation/remove_user/op_msg.rb +38 -0
  339. data/lib/mongo/operation/remove_user.rb +34 -0
  340. data/lib/mongo/operation/result.rb +195 -39
  341. data/lib/mongo/operation/shared/bypass_document_validation.rb +46 -0
  342. data/lib/mongo/operation/shared/causal_consistency_supported.rb +45 -0
  343. data/lib/mongo/operation/shared/executable.rb +130 -0
  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 +68 -0
  347. data/lib/mongo/operation/shared/limited.rb +42 -0
  348. data/lib/mongo/operation/shared/object_id_generator.rb +40 -0
  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 +116 -0
  355. data/lib/mongo/operation/shared/response_handling.rb +173 -0
  356. data/lib/mongo/operation/shared/result/aggregatable.rb +74 -0
  357. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
  358. data/lib/mongo/operation/shared/sessions_supported.rb +254 -0
  359. data/lib/mongo/operation/shared/specifiable.rb +567 -0
  360. data/lib/mongo/operation/shared/validatable.rb +87 -0
  361. data/lib/mongo/operation/shared/write.rb +90 -0
  362. data/lib/mongo/operation/shared/write_concern_supported.rb +43 -0
  363. data/lib/mongo/operation/update/bulk_result.rb +129 -0
  364. data/lib/mongo/operation/update/command.rb +53 -0
  365. data/lib/mongo/operation/update/legacy/result.rb +112 -0
  366. data/lib/mongo/operation/update/legacy.rb +76 -0
  367. data/lib/mongo/operation/update/op_msg.rb +51 -0
  368. data/lib/mongo/operation/update/result.rb +113 -0
  369. data/lib/mongo/operation/update.rb +41 -0
  370. data/lib/mongo/operation/update_user/command.rb +45 -0
  371. data/lib/mongo/operation/update_user/op_msg.rb +38 -0
  372. data/lib/mongo/operation/update_user.rb +34 -0
  373. data/lib/mongo/operation/users_info/command.rb +46 -0
  374. data/lib/mongo/operation/users_info/op_msg.rb +39 -0
  375. data/lib/mongo/operation/users_info/result.rb +48 -0
  376. data/lib/mongo/operation/users_info.rb +35 -0
  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 +83 -21
  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 +8 -4
  385. data/lib/mongo/protocol/compressed.rb +184 -0
  386. data/lib/mongo/protocol/delete.rb +16 -8
  387. data/lib/mongo/protocol/get_more.rb +24 -15
  388. data/lib/mongo/protocol/insert.rb +20 -10
  389. data/lib/mongo/protocol/kill_cursors.rb +22 -21
  390. data/lib/mongo/protocol/message.rb +187 -23
  391. data/lib/mongo/protocol/msg.rb +404 -0
  392. data/lib/mongo/protocol/query.rb +120 -41
  393. data/lib/mongo/protocol/registry.rb +79 -0
  394. data/lib/mongo/protocol/reply.rb +23 -15
  395. data/lib/mongo/protocol/serializers.rb +283 -12
  396. data/lib/mongo/protocol/update.rb +22 -10
  397. data/lib/mongo/protocol.rb +6 -0
  398. data/lib/mongo/query_cache.rb +275 -0
  399. data/lib/mongo/retryable.rb +414 -47
  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 +251 -101
  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 +796 -57
  408. data/lib/mongo/server/description/features.rb +84 -20
  409. data/lib/mongo/server/description/load_balancer.rb +33 -0
  410. data/lib/mongo/server/description.rb +398 -73
  411. data/lib/mongo/server/monitor/app_metadata.rb +37 -0
  412. data/lib/mongo/server/monitor/connection.rb +192 -61
  413. data/lib/mongo/server/monitor.rb +251 -92
  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 +454 -76
  419. data/lib/mongo/server_selector/base.rb +629 -0
  420. data/lib/mongo/server_selector/nearest.rb +44 -28
  421. data/lib/mongo/server_selector/primary.rb +40 -18
  422. data/lib/mongo/server_selector/primary_preferred.rb +47 -26
  423. data/lib/mongo/server_selector/secondary.rb +41 -23
  424. data/lib/mongo/server_selector/secondary_preferred.rb +42 -25
  425. data/lib/mongo/server_selector.rb +27 -8
  426. data/lib/mongo/session/server_session.rb +122 -0
  427. data/lib/mongo/session/session_pool.rb +166 -0
  428. data/lib/mongo/session.rb +1094 -0
  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 +299 -61
  432. data/lib/mongo/socket/tcp.rb +48 -32
  433. data/lib/mongo/socket/unix.rb +24 -34
  434. data/lib/mongo/socket.rb +310 -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 +239 -0
  443. data/lib/mongo/uri.rb +291 -316
  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 -34
  450. data/lib/mongo.rb +69 -5
  451. data/mongo.gemspec +14 -6
  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 +27 -0
  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 +83 -0
  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 +208 -0
  467. data/spec/integration/change_stream_spec.rb +808 -0
  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 +184 -0
  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 +207 -0
  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 +195 -0
  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 +984 -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 +235 -0
  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 +167 -0
  558. data/spec/mongo/address/ipv4_spec.rb +8 -1
  559. data/spec/mongo/address/ipv6_spec.rb +36 -1
  560. data/spec/mongo/address/unix_spec.rb +5 -1
  561. data/spec/mongo/address/validator_spec.rb +54 -0
  562. data/spec/mongo/address_spec.rb +120 -7
  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 +34 -23
  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 -21
  570. data/spec/mongo/auth/scram/conversation_spec.rb +66 -58
  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 +97 -39
  574. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +116 -0
  575. data/spec/mongo/auth/stringprep_spec.rb +191 -0
  576. data/spec/mongo/auth/user/view_spec.rb +404 -70
  577. data/spec/mongo/auth/user_spec.rb +165 -12
  578. data/spec/mongo/auth/x509/conversation_spec.rb +72 -0
  579. data/spec/mongo/auth/x509_spec.rb +46 -22
  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 +127 -0
  584. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +7 -4
  585. data/spec/mongo/bulk_write_spec.rb +1534 -254
  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 +525 -358
  590. data/spec/mongo/cluster/cursor_reaper_spec.rb +77 -88
  591. data/spec/mongo/cluster/periodic_executor_spec.rb +21 -0
  592. data/spec/mongo/cluster/socket_reaper_spec.rb +46 -0
  593. data/spec/mongo/cluster/topology/replica_set_spec.rb +414 -175
  594. data/spec/mongo/cluster/topology/sharded_spec.rb +72 -47
  595. data/spec/mongo/cluster/topology/single_spec.rb +112 -28
  596. data/spec/mongo/cluster/topology/unknown_spec.rb +44 -108
  597. data/spec/mongo/cluster/topology_spec.rb +139 -19
  598. data/spec/mongo/cluster_spec.rb +509 -144
  599. data/spec/mongo/cluster_time_spec.rb +151 -0
  600. data/spec/mongo/collection/view/aggregation_spec.rb +308 -20
  601. data/spec/mongo/collection/view/builder/find_command_spec.rb +88 -10
  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 +547 -0
  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 +462 -23
  609. data/spec/mongo/collection/view/readable_spec.rb +461 -48
  610. data/spec/mongo/collection/view/writable_spec.rb +1232 -47
  611. data/spec/mongo/collection/view_spec.rb +81 -7
  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 +485 -1982
  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 +46 -11
  634. data/spec/mongo/cursor/builder/op_get_more_spec.rb +20 -4
  635. data/spec/mongo/cursor_spec.rb +395 -47
  636. data/spec/mongo/database_spec.rb +905 -68
  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 +553 -0
  646. data/spec/mongo/error/parser_spec.rb +432 -11
  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 +336 -205
  654. data/spec/mongo/grid/stream/read_spec.rb +44 -27
  655. data/spec/mongo/grid/stream/write_spec.rb +93 -36
  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 +832 -70
  659. data/spec/mongo/lint_spec.rb +231 -0
  660. data/spec/mongo/logger_spec.rb +17 -12
  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 +87 -0
  673. data/spec/mongo/monitoring/event/command_started_spec.rb +30 -5
  674. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +71 -9
  675. data/spec/mongo/monitoring/event/secure_spec.rb +71 -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 +33 -5
  686. data/spec/mongo/operation/aggregate/result_spec.rb +90 -0
  687. data/spec/mongo/operation/aggregate_spec.rb +76 -0
  688. data/spec/mongo/operation/collections_info_spec.rb +48 -0
  689. data/spec/mongo/operation/command_spec.rb +86 -0
  690. data/spec/mongo/operation/create_index_spec.rb +62 -0
  691. data/spec/mongo/operation/create_user_spec.rb +53 -0
  692. data/spec/mongo/operation/delete/bulk_spec.rb +245 -0
  693. data/spec/mongo/operation/delete/command_spec.rb +115 -0
  694. data/spec/mongo/operation/delete/op_msg_spec.rb +257 -0
  695. data/spec/mongo/operation/delete_spec.rb +233 -0
  696. data/spec/mongo/operation/drop_index_spec.rb +61 -0
  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 +131 -0
  700. data/spec/mongo/operation/get_more_spec.rb +63 -0
  701. data/spec/mongo/operation/indexes_spec.rb +41 -0
  702. data/spec/mongo/operation/insert/bulk_spec.rb +273 -0
  703. data/spec/mongo/operation/insert/command_spec.rb +118 -0
  704. data/spec/mongo/operation/insert/op_msg_spec.rb +288 -0
  705. data/spec/mongo/operation/insert_spec.rb +290 -0
  706. data/spec/mongo/operation/kill_cursors_spec.rb +10 -4
  707. data/spec/mongo/operation/limited_spec.rb +8 -3
  708. data/spec/mongo/operation/map_reduce_spec.rb +131 -0
  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 +52 -0
  712. data/spec/mongo/operation/result_spec.rb +46 -6
  713. data/spec/mongo/operation/specifiable_spec.rb +5 -2
  714. data/spec/mongo/operation/update/bulk_spec.rb +239 -0
  715. data/spec/mongo/operation/update/command_spec.rb +122 -0
  716. data/spec/mongo/operation/update/op_msg_spec.rb +263 -0
  717. data/spec/mongo/operation/update_spec.rb +264 -0
  718. data/spec/mongo/operation/update_user_spec.rb +52 -0
  719. data/spec/mongo/options/redacted_spec.rb +3 -0
  720. data/spec/mongo/protocol/compressed_spec.rb +83 -0
  721. data/spec/mongo/protocol/delete_spec.rb +27 -9
  722. data/spec/mongo/protocol/get_more_spec.rb +29 -11
  723. data/spec/mongo/protocol/insert_spec.rb +27 -9
  724. data/spec/mongo/protocol/kill_cursors_spec.rb +24 -6
  725. data/spec/mongo/protocol/msg_spec.rb +528 -0
  726. data/spec/mongo/protocol/query_spec.rb +62 -14
  727. data/spec/mongo/protocol/registry_spec.rb +34 -0
  728. data/spec/mongo/protocol/reply_spec.rb +18 -1
  729. data/spec/mongo/protocol/update_spec.rb +28 -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 +468 -97
  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 +970 -88
  739. data/spec/mongo/server/connection_spec.rb +939 -172
  740. data/spec/mongo/server/description/features_spec.rb +96 -29
  741. data/spec/mongo/server/description_query_methods_spec.rb +291 -0
  742. data/spec/mongo/server/description_spec.rb +627 -575
  743. data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
  744. data/spec/mongo/server/monitor/connection_spec.rb +175 -0
  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 +107 -27
  748. data/spec/mongo/server_selector/primary_preferred_spec.rb +110 -30
  749. data/spec/mongo/server_selector/primary_spec.rb +73 -13
  750. data/spec/mongo/server_selector/secondary_preferred_spec.rb +125 -29
  751. data/spec/mongo/server_selector/secondary_spec.rb +102 -22
  752. data/spec/mongo/server_selector_spec.rb +325 -4
  753. data/spec/mongo/server_spec.rb +315 -76
  754. data/spec/mongo/session/server_session_spec.rb +62 -0
  755. data/spec/mongo/session/session_pool_spec.rb +272 -0
  756. data/spec/mongo/session_spec.rb +348 -0
  757. data/spec/mongo/session_transaction_spec.rb +206 -0
  758. data/spec/mongo/socket/ssl_spec.rb +742 -72
  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 +119 -0
  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 +1108 -0
  767. data/spec/mongo/uri_option_parsing_spec.rb +625 -0
  768. data/spec/mongo/uri_spec.rb +514 -82
  769. data/spec/mongo/utils_spec.rb +56 -0
  770. data/spec/mongo/write_concern/acknowledged_spec.rb +14 -0
  771. data/spec/mongo/write_concern/unacknowledged_spec.rb +14 -0
  772. data/spec/mongo/write_concern_spec.rb +90 -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 +20 -175
  834. data/spec/spec_tests/auth_spec.rb +58 -0
  835. data/spec/spec_tests/change_streams_spec.rb +93 -0
  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 +71 -0
  841. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  842. data/spec/spec_tests/connection_string_spec.rb +10 -0
  843. data/spec/spec_tests/crud_spec.rb +22 -0
  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/spec_tests/data/command_monitoring/command.yml +61 -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/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +34 -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/spec_tests/data/connection_string/valid-db-with-dotted-name.yml +77 -0
  914. data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-host_identifiers.yml +0 -0
  915. data/spec/spec_tests/data/connection_string/valid-options.yml +17 -0
  916. data/spec/spec_tests/data/connection_string/valid-unix_socket-absolute.yml +197 -0
  917. data/spec/spec_tests/data/connection_string/valid-unix_socket-relative.yml +213 -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/spec_tests/data/crud/read/aggregate.yml +21 -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/spec_tests/data/crud/read/count.yml +74 -0
  925. data/spec/spec_tests/data/crud/read/distinct-collation.yml +18 -0
  926. data/spec/spec_tests/data/crud/read/distinct.yml +32 -0
  927. data/spec/spec_tests/data/crud/read/find-collation.yml +16 -0
  928. data/spec/spec_tests/data/crud/read/find.yml +49 -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/spec_tests/data/crud/write/deleteMany.yml +35 -0
  934. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +23 -0
  935. data/spec/spec_tests/data/crud/write/deleteOne.yml +48 -0
  936. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +24 -0
  937. data/spec/spec_tests/data/crud/write/findOneAndDelete.yml +53 -0
  938. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +25 -0
  939. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert.yml +91 -0
  940. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert_pre_2.6.yml +88 -0
  941. data/spec/spec_tests/data/crud/write/findOneAndReplace.yml +113 -0
  942. data/spec/spec_tests/data/crud/write/findOneAndUpdate-arrayFilters.yml +69 -0
  943. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +28 -0
  944. data/spec/spec_tests/data/crud/write/findOneAndUpdate.yml +163 -0
  945. data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
  946. data/spec/spec_tests/data/crud/write/insertOne.yml +18 -0
  947. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +25 -0
  948. data/spec/spec_tests/data/crud/write/replaceOne-pre_2.6.yml +98 -0
  949. data/spec/spec_tests/data/crud/write/replaceOne-upsert.yml +48 -0
  950. data/spec/spec_tests/data/crud/write/replaceOne.yml +102 -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/spec_tests/data/crud/write/updateMany-pre_2.6.yml +86 -0
  954. data/spec/spec_tests/data/crud/write/updateMany.yml +87 -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/spec_tests/data/crud/write/updateOne-pre_2.6.yml +83 -0
  958. data/spec/spec_tests/data/crud/write/updateOne.yml +84 -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/spec_tests/data/gridfs/delete.yml +123 -0
  1008. data/spec/spec_tests/data/gridfs/download.yml +192 -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/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
  1016. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
  1017. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
  1018. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  1019. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
  1020. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
  1021. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
  1022. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
  1023. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
  1024. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
  1025. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
  1026. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
  1027. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
  1028. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
  1029. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
  1030. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
  1031. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +29 -0
  1032. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +25 -0
  1033. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +26 -0
  1034. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
  1035. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
  1036. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
  1037. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
  1038. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
  1039. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
  1040. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
  1041. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
  1042. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
  1043. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
  1044. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
  1045. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +23 -0
  1046. data/spec/spec_tests/data/max_staleness/Sharded/Incompatible.yml +25 -0
  1047. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +28 -0
  1048. data/spec/spec_tests/data/max_staleness/Single/Incompatible.yml +18 -0
  1049. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +20 -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/spec_tests/data/sdam/sharded/normalize_uri_case.yml +32 -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/spec_tests/data/seed_list_discovery/replica-set/longer-parent-in-return.yml +11 -0
  1347. data/spec/spec_tests/data/seed_list_discovery/replica-set/misformatted-option.yml +5 -0
  1348. data/spec/spec_tests/data/seed_list_discovery/replica-set/no-results.yml +5 -0
  1349. data/spec/spec_tests/data/seed_list_discovery/replica-set/not-enough-parts.yml +5 -0
  1350. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-result-default-port.yml +10 -0
  1351. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-txt-record-multiple-strings.yml +10 -0
  1352. data/spec/spec_tests/data/seed_list_discovery/replica-set/one-txt-record.yml +11 -0
  1353. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch1.yml +5 -0
  1354. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch2.yml +5 -0
  1355. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch3.yml +5 -0
  1356. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch4.yml +5 -0
  1357. data/spec/spec_tests/data/seed_list_discovery/replica-set/parent-part-mismatch5.yml +5 -0
  1358. data/spec/spec_tests/data/seed_list_discovery/replica-set/returned-parent-too-short.yml +5 -0
  1359. data/spec/spec_tests/data/seed_list_discovery/replica-set/returned-parent-wrong.yml +5 -0
  1360. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-results-default-port.yml +11 -0
  1361. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-results-nonstandard-port.yml +11 -0
  1362. data/spec/spec_tests/data/seed_list_discovery/replica-set/two-txt-records.yml +5 -0
  1363. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-not-allowed-option.yml +5 -0
  1364. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-overridden-ssl-option.yml +11 -0
  1365. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-overridden-uri-option.yml +11 -0
  1366. data/spec/spec_tests/data/seed_list_discovery/replica-set/txt-record-with-unallowed-option.yml +5 -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/spec_tests/data/seed_list_discovery/replica-set/uri-with-port.yml +5 -0
  1370. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-two-hosts.yml +5 -0
  1371. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest.yml +25 -0
  1372. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +26 -0
  1373. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +20 -0
  1374. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimary.yml +15 -0
  1375. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +15 -0
  1376. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Primary.yml +18 -0
  1377. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +25 -0
  1378. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +20 -0
  1379. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary.yml +25 -0
  1380. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +25 -0
  1381. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +20 -0
  1382. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
  1383. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
  1384. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +20 -0
  1385. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest.yml +32 -0
  1386. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +33 -0
  1387. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +25 -0
  1388. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Primary.yml +26 -0
  1389. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +28 -0
  1390. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +28 -0
  1391. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary.yml +30 -0
  1392. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +30 -0
  1393. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +28 -0
  1394. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
  1395. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +25 -0
  1396. data/spec/spec_tests/data/server_selection/Sharded/read/Nearest.yml +21 -0
  1397. data/spec/spec_tests/data/server_selection/Sharded/read/Primary.yml +19 -0
  1398. data/spec/spec_tests/data/server_selection/Sharded/read/PrimaryPreferred.yml +21 -0
  1399. data/spec/spec_tests/data/server_selection/Sharded/read/Secondary.yml +21 -0
  1400. data/spec/spec_tests/data/server_selection/Sharded/read/SecondaryPreferred.yml +21 -0
  1401. data/spec/spec_tests/data/server_selection/Single/read/SecondaryPreferred.yml +18 -0
  1402. data/spec/spec_tests/data/server_selection/Unknown/read/SecondaryPreferred.yml +10 -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 +55 -0
  1479. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1480. data/spec/spec_tests/max_staleness_spec.rb +12 -0
  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 +22 -0
  1486. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1487. data/spec/spec_tests/sdam_monitoring_spec.rb +101 -0
  1488. data/spec/spec_tests/sdam_spec.rb +242 -0
  1489. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1490. data/spec/spec_tests/server_selection_rtt_spec.rb +33 -0
  1491. data/spec/spec_tests/server_selection_spec.rb +12 -0
  1492. data/spec/spec_tests/transactions_api_spec.rb +13 -0
  1493. data/spec/spec_tests/transactions_spec.rb +13 -0
  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 +61 -153
  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 +19 -0
  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 +24 -0
  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 +119 -63
  1573. data/spec/support/shared/session.rb +910 -0
  1574. data/spec/support/spec_config.rb +636 -0
  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 +2470 -519
  1580. metadata.gz.sig +2 -2
  1581. data/lib/csasl/csasl.bundle +0 -0
  1582. data/lib/mongo/cluster/cursor_reaper.rb +0 -174
  1583. data/lib/mongo/cluster/topology/replica_set.rb +0 -271
  1584. data/lib/mongo/collection/view/builder/find_command.rb +0 -136
  1585. data/lib/mongo/collection/view/builder/flags.rb +0 -62
  1586. data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
  1587. data/lib/mongo/collection/view/builder/op_query.rb +0 -83
  1588. data/lib/mongo/cursor/builder/get_more_command.rb +0 -72
  1589. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -90
  1590. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1591. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -84
  1592. data/lib/mongo/cursor/builder.rb +0 -18
  1593. data/lib/mongo/event/description_changed.rb +0 -54
  1594. data/lib/mongo/event/primary_elected.rb +0 -53
  1595. data/lib/mongo/event/standalone_discovered.rb +0 -53
  1596. data/lib/mongo/operation/commands/aggregate/result.rb +0 -89
  1597. data/lib/mongo/operation/commands/aggregate.rb +0 -64
  1598. data/lib/mongo/operation/commands/collections_info/result.rb +0 -41
  1599. data/lib/mongo/operation/commands/collections_info.rb +0 -71
  1600. data/lib/mongo/operation/commands/command.rb +0 -47
  1601. data/lib/mongo/operation/commands/find/result.rb +0 -62
  1602. data/lib/mongo/operation/commands/find.rb +0 -27
  1603. data/lib/mongo/operation/commands/get_more/result.rb +0 -62
  1604. data/lib/mongo/operation/commands/get_more.rb +0 -27
  1605. data/lib/mongo/operation/commands/indexes.rb +0 -73
  1606. data/lib/mongo/operation/commands/list_collections/result.rb +0 -94
  1607. data/lib/mongo/operation/commands/list_collections.rb +0 -48
  1608. data/lib/mongo/operation/commands/list_indexes/result.rb +0 -98
  1609. data/lib/mongo/operation/commands/list_indexes.rb +0 -48
  1610. data/lib/mongo/operation/commands/map_reduce/result.rb +0 -119
  1611. data/lib/mongo/operation/commands/map_reduce.rb +0 -49
  1612. data/lib/mongo/operation/commands/parallel_scan/result.rb +0 -64
  1613. data/lib/mongo/operation/commands/parallel_scan.rb +0 -52
  1614. data/lib/mongo/operation/commands/user_query.rb +0 -72
  1615. data/lib/mongo/operation/commands/users_info/result.rb +0 -44
  1616. data/lib/mongo/operation/commands/users_info.rb +0 -48
  1617. data/lib/mongo/operation/commands.rb +0 -26
  1618. data/lib/mongo/operation/executable.rb +0 -42
  1619. data/lib/mongo/operation/limited.rb +0 -37
  1620. data/lib/mongo/operation/object_id_generator.rb +0 -36
  1621. data/lib/mongo/operation/read/get_more.rb +0 -52
  1622. data/lib/mongo/operation/read/query/result.rb +0 -40
  1623. data/lib/mongo/operation/read/query.rb +0 -55
  1624. data/lib/mongo/operation/read.rb +0 -16
  1625. data/lib/mongo/operation/read_preference.rb +0 -61
  1626. data/lib/mongo/operation/specifiable.rb +0 -473
  1627. data/lib/mongo/operation/write/bulk/bulkable.rb +0 -83
  1628. data/lib/mongo/operation/write/bulk/delete/result.rb +0 -71
  1629. data/lib/mongo/operation/write/bulk/delete.rb +0 -71
  1630. data/lib/mongo/operation/write/bulk/insert/result.rb +0 -129
  1631. data/lib/mongo/operation/write/bulk/insert.rb +0 -96
  1632. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +0 -87
  1633. data/lib/mongo/operation/write/bulk/mergable.rb +0 -71
  1634. data/lib/mongo/operation/write/bulk/update/result.rb +0 -205
  1635. data/lib/mongo/operation/write/bulk/update.rb +0 -81
  1636. data/lib/mongo/operation/write/bulk.rb +0 -20
  1637. data/lib/mongo/operation/write/command/create_index.rb +0 -49
  1638. data/lib/mongo/operation/write/command/create_user.rb +0 -42
  1639. data/lib/mongo/operation/write/command/delete.rb +0 -56
  1640. data/lib/mongo/operation/write/command/drop_index.rb +0 -50
  1641. data/lib/mongo/operation/write/command/insert.rb +0 -66
  1642. data/lib/mongo/operation/write/command/remove_user.rb +0 -41
  1643. data/lib/mongo/operation/write/command/update.rb +0 -62
  1644. data/lib/mongo/operation/write/command/update_user.rb +0 -42
  1645. data/lib/mongo/operation/write/command/writable.rb +0 -57
  1646. data/lib/mongo/operation/write/command.rb +0 -23
  1647. data/lib/mongo/operation/write/create_index.rb +0 -67
  1648. data/lib/mongo/operation/write/create_user.rb +0 -50
  1649. data/lib/mongo/operation/write/delete/result.rb +0 -40
  1650. data/lib/mongo/operation/write/delete.rb +0 -71
  1651. data/lib/mongo/operation/write/drop_index.rb +0 -63
  1652. data/lib/mongo/operation/write/gle.rb +0 -49
  1653. data/lib/mongo/operation/write/idable.rb +0 -63
  1654. data/lib/mongo/operation/write/insert/result.rb +0 -62
  1655. data/lib/mongo/operation/write/insert.rb +0 -71
  1656. data/lib/mongo/operation/write/remove_user.rb +0 -48
  1657. data/lib/mongo/operation/write/update/result.rb +0 -160
  1658. data/lib/mongo/operation/write/update.rb +0 -81
  1659. data/lib/mongo/operation/write/update_user.rb +0 -50
  1660. data/lib/mongo/operation/write/write_command_enabled.rb +0 -54
  1661. data/lib/mongo/operation/write.rb +0 -27
  1662. data/lib/mongo/server/connectable.rb +0 -113
  1663. data/lib/mongo/server/connection_pool/queue.rb +0 -197
  1664. data/lib/mongo/server/context.rb +0 -69
  1665. data/lib/mongo/server/description/inspector/description_changed.rb +0 -57
  1666. data/lib/mongo/server/description/inspector/primary_elected.rb +0 -58
  1667. data/lib/mongo/server/description/inspector/standalone_discovered.rb +0 -56
  1668. data/lib/mongo/server/description/inspector.rb +0 -79
  1669. data/lib/mongo/server_selector/selectable.rb +0 -222
  1670. data/lib/mongo/write_concern/normalizable.rb +0 -52
  1671. data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
  1672. data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
  1673. data/spec/mongo/command_monitoring_spec.rb +0 -64
  1674. data/spec/mongo/connection_string_spec.rb +0 -115
  1675. data/spec/mongo/crud_spec.rb +0 -42
  1676. data/spec/mongo/gridfs_spec.rb +0 -50
  1677. data/spec/mongo/operation/commands/aggregate/result_spec.rb +0 -80
  1678. data/spec/mongo/operation/commands/aggregate_spec.rb +0 -72
  1679. data/spec/mongo/operation/commands/collections_info_spec.rb +0 -40
  1680. data/spec/mongo/operation/commands/command_spec.rb +0 -80
  1681. data/spec/mongo/operation/commands/indexes_spec.rb +0 -31
  1682. data/spec/mongo/operation/commands/map_reduce_spec.rb +0 -125
  1683. data/spec/mongo/operation/read/get_more_spec.rb +0 -53
  1684. data/spec/mongo/operation/read/query_spec.rb +0 -102
  1685. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1686. data/spec/mongo/operation/write/bulk/delete_spec.rb +0 -223
  1687. data/spec/mongo/operation/write/bulk/insert_spec.rb +0 -250
  1688. data/spec/mongo/operation/write/bulk/update_spec.rb +0 -220
  1689. data/spec/mongo/operation/write/command/delete_spec.rb +0 -106
  1690. data/spec/mongo/operation/write/command/insert_spec.rb +0 -105
  1691. data/spec/mongo/operation/write/command/update_spec.rb +0 -110
  1692. data/spec/mongo/operation/write/create_index_spec.rb +0 -63
  1693. data/spec/mongo/operation/write/create_user_spec.rb +0 -44
  1694. data/spec/mongo/operation/write/delete_spec.rb +0 -215
  1695. data/spec/mongo/operation/write/drop_index_spec.rb +0 -51
  1696. data/spec/mongo/operation/write/insert_spec.rb +0 -291
  1697. data/spec/mongo/operation/write/remove_user_spec.rb +0 -46
  1698. data/spec/mongo/operation/write/update_spec.rb +0 -256
  1699. data/spec/mongo/operation/write/update_user_spec.rb +0 -46
  1700. data/spec/mongo/server/connection_pool/queue_spec.rb +0 -190
  1701. data/spec/mongo/server/description/inspector/description_changed_spec.rb +0 -78
  1702. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +0 -94
  1703. data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
  1704. data/spec/mongo/server_selection_rtt_spec.rb +0 -85
  1705. data/spec/mongo/server_selection_spec.rb +0 -90
  1706. data/spec/support/certificates/ca.pem +0 -17
  1707. data/spec/support/certificates/password_protected.pem +0 -51
  1708. data/spec/support/command_monitoring/bulkWrite.yml +0 -73
  1709. data/spec/support/command_monitoring/command.yml +0 -42
  1710. data/spec/support/command_monitoring/find.yml +0 -268
  1711. data/spec/support/command_monitoring/insertMany.yml +0 -81
  1712. data/spec/support/command_monitoring/updateMany.yml +0 -67
  1713. data/spec/support/command_monitoring/updateOne.yml +0 -95
  1714. data/spec/support/command_monitoring.rb +0 -376
  1715. data/spec/support/connection_string.rb +0 -228
  1716. data/spec/support/connection_string_tests/invalid-uris.yml +0 -193
  1717. data/spec/support/connection_string_tests/valid-auth.yml +0 -256
  1718. data/spec/support/connection_string_tests/valid-options.yml +0 -30
  1719. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +0 -197
  1720. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +0 -213
  1721. data/spec/support/connection_string_tests/valid-warnings.yml +0 -55
  1722. data/spec/support/crud/read.rb +0 -164
  1723. data/spec/support/crud/write.rb +0 -243
  1724. data/spec/support/crud.rb +0 -211
  1725. data/spec/support/crud_tests/read/aggregate.yml +0 -43
  1726. data/spec/support/crud_tests/read/count.yml +0 -37
  1727. data/spec/support/crud_tests/read/distinct.yml +0 -33
  1728. data/spec/support/crud_tests/read/find.yml +0 -50
  1729. data/spec/support/crud_tests/write/deleteMany.yml +0 -36
  1730. data/spec/support/crud_tests/write/deleteOne.yml +0 -49
  1731. data/spec/support/crud_tests/write/findOneAndDelete.yml +0 -54
  1732. data/spec/support/crud_tests/write/findOneAndReplace.yml +0 -153
  1733. data/spec/support/crud_tests/write/findOneAndUpdate.yml +0 -161
  1734. data/spec/support/crud_tests/write/insertMany.yml +0 -24
  1735. data/spec/support/crud_tests/write/insertOne.yml +0 -19
  1736. data/spec/support/crud_tests/write/replaceOne.yml +0 -96
  1737. data/spec/support/crud_tests/write/updateMany.yml +0 -83
  1738. data/spec/support/crud_tests/write/updateOne.yml +0 -80
  1739. data/spec/support/gridfs.rb +0 -637
  1740. data/spec/support/gridfs_tests/delete.yml +0 -157
  1741. data/spec/support/gridfs_tests/download.yml +0 -210
  1742. data/spec/support/helpers.rb +0 -140
  1743. data/spec/support/sdam/rs/discover_arbiters.yml +0 -41
  1744. data/spec/support/sdam/rs/discover_passives.yml +0 -77
  1745. data/spec/support/sdam/rs/discover_primary.yml +0 -40
  1746. data/spec/support/sdam/rs/discover_secondary.yml +0 -41
  1747. data/spec/support/sdam/rs/discovery.yml +0 -195
  1748. data/spec/support/sdam/rs/equal_electionids.yml +0 -48
  1749. data/spec/support/sdam/rs/ghost_discovered.yml +0 -39
  1750. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +0 -34
  1751. data/spec/support/sdam/rs/member_reconfig.yml +0 -68
  1752. data/spec/support/sdam/rs/member_standalone.yml +0 -60
  1753. data/spec/support/sdam/rs/new_primary.yml +0 -74
  1754. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -101
  1755. data/spec/support/sdam/rs/new_primary_new_setversion.yml +0 -101
  1756. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +0 -71
  1757. data/spec/support/sdam/rs/non_rs_member.yml +0 -31
  1758. data/spec/support/sdam/rs/normalize_case.yml +0 -49
  1759. data/spec/support/sdam/rs/null_election_id.yml +0 -151
  1760. data/spec/support/sdam/rs/primary_becomes_standalone.yml +0 -52
  1761. data/spec/support/sdam/rs/primary_changes_set_name.yml +0 -57
  1762. data/spec/support/sdam/rs/primary_disconnect.yml +0 -56
  1763. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +0 -160
  1764. data/spec/support/sdam/rs/primary_disconnect_setversion.yml +0 -160
  1765. data/spec/support/sdam/rs/primary_mismatched_me.yml +0 -37
  1766. data/spec/support/sdam/rs/primary_reports_new_member.yml +0 -163
  1767. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +0 -75
  1768. data/spec/support/sdam/rs/primary_wrong_set_name.yml +0 -27
  1769. data/spec/support/sdam/rs/response_from_removed.yml +0 -63
  1770. data/spec/support/sdam/rs/rsother_discovered.yml +0 -62
  1771. data/spec/support/sdam/rs/sec_not_auth.yml +0 -49
  1772. data/spec/support/sdam/rs/secondary_mismatched_me.yml +0 -37
  1773. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +0 -28
  1774. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +0 -69
  1775. data/spec/support/sdam/rs/set_version_without_electionid.yml +0 -69
  1776. data/spec/support/sdam/rs/setversion_without_electionid.yml +0 -69
  1777. data/spec/support/sdam/rs/stepdown_change_set_name.yml +0 -59
  1778. data/spec/support/sdam/rs/unexpected_mongos.yml +0 -26
  1779. data/spec/support/sdam/rs/use_setversion_without_electionid.yml +0 -99
  1780. data/spec/support/sdam/rs/wrong_set_name.yml +0 -35
  1781. data/spec/support/sdam/sharded/mongos_disconnect.yml +0 -104
  1782. data/spec/support/sdam/sharded/multiple_mongoses.yml +0 -46
  1783. data/spec/support/sdam/sharded/non_mongos_removed.yml +0 -41
  1784. data/spec/support/sdam/sharded/normalize_uri_case.yml +0 -32
  1785. data/spec/support/sdam/sharded/single_mongos.yml +0 -33
  1786. data/spec/support/sdam/single/direct_connection_external_ip.yml +0 -34
  1787. data/spec/support/sdam/single/direct_connection_mongos.yml +0 -33
  1788. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +0 -35
  1789. data/spec/support/sdam/single/direct_connection_rsprimary.yml +0 -34
  1790. data/spec/support/sdam/single/direct_connection_rssecondary.yml +0 -35
  1791. data/spec/support/sdam/single/direct_connection_slave.yml +0 -32
  1792. data/spec/support/sdam/single/direct_connection_standalone.yml +0 -32
  1793. data/spec/support/sdam/single/not_ok_response.yml +0 -38
  1794. data/spec/support/sdam/single/standalone_removed.yml +0 -32
  1795. data/spec/support/sdam/single/unavailable_seed.yml +0 -28
  1796. data/spec/support/server_discovery_and_monitoring.rb +0 -186
  1797. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +0 -26
  1798. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -21
  1799. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +0 -21
  1800. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -26
  1801. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -21
  1802. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +0 -26
  1803. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -26
  1804. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -21
  1805. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -21
  1806. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +0 -33
  1807. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -26
  1808. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +0 -29
  1809. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -29
  1810. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -29
  1811. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +0 -31
  1812. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -31
  1813. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -29
  1814. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -26
  1815. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +0 -26
  1816. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +0 -19
  1817. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +0 -11
  1818. data/spec/support/server_selection.rb +0 -135
  1819. data/spec/support/server_selection_rtt.rb +0 -41
  1820. data/spec/support/travis.rb +0 -14
@@ -0,0 +1,1094 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2017-2020 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'mongo/session/session_pool'
19
+ require 'mongo/session/server_session'
20
+
21
+ module Mongo
22
+
23
+ # A logical session representing a set of sequential operations executed
24
+ # by an application that are related in some way.
25
+ #
26
+ # @note Session objects are not thread-safe. An application may use a session
27
+ # from only one thread or process at a time.
28
+ #
29
+ # @since 2.5.0
30
+ class Session
31
+ extend Forwardable
32
+ include Retryable
33
+ include Loggable
34
+ include ClusterTime::Consumer
35
+
36
+ # Initialize a Session.
37
+ #
38
+ # @note Applications should use Client#start_session to begin a session.
39
+ #
40
+ # @example
41
+ # Session.new(server_session, client, options)
42
+ #
43
+ # @param [ ServerSession ] server_session The server session this session is associated with.
44
+ # @param [ Client ] client The client through which this session is created.
45
+ # @param [ Hash ] options The options for this session.
46
+ #
47
+ # @option options [ true|false ] :causal_consistency Whether to enable
48
+ # causal consistency for this session.
49
+ # @option options [ Hash ] :default_transaction_options Options to pass
50
+ # to start_transaction by default, can contain any of the options that
51
+ # start_transaction accepts.
52
+ # @option options [ true|false ] :implicit For internal driver use only -
53
+ # specifies whether the session is implicit.
54
+ # @option options [ Hash ] :read_preference The read preference options hash,
55
+ # with the following optional keys:
56
+ # - *:mode* -- the read preference as a string or symbol; valid values are
57
+ # *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
58
+ # and *:nearest*.
59
+ #
60
+ # @since 2.5.0
61
+ # @api private
62
+ def initialize(server_session, client, options = {})
63
+ @server_session = server_session
64
+ options = options.dup
65
+
66
+ @client = client.use(:admin)
67
+ @options = options.freeze
68
+ @cluster_time = nil
69
+ @state = NO_TRANSACTION_STATE
70
+ end
71
+
72
+ # @return [ Hash ] The options for this session.
73
+ #
74
+ # @since 2.5.0
75
+ attr_reader :options
76
+
77
+ # @return [ Client ] The client through which this session was created.
78
+ #
79
+ # @since 2.5.1
80
+ attr_reader :client
81
+
82
+ def cluster
83
+ @client.cluster
84
+ end
85
+
86
+ # @return [ BSON::Timestamp ] The latest seen operation time for this session.
87
+ #
88
+ # @since 2.5.0
89
+ attr_reader :operation_time
90
+
91
+ # @return [ Hash ] The options for the transaction currently being executed
92
+ # on this session.
93
+ #
94
+ # @since 2.6.0
95
+ def txn_options
96
+ @txn_options or raise ArgumentError, "There is no active transaction"
97
+ end
98
+
99
+ # Is this session an implicit one (not user-created).
100
+ #
101
+ # @example Is the session implicit?
102
+ # session.implicit?
103
+ #
104
+ # @return [ true, false ] Whether this session is implicit.
105
+ #
106
+ # @since 2.5.1
107
+ def implicit?
108
+ @implicit ||= !!(@options.key?(:implicit) && @options[:implicit] == true)
109
+ end
110
+
111
+ # Is this session an explicit one (i.e. user-created).
112
+ #
113
+ # @example Is the session explicit?
114
+ # session.explicit?
115
+ #
116
+ # @return [ true, false ] Whether this session is explicit.
117
+ #
118
+ # @since 2.5.2
119
+ def explicit?
120
+ !implicit?
121
+ end
122
+
123
+ # Whether reads executed with this session can be retried according to
124
+ # the modern retryable reads specification.
125
+ #
126
+ # If this method returns true, the modern retryable reads have been
127
+ # requested by the application. If the server selected for a read operation
128
+ # supports modern retryable reads, they will be used for that particular
129
+ # operation. If the server selected for a read operation does not support
130
+ # modern retryable reads, the read will not be retried.
131
+ #
132
+ # If this method returns false, legacy retryable reads have been requested
133
+ # by the application. Legacy retryable read logic will be used regardless
134
+ # of server version of the server(s) that the client is connected to.
135
+ # The number of read retries is given by :max_read_retries client option,
136
+ # which is 1 by default and can be set to 0 to disable legacy read retries.
137
+ #
138
+ # @api private
139
+ def retry_reads?
140
+ client.options[:retry_reads] != false
141
+ end
142
+
143
+ # Will writes executed with this session be retried.
144
+ #
145
+ # @example Will writes be retried.
146
+ # session.retry_writes?
147
+ #
148
+ # @return [ true, false ] If writes will be retried.
149
+ #
150
+ # @note Retryable writes are only available on server versions at least 3.6
151
+ # and with sharded clusters or replica sets.
152
+ #
153
+ # @since 2.5.0
154
+ def retry_writes?
155
+ !!client.options[:retry_writes] && (cluster.replica_set? || cluster.sharded?)
156
+ end
157
+
158
+ # Get the read preference the session will use in the currently
159
+ # active transaction.
160
+ #
161
+ # This is a driver style hash with underscore keys.
162
+ #
163
+ # @example Get the transaction's read preference
164
+ # session.txn_read_preference
165
+ #
166
+ # @return [ Hash ] The read preference of the transaction.
167
+ #
168
+ # @since 2.6.0
169
+ def txn_read_preference
170
+ rp = txn_options[:read] ||
171
+ @client.read_preference
172
+ Mongo::Lint.validate_underscore_read_preference(rp)
173
+ rp
174
+ end
175
+
176
+ # Whether this session has ended.
177
+ #
178
+ # @example
179
+ # session.ended?
180
+ #
181
+ # @return [ true, false ] Whether the session has ended.
182
+ #
183
+ # @since 2.5.0
184
+ def ended?
185
+ @server_session.nil?
186
+ end
187
+
188
+ # Get the server session id of this session, if the session was not ended.
189
+ # If the session was ended, returns nil.
190
+ #
191
+ # @example Get the session id.
192
+ # session.session_id
193
+ #
194
+ # @return [ BSON::Document ] The server session id.
195
+ #
196
+ # @since 2.5.0
197
+ def session_id
198
+ if ended?
199
+ raise Error::SessionEnded
200
+ end
201
+
202
+ @server_session.session_id
203
+ end
204
+
205
+ # @return [ Server | nil ] The server (which should be a mongos) that this
206
+ # session is pinned to, if any.
207
+ #
208
+ # @api private
209
+ attr_reader :pinned_server
210
+
211
+ # @return [ Object | nil ] The service id that this session is pinned to,
212
+ # if any.
213
+ #
214
+ # @api private
215
+ attr_reader :pinned_service_id
216
+
217
+ # @return [ BSON::Document | nil ] Recovery token for the sharded
218
+ # transaction being executed on this session, if any.
219
+ #
220
+ # @api private
221
+ attr_accessor :recovery_token
222
+
223
+ # Error message indicating that the session was retrieved from a client with a different cluster than that of the
224
+ # client through which it is currently being used.
225
+ #
226
+ # @since 2.5.0
227
+ MISMATCHED_CLUSTER_ERROR_MSG = 'The configuration of the client used to create this session does not match that ' +
228
+ 'of the client owning this operation. Please only use this session for operations through its parent ' +
229
+ 'client.'.freeze
230
+
231
+ # Error message describing that the session cannot be used because it has already been ended.
232
+ #
233
+ # @since 2.5.0
234
+ SESSION_ENDED_ERROR_MSG = 'This session has ended and cannot be used. Please create a new one.'.freeze
235
+
236
+ # Error message describing that sessions are not supported by the server version.
237
+ #
238
+ # @since 2.5.0
239
+ # @deprecated
240
+ SESSIONS_NOT_SUPPORTED = 'Sessions are not supported by the connected servers.'.freeze
241
+ # Note: SESSIONS_NOT_SUPPORTED is used by Mongoid - do not remove from driver.
242
+
243
+ # The state of a session in which the last operation was not related to
244
+ # any transaction or no operations have yet occurred.
245
+ #
246
+ # @since 2.6.0
247
+ NO_TRANSACTION_STATE = :no_transaction
248
+
249
+ # The state of a session in which a user has initiated a transaction but
250
+ # no operations within the transactions have occurred yet.
251
+ #
252
+ # @since 2.6.0
253
+ STARTING_TRANSACTION_STATE = :starting_transaction
254
+
255
+ # The state of a session in which a transaction has been started and at
256
+ # least one operation has occurred, but the transaction has not yet been
257
+ # committed or aborted.
258
+ #
259
+ # @since 2.6.0
260
+ TRANSACTION_IN_PROGRESS_STATE = :transaction_in_progress
261
+
262
+ # The state of a session in which the last operation executed was a transaction commit.
263
+ #
264
+ # @since 2.6.0
265
+ TRANSACTION_COMMITTED_STATE = :transaction_committed
266
+
267
+ # The state of a session in which the last operation executed was a transaction abort.
268
+ #
269
+ # @since 2.6.0
270
+ TRANSACTION_ABORTED_STATE = :transaction_aborted
271
+
272
+ # @api private
273
+ UNLABELED_WRITE_CONCERN_CODES = [
274
+ 79, # UnknownReplWriteConcern
275
+ 100, # CannotSatisfyWriteConcern,
276
+ ].freeze
277
+
278
+ # Get a formatted string for use in inspection.
279
+ #
280
+ # @example Inspect the session object.
281
+ # session.inspect
282
+ #
283
+ # @return [ String ] The session inspection.
284
+ #
285
+ # @since 2.5.0
286
+ def inspect
287
+ "#<Mongo::Session:0x#{object_id} session_id=#{session_id} options=#{@options}>"
288
+ end
289
+
290
+ # End this session.
291
+ #
292
+ # If there is an in-progress transaction on this session, the transaction
293
+ # is aborted. The server session associated with this session is returned
294
+ # to the server session pool. Finally, this session is marked ended and
295
+ # is no longer usable.
296
+ #
297
+ # If this session is already ended, this method does nothing.
298
+ #
299
+ # Note that this method does not directly issue an endSessions command
300
+ # to this server, contrary to what its name might suggest.
301
+ #
302
+ # @example
303
+ # session.end_session
304
+ #
305
+ # @return [ nil ] Always nil.
306
+ #
307
+ # @since 2.5.0
308
+ def end_session
309
+ if !ended? && @client
310
+ if within_states?(TRANSACTION_IN_PROGRESS_STATE)
311
+ begin
312
+ abort_transaction
313
+ rescue Mongo::Error, Error::AuthError
314
+ end
315
+ end
316
+ @client.cluster.session_pool.checkin(@server_session)
317
+ end
318
+ ensure
319
+ @server_session = nil
320
+ end
321
+
322
+ # Executes the provided block in a transaction, retrying as necessary.
323
+ #
324
+ # Returns the return value of the block.
325
+ #
326
+ # Exact number of retries and when they are performed are implementation
327
+ # details of the driver; the provided block should be idempotent, and
328
+ # should be prepared to be called more than once. The driver may retry
329
+ # the commit command within an active transaction or it may repeat the
330
+ # transaction and invoke the block again, depending on the error
331
+ # encountered if any. Note also that the retries may be executed against
332
+ # different servers.
333
+ #
334
+ # Transactions cannot be nested - InvalidTransactionOperation will be raised
335
+ # if this method is called when the session already has an active transaction.
336
+ #
337
+ # Exceptions raised by the block which are not derived from Mongo::Error
338
+ # stop processing, abort the transaction and are propagated out of
339
+ # with_transaction. Exceptions derived from Mongo::Error may be
340
+ # handled by with_transaction, resulting in retries of the process.
341
+ #
342
+ # Currently, with_transaction will retry commits and block invocations
343
+ # until at least 120 seconds have passed since with_transaction started
344
+ # executing. This timeout is not configurable and may change in a future
345
+ # driver version.
346
+ #
347
+ # @note with_transaction contains a loop, therefore the if with_transaction
348
+ # itself is placed in a loop, its block should not call next or break to
349
+ # control the outer loop because this will instead affect the loop in
350
+ # with_transaction. The driver will warn and abort the transaction
351
+ # if it detects this situation.
352
+ #
353
+ # @example Execute a statement in a transaction
354
+ # session.with_transaction(write_concern: {w: :majority}) do
355
+ # collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
356
+ # session: session)
357
+ #
358
+ # end
359
+ #
360
+ # @example Execute a statement in a transaction, limiting total time consumed
361
+ # Timeout.timeout(5) do
362
+ # session.with_transaction(write_concern: {w: :majority}) do
363
+ # collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
364
+ # session: session)
365
+ #
366
+ # end
367
+ # end
368
+ #
369
+ # @param [ Hash ] options The options for the transaction being started.
370
+ # These are the same options that start_transaction accepts.
371
+ #
372
+ # @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
373
+ # progress or if the write concern is unacknowledged.
374
+ #
375
+ # @since 2.7.0
376
+ def with_transaction(options=nil)
377
+ # Non-configurable 120 second timeout for the entire operation
378
+ deadline = Utils.monotonic_time + 120
379
+ transaction_in_progress = false
380
+ loop do
381
+ commit_options = {}
382
+ if options
383
+ commit_options[:write_concern] = options[:write_concern]
384
+ end
385
+ start_transaction(options)
386
+ transaction_in_progress = true
387
+ begin
388
+ rv = yield self
389
+ rescue Exception => e
390
+ if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
391
+ log_warn("Aborting transaction due to #{e.class}: #{e}")
392
+ abort_transaction
393
+ transaction_in_progress = false
394
+ end
395
+
396
+ if Utils.monotonic_time >= deadline
397
+ transaction_in_progress = false
398
+ raise
399
+ end
400
+
401
+ if e.is_a?(Mongo::Error) && e.label?('TransientTransactionError')
402
+ next
403
+ end
404
+
405
+ raise
406
+ else
407
+ if within_states?(TRANSACTION_ABORTED_STATE, NO_TRANSACTION_STATE, TRANSACTION_COMMITTED_STATE)
408
+ transaction_in_progress = false
409
+ return rv
410
+ end
411
+
412
+ begin
413
+ commit_transaction(commit_options)
414
+ transaction_in_progress = false
415
+ return rv
416
+ rescue Mongo::Error => e
417
+ if e.label?('UnknownTransactionCommitResult')
418
+ if Utils.monotonic_time >= deadline ||
419
+ e.is_a?(Error::OperationFailure) && e.max_time_ms_expired?
420
+ then
421
+ transaction_in_progress = false
422
+ raise
423
+ end
424
+ wc_options = case v = commit_options[:write_concern]
425
+ when WriteConcern::Base
426
+ v.options
427
+ when nil
428
+ {}
429
+ else
430
+ v
431
+ end
432
+ commit_options[:write_concern] = wc_options.merge(w: :majority)
433
+ retry
434
+ elsif e.label?('TransientTransactionError')
435
+ if Utils.monotonic_time >= deadline
436
+ transaction_in_progress = false
437
+ raise
438
+ end
439
+ @state = NO_TRANSACTION_STATE
440
+ next
441
+ else
442
+ transaction_in_progress = false
443
+ raise
444
+ end
445
+ rescue Error::AuthError
446
+ transaction_in_progress = false
447
+ raise
448
+ end
449
+ end
450
+ end
451
+
452
+ # No official return value, but return true so that in interactive
453
+ # use the method hints that it succeeded.
454
+ true
455
+ ensure
456
+ if transaction_in_progress
457
+ log_warn('with_transaction callback broke out of with_transaction loop, aborting transaction')
458
+ begin
459
+ abort_transaction
460
+ rescue Error::OperationFailure, Error::InvalidTransactionOperation
461
+ end
462
+ end
463
+ end
464
+
465
+ # Places subsequent operations in this session into a new transaction.
466
+ #
467
+ # Note that the transaction will not be started on the server until an
468
+ # operation is performed after start_transaction is called.
469
+ #
470
+ # @example Start a new transaction
471
+ # session.start_transaction(options)
472
+ #
473
+ # @param [ Hash ] options The options for the transaction being started.
474
+ #
475
+ # @option options [ Integer ] :max_commit_time_ms The maximum amount of
476
+ # time to allow a single commitTransaction command to run, in milliseconds.
477
+ # @option options [ Hash ] read_concern The read concern options hash,
478
+ # with the following optional keys:
479
+ # - *:level* -- the read preference level as a symbol; valid values
480
+ # are *:local*, *:majority*, and *:snapshot*
481
+ # @option options [ Hash ] :write_concern The write concern options. Can be :w =>
482
+ # Integer|String, :fsync => Boolean, :j => Boolean.
483
+ # @option options [ Hash ] :read The read preference options. The hash may have the following
484
+ # items:
485
+ # - *:mode* -- read preference specified as a symbol; the only valid value is
486
+ # *:primary*.
487
+ #
488
+ # @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
489
+ # progress or if the write concern is unacknowledged.
490
+ #
491
+ # @since 2.6.0
492
+ def start_transaction(options = nil)
493
+ if options
494
+ Lint.validate_read_concern_option(options[:read_concern])
495
+
496
+ =begin
497
+ # It would be handy to detect invalid read preferences here, but
498
+ # some of the spec tests require later detection of invalid read prefs.
499
+ # Maybe we can do this when lint mode is on.
500
+ mode = options[:read] && options[:read][:mode].to_s
501
+ if mode && mode != 'primary'
502
+ raise Mongo::Error::InvalidTransactionOperation.new(
503
+ "read preference in a transaction must be primary (requested: #{mode})"
504
+ )
505
+ end
506
+ =end
507
+ end
508
+
509
+ check_if_ended!
510
+
511
+ if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
512
+ raise Mongo::Error::InvalidTransactionOperation.new(
513
+ Mongo::Error::InvalidTransactionOperation::TRANSACTION_ALREADY_IN_PROGRESS)
514
+ end
515
+
516
+ unpin
517
+
518
+ next_txn_num
519
+ @txn_options = (@options[:default_transaction_options] || {}).merge(options || {})
520
+
521
+ if txn_write_concern && !WriteConcern.get(txn_write_concern).acknowledged?
522
+ raise Mongo::Error::InvalidTransactionOperation.new(
523
+ Mongo::Error::InvalidTransactionOperation::UNACKNOWLEDGED_WRITE_CONCERN)
524
+ end
525
+
526
+ @state = STARTING_TRANSACTION_STATE
527
+ @already_committed = false
528
+
529
+ # This method has no explicit return value.
530
+ # We could return nil here but true indicates to the user that the
531
+ # operation succeeded. This is intended for interactive use.
532
+ # Note that the return value is not documented.
533
+ true
534
+ end
535
+
536
+ # Commit the currently active transaction on the session.
537
+ #
538
+ # @example Commits the transaction.
539
+ # session.commit_transaction
540
+ #
541
+ # @option options :write_concern [ nil | WriteConcern::Base ] The write
542
+ # concern to use for this operation.
543
+ #
544
+ # @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
545
+ #
546
+ # @since 2.6.0
547
+ def commit_transaction(options=nil)
548
+ QueryCache.clear
549
+ check_if_ended!
550
+ check_if_no_transaction!
551
+
552
+ if within_states?(TRANSACTION_ABORTED_STATE)
553
+ raise Mongo::Error::InvalidTransactionOperation.new(
554
+ Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
555
+ :abortTransaction, :commitTransaction))
556
+ end
557
+
558
+ options ||= {}
559
+
560
+ begin
561
+ # If commitTransaction is called twice, we need to run the same commit
562
+ # operation again, so we revert the session to the previous state.
563
+ if within_states?(TRANSACTION_COMMITTED_STATE)
564
+ @state = @last_commit_skipped ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGRESS_STATE
565
+ @already_committed = true
566
+ end
567
+
568
+ if starting_transaction?
569
+ @last_commit_skipped = true
570
+ else
571
+ @last_commit_skipped = false
572
+ @committing_transaction = true
573
+
574
+ write_concern = options[:write_concern] || txn_options[:write_concern]
575
+ if write_concern && !write_concern.is_a?(WriteConcern::Base)
576
+ write_concern = WriteConcern.get(write_concern)
577
+ end
578
+ write_with_retry(self, write_concern, true) do |server, txn_num, is_retry|
579
+ if is_retry
580
+ if write_concern
581
+ wco = write_concern.options.merge(w: :majority)
582
+ wco[:wtimeout] ||= 10000
583
+ write_concern = WriteConcern.get(wco)
584
+ else
585
+ write_concern = WriteConcern.get(w: :majority, wtimeout: 10000)
586
+ end
587
+ end
588
+ spec = {
589
+ selector: { commitTransaction: 1 },
590
+ db_name: 'admin',
591
+ session: self,
592
+ txn_num: txn_num,
593
+ write_concern: write_concern,
594
+ }
595
+ Operation::Command.new(spec).execute(server, context: Operation::Context.new(client: @client, session: self))
596
+ end
597
+ end
598
+ ensure
599
+ @state = TRANSACTION_COMMITTED_STATE
600
+ @committing_transaction = false
601
+ end
602
+
603
+ # No official return value, but return true so that in interactive
604
+ # use the method hints that it succeeded.
605
+ true
606
+ end
607
+
608
+ # Abort the currently active transaction without making any changes to the database.
609
+ #
610
+ # @example Abort the transaction.
611
+ # session.abort_transaction
612
+ #
613
+ # @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
614
+ #
615
+ # @since 2.6.0
616
+ def abort_transaction
617
+ QueryCache.clear
618
+
619
+ check_if_ended!
620
+ check_if_no_transaction!
621
+
622
+ if within_states?(TRANSACTION_COMMITTED_STATE)
623
+ raise Mongo::Error::InvalidTransactionOperation.new(
624
+ Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
625
+ :commitTransaction, :abortTransaction))
626
+ end
627
+
628
+ if within_states?(TRANSACTION_ABORTED_STATE)
629
+ raise Mongo::Error::InvalidTransactionOperation.new(
630
+ Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
631
+ end
632
+
633
+ begin
634
+ unless starting_transaction?
635
+ @aborting_transaction = true
636
+ write_with_retry(self, txn_options[:write_concern], true) do |server, txn_num|
637
+ begin
638
+ Operation::Command.new(
639
+ selector: { abortTransaction: 1 },
640
+ db_name: 'admin',
641
+ session: self,
642
+ txn_num: txn_num
643
+ ).execute(server, context: Operation::Context.new(client: @client, session: self))
644
+ ensure
645
+ unpin
646
+ end
647
+ end
648
+ end
649
+
650
+ @state = TRANSACTION_ABORTED_STATE
651
+ rescue Mongo::Error::InvalidTransactionOperation
652
+ raise
653
+ rescue Mongo::Error
654
+ @state = TRANSACTION_ABORTED_STATE
655
+ rescue Exception
656
+ @state = TRANSACTION_ABORTED_STATE
657
+ raise
658
+ ensure
659
+ @aborting_transaction = false
660
+ end
661
+
662
+ # No official return value, but return true so that in interactive
663
+ # use the method hints that it succeeded.
664
+ true
665
+ end
666
+
667
+ # @api private
668
+ def starting_transaction?
669
+ within_states?(STARTING_TRANSACTION_STATE)
670
+ end
671
+
672
+ # Whether or not the session is currently in a transaction.
673
+ #
674
+ # @example Is the session in a transaction?
675
+ # session.in_transaction?
676
+ #
677
+ # @return [ true | false ] Whether or not the session in a transaction.
678
+ #
679
+ # @since 2.6.0
680
+ def in_transaction?
681
+ within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
682
+ end
683
+
684
+ # @return [ true | false ] Whether the session is currently committing a
685
+ # transaction.
686
+ #
687
+ # @api private
688
+ def committing_transaction?
689
+ !!@committing_transaction
690
+ end
691
+
692
+ # @return [ true | false ] Whether the session is currently aborting a
693
+ # transaction.
694
+ #
695
+ # @api private
696
+ def aborting_transaction?
697
+ !!@aborting_transaction
698
+ end
699
+
700
+ # Pins this session to the specified server, which should be a mongos.
701
+ #
702
+ # @param [ Server ] server The server to pin this session to.
703
+ #
704
+ # @api private
705
+ def pin_to_server(server)
706
+ if server.nil?
707
+ raise ArgumentError, 'Cannot pin to a nil server'
708
+ end
709
+ if Lint.enabled?
710
+ unless server.mongos?
711
+ raise Error::LintError, "Attempted to pin the session to server #{server.summary} which is not a mongos"
712
+ end
713
+ end
714
+ @pinned_server = server
715
+ end
716
+
717
+ # Pins this session to the specified service.
718
+ #
719
+ # @param [ Object ] service_id The service id to pin this session to.
720
+ #
721
+ # @api private
722
+ def pin_to_service(service_id)
723
+ if service_id.nil?
724
+ raise ArgumentError, 'Cannot pin to a nil service id'
725
+ end
726
+ @pinned_service_id = service_id
727
+ end
728
+
729
+ # Unpins this session from the pinned server, if the session was pinned.
730
+ #
731
+ # @api private
732
+ def unpin
733
+ @pinned_server = nil
734
+ @pinned_service_id = nil
735
+ end
736
+
737
+ # Unpins this session from the pinned server, if the session was pinned
738
+ # and the specified exception instance and the session's transaction state
739
+ # require it to be unpinned.
740
+ #
741
+ # The exception instance should already have all of the labels set on it
742
+ # (both client- and server-side generated ones).
743
+ #
744
+ # @param [ Error ] error The exception instance to process.
745
+ #
746
+ # @api private
747
+ def unpin_maybe(error)
748
+ if !within_states?(Session::NO_TRANSACTION_STATE) &&
749
+ error.label?('TransientTransactionError')
750
+ then
751
+ unpin
752
+ end
753
+
754
+ if committing_transaction? &&
755
+ error.label?('UnknownTransactionCommitResult')
756
+ then
757
+ unpin
758
+ end
759
+ end
760
+
761
+ # Add the autocommit field to a command document if applicable.
762
+ #
763
+ # @example
764
+ # session.add_autocommit!(cmd)
765
+ #
766
+ # @return [ Hash, BSON::Document ] The command document.
767
+ #
768
+ # @since 2.6.0
769
+ # @api private
770
+ def add_autocommit!(command)
771
+ command.tap do |c|
772
+ c[:autocommit] = false if in_transaction?
773
+ end
774
+ end
775
+
776
+ # Add the startTransaction field to a command document if applicable.
777
+ #
778
+ # @example
779
+ # session.add_start_transaction!(cmd)
780
+ #
781
+ # @return [ Hash, BSON::Document ] The command document.
782
+ #
783
+ # @since 2.6.0
784
+ # @api private
785
+ def add_start_transaction!(command)
786
+ command.tap do |c|
787
+ if starting_transaction?
788
+ c[:startTransaction] = true
789
+ end
790
+ end
791
+ end
792
+
793
+ # Add the transaction number to a command document if applicable.
794
+ #
795
+ # @example
796
+ # session.add_txn_num!(cmd)
797
+ #
798
+ # @return [ Hash, BSON::Document ] The command document.
799
+ #
800
+ # @since 2.6.0
801
+ # @api private
802
+ def add_txn_num!(command)
803
+ command.tap do |c|
804
+ c[:txnNumber] = BSON::Int64.new(@server_session.txn_num) if in_transaction?
805
+ end
806
+ end
807
+
808
+ # Add the transactions options if applicable.
809
+ #
810
+ # @example
811
+ # session.add_txn_opts!(cmd)
812
+ #
813
+ # @return [ Hash, BSON::Document ] The command document.
814
+ #
815
+ # @since 2.6.0
816
+ # @api private
817
+ def add_txn_opts!(command, read)
818
+ command.tap do |c|
819
+ # The read concern should be added to any command that starts a transaction.
820
+ if starting_transaction?
821
+ # https://jira.mongodb.org/browse/SPEC-1161: transaction's
822
+ # read concern overrides collection/database/client read concerns,
823
+ # even if transaction's read concern is not set.
824
+ # Read concern here is the one sent to the server and may
825
+ # include afterClusterTime.
826
+ if rc = c[:readConcern]
827
+ rc = rc.dup
828
+ rc.delete(:level)
829
+ end
830
+ if txn_read_concern
831
+ if rc
832
+ rc.update(txn_read_concern)
833
+ else
834
+ rc = txn_read_concern.dup
835
+ end
836
+ end
837
+ if rc.nil? || rc.empty?
838
+ c.delete(:readConcern)
839
+ else
840
+ c[:readConcern ] = Options::Mapper.transform_values_to_strings(rc)
841
+ end
842
+ end
843
+
844
+ # We need to send the read concern level as a string rather than a symbol.
845
+ if c[:readConcern]
846
+ c[:readConcern] = Options::Mapper.transform_values_to_strings(c[:readConcern])
847
+ end
848
+
849
+ if c[:commitTransaction]
850
+ if max_time_ms = txn_options[:max_commit_time_ms]
851
+ c[:maxTimeMS] = max_time_ms
852
+ end
853
+ end
854
+
855
+ # The write concern should be added to any abortTransaction or commitTransaction command.
856
+ if (c[:abortTransaction] || c[:commitTransaction])
857
+ if @already_committed
858
+ wc = BSON::Document.new(c[:writeConcern] || txn_write_concern || {})
859
+ wc.merge!(w: :majority)
860
+ wc[:wtimeout] ||= 10000
861
+ c[:writeConcern] = wc
862
+ elsif txn_write_concern
863
+ c[:writeConcern] ||= txn_write_concern
864
+ end
865
+ end
866
+
867
+ # A non-numeric write concern w value needs to be sent as a string rather than a symbol.
868
+ if c[:writeConcern] && c[:writeConcern][:w] && c[:writeConcern][:w].is_a?(Symbol)
869
+ c[:writeConcern][:w] = c[:writeConcern][:w].to_s
870
+ end
871
+ end
872
+ end
873
+
874
+ # Remove the read concern and/or write concern from the command if not applicable.
875
+ #
876
+ # @example
877
+ # session.suppress_read_write_concern!(cmd)
878
+ #
879
+ # @return [ Hash, BSON::Document ] The command document.
880
+ #
881
+ # @since 2.6.0
882
+ # @api private
883
+ def suppress_read_write_concern!(command)
884
+ command.tap do |c|
885
+ next unless in_transaction?
886
+
887
+ c.delete(:readConcern) unless starting_transaction?
888
+ c.delete(:writeConcern) unless c[:commitTransaction] || c[:abortTransaction]
889
+ end
890
+ end
891
+
892
+ # Ensure that the read preference of a command primary.
893
+ #
894
+ # @example
895
+ # session.validate_read_preference!(command)
896
+ #
897
+ # @raise [ Mongo::Error::InvalidTransactionOperation ] If the read preference of the command is
898
+ # not primary.
899
+ #
900
+ # @since 2.6.0
901
+ # @api private
902
+ def validate_read_preference!(command)
903
+ return unless in_transaction?
904
+ return unless command['$readPreference']
905
+
906
+ mode = command['$readPreference']['mode'] || command['$readPreference'][:mode]
907
+
908
+ if mode && mode != 'primary'
909
+ raise Mongo::Error::InvalidTransactionOperation.new(
910
+ "read preference in a transaction must be primary (requested: #{mode})"
911
+ )
912
+ end
913
+ end
914
+
915
+ # Update the state of the session due to a (non-commit and non-abort) operation being run.
916
+ #
917
+ # @since 2.6.0
918
+ # @api private
919
+ def update_state!
920
+ case @state
921
+ when STARTING_TRANSACTION_STATE
922
+ @state = TRANSACTION_IN_PROGRESS_STATE
923
+ when TRANSACTION_COMMITTED_STATE, TRANSACTION_ABORTED_STATE
924
+ @state = NO_TRANSACTION_STATE
925
+ end
926
+ end
927
+
928
+ # Validate the session for use by the specified client.
929
+ #
930
+ # The session must not be ended and must have been created by a client
931
+ # with the same cluster as the client that the session is to be used with.
932
+ #
933
+ # @param [ Client ] client The client the session is to be used with.
934
+ #
935
+ # @return [ Session ] self, if the session is valid.
936
+ #
937
+ # @raise [ Mongo::Error::InvalidSession ] Exception raised if the session is not valid.
938
+ #
939
+ # @since 2.5.0
940
+ # @api private
941
+ def validate!(client)
942
+ check_matching_cluster!(client)
943
+ check_if_ended!
944
+ self
945
+ end
946
+
947
+ # Process a response from the server that used this session.
948
+ #
949
+ # @example Process a response from the server.
950
+ # session.process(result)
951
+ #
952
+ # @param [ Operation::Result ] result The result from the operation.
953
+ #
954
+ # @return [ Operation::Result ] The result.
955
+ #
956
+ # @since 2.5.0
957
+ # @api private
958
+ def process(result)
959
+ unless implicit?
960
+ set_operation_time(result)
961
+ if cluster_time_doc = result.cluster_time
962
+ advance_cluster_time(cluster_time_doc)
963
+ end
964
+ end
965
+ @server_session.set_last_use!
966
+
967
+ if doc = result.reply && result.reply.documents.first
968
+ if doc[:recoveryToken]
969
+ self.recovery_token = doc[:recoveryToken]
970
+ end
971
+ end
972
+
973
+ result
974
+ end
975
+
976
+ # Advance the cached operation time for this session.
977
+ #
978
+ # @example Advance the operation time.
979
+ # session.advance_operation_time(timestamp)
980
+ #
981
+ # @param [ BSON::Timestamp ] new_operation_time The new operation time.
982
+ #
983
+ # @return [ BSON::Timestamp ] The max operation time, considering the current and new times.
984
+ #
985
+ # @since 2.5.0
986
+ def advance_operation_time(new_operation_time)
987
+ if @operation_time
988
+ @operation_time = [ @operation_time, new_operation_time ].max
989
+ else
990
+ @operation_time = new_operation_time
991
+ end
992
+ end
993
+
994
+ # Increment and return the next transaction number.
995
+ #
996
+ # @example Get the next transaction number.
997
+ # session.next_txn_num
998
+ #
999
+ # @return [ Integer ] The next transaction number.
1000
+ #
1001
+ # @since 2.5.0
1002
+ # @api private
1003
+ def next_txn_num
1004
+ if ended?
1005
+ raise Error::SessionEnded
1006
+ end
1007
+
1008
+ @server_session.next_txn_num
1009
+ end
1010
+
1011
+ # Get the current transaction number.
1012
+ #
1013
+ # @example Get the current transaction number.
1014
+ # session.txn_num
1015
+ #
1016
+ # @return [ Integer ] The current transaction number.
1017
+ #
1018
+ # @since 2.6.0
1019
+ def txn_num
1020
+ if ended?
1021
+ raise Error::SessionEnded
1022
+ end
1023
+
1024
+ @server_session.txn_num
1025
+ end
1026
+
1027
+ private
1028
+
1029
+ # Get the read concern the session will use when starting a transaction.
1030
+ #
1031
+ # This is a driver style hash with underscore keys.
1032
+ #
1033
+ # @example Get the session's transaction read concern.
1034
+ # session.txn_read_concern
1035
+ #
1036
+ # @return [ Hash ] The read concern used for starting transactions.
1037
+ #
1038
+ # @since 2.9.0
1039
+ def txn_read_concern
1040
+ # Read concern is inherited from client but not db or collection.
1041
+ txn_options[:read_concern] || @client.read_concern
1042
+ end
1043
+
1044
+ def within_states?(*states)
1045
+ states.include?(@state)
1046
+ end
1047
+
1048
+ def check_if_no_transaction!
1049
+ return unless within_states?(NO_TRANSACTION_STATE)
1050
+
1051
+ raise Mongo::Error::InvalidTransactionOperation.new(
1052
+ Mongo::Error::InvalidTransactionOperation::NO_TRANSACTION_STARTED)
1053
+ end
1054
+
1055
+ def txn_write_concern
1056
+ txn_options[:write_concern] ||
1057
+ (@client.write_concern && @client.write_concern.options)
1058
+ end
1059
+
1060
+ # Returns causal consistency document if the last operation time is
1061
+ # known and causal consistency is enabled, otherwise returns nil.
1062
+ def causal_consistency_doc
1063
+ if operation_time && causal_consistency?
1064
+ {:afterClusterTime => operation_time}
1065
+ else
1066
+ nil
1067
+ end
1068
+ end
1069
+
1070
+ def causal_consistency?
1071
+ @causal_consistency ||= (if @options.key?(:causal_consistency)
1072
+ !!@options[:causal_consistency]
1073
+ else
1074
+ true
1075
+ end)
1076
+ end
1077
+
1078
+ def set_operation_time(result)
1079
+ if result && result.operation_time
1080
+ @operation_time = result.operation_time
1081
+ end
1082
+ end
1083
+
1084
+ def check_if_ended!
1085
+ raise Mongo::Error::InvalidSession.new(SESSION_ENDED_ERROR_MSG) if ended?
1086
+ end
1087
+
1088
+ def check_matching_cluster!(client)
1089
+ if @client.cluster != client.cluster
1090
+ raise Mongo::Error::InvalidSession.new(MISMATCHED_CLUSTER_ERROR_MSG)
1091
+ end
1092
+ end
1093
+ end
1094
+ end