mongo 1.8.6 → 2.15.1

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 (1640) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +22 -0
  4. data/LICENSE +1 -1
  5. data/README.md +68 -304
  6. data/Rakefile +280 -11
  7. data/bin/mongo_console +18 -13
  8. data/lib/mongo/active_support.rb +20 -0
  9. data/lib/mongo/address/ipv4.rb +128 -0
  10. data/lib/mongo/address/ipv6.rb +142 -0
  11. data/lib/mongo/address/unix.rb +82 -0
  12. data/lib/mongo/address/validator.rb +102 -0
  13. data/lib/mongo/address.rb +296 -0
  14. data/lib/mongo/auth/aws/conversation.rb +128 -0
  15. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  16. data/lib/mongo/auth/aws/request.rb +286 -0
  17. data/lib/mongo/auth/aws.rb +40 -0
  18. data/lib/mongo/auth/base.rb +138 -0
  19. data/lib/mongo/auth/conversation_base.rb +87 -0
  20. data/lib/mongo/auth/cr/conversation.rb +77 -0
  21. data/lib/mongo/auth/cr.rb +45 -0
  22. data/lib/mongo/auth/credential_cache.rb +54 -0
  23. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  24. data/lib/mongo/auth/gssapi.rb +41 -0
  25. data/lib/mongo/auth/ldap/conversation.rb +57 -0
  26. data/lib/mongo/auth/ldap.rb +42 -0
  27. data/lib/mongo/auth/roles.rb +107 -0
  28. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  29. data/lib/mongo/auth/scram/conversation.rb +65 -0
  30. data/lib/mongo/auth/scram.rb +75 -0
  31. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  32. data/lib/mongo/auth/scram256.rb +34 -0
  33. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  34. data/lib/mongo/auth/stringprep/profiles/sasl.rb +77 -0
  35. data/lib/mongo/auth/stringprep/tables.rb +3236 -0
  36. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +175 -0
  37. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1171 -0
  38. data/lib/mongo/auth/stringprep.rb +118 -0
  39. data/lib/mongo/auth/user/view.rb +165 -0
  40. data/lib/mongo/auth/user.rb +225 -0
  41. data/lib/mongo/auth/x509/conversation.rb +70 -0
  42. data/lib/mongo/auth/x509.rb +60 -0
  43. data/lib/mongo/auth.rb +186 -0
  44. data/lib/mongo/background_thread.rb +173 -0
  45. data/lib/mongo/bson.rb +35 -0
  46. data/lib/mongo/bulk_write/combineable.rb +75 -0
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +58 -0
  48. data/lib/mongo/bulk_write/result.rb +194 -0
  49. data/lib/mongo/bulk_write/result_combiner.rb +133 -0
  50. data/lib/mongo/bulk_write/transformable.rb +156 -0
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +55 -0
  52. data/lib/mongo/bulk_write/validatable.rb +76 -0
  53. data/lib/mongo/bulk_write.rb +289 -0
  54. data/lib/mongo/caching_cursor.rb +77 -0
  55. data/lib/mongo/client.rb +1426 -0
  56. data/lib/mongo/client_encryption.rb +106 -0
  57. data/lib/mongo/cluster/periodic_executor.rb +104 -0
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +159 -0
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +65 -0
  60. data/lib/mongo/cluster/sdam_flow.rb +620 -0
  61. data/lib/mongo/cluster/topology/base.rb +221 -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 +138 -0
  66. data/lib/mongo/cluster/topology/single.rb +147 -0
  67. data/lib/mongo/cluster/topology/unknown.rb +139 -0
  68. data/lib/mongo/cluster/topology.rb +112 -0
  69. data/lib/mongo/cluster.rb +988 -0
  70. data/lib/mongo/cluster_time.rb +142 -0
  71. data/lib/mongo/collection/view/aggregation.rb +166 -0
  72. data/lib/mongo/collection/view/builder/aggregation.rb +142 -0
  73. data/lib/mongo/collection/view/builder/find_command.rb +173 -0
  74. data/lib/mongo/collection/view/builder/flags.rb +65 -0
  75. data/lib/mongo/collection/view/builder/map_reduce.rb +173 -0
  76. data/lib/mongo/collection/view/builder/modifiers.rb +83 -0
  77. data/lib/mongo/collection/view/builder/op_query.rb +94 -0
  78. data/lib/mongo/collection/view/builder.rb +23 -0
  79. data/lib/mongo/collection/view/change_stream/retryable.rb +43 -0
  80. data/lib/mongo/collection/view/change_stream.rb +372 -0
  81. data/lib/mongo/collection/view/explainable.rb +86 -0
  82. data/lib/mongo/collection/view/immutable.rb +39 -0
  83. data/lib/mongo/collection/view/iterable.rb +182 -0
  84. data/lib/mongo/collection/view/map_reduce.rb +279 -0
  85. data/lib/mongo/collection/view/readable.rb +686 -0
  86. data/lib/mongo/collection/view/writable.rb +474 -0
  87. data/lib/mongo/collection/view.rb +223 -0
  88. data/lib/mongo/collection.rb +807 -1016
  89. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  90. data/lib/mongo/crypt/auto_encrypter.rb +182 -0
  91. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  92. data/lib/mongo/crypt/binary.rb +158 -0
  93. data/lib/mongo/crypt/binding.rb +1232 -0
  94. data/lib/mongo/crypt/context.rb +138 -0
  95. data/lib/mongo/crypt/data_key_context.rb +165 -0
  96. data/lib/mongo/crypt/encryption_io.rb +309 -0
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  98. data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
  100. data/lib/mongo/crypt/handle.rb +318 -0
  101. data/lib/mongo/crypt/hooks.rb +93 -0
  102. data/lib/mongo/crypt/kms_context.rb +70 -0
  103. data/lib/mongo/crypt/status.rb +134 -0
  104. data/lib/mongo/crypt.rb +36 -0
  105. data/lib/mongo/cursor/builder/get_more_command.rb +80 -0
  106. data/lib/mongo/cursor/builder/kill_cursors_command.rb +111 -0
  107. data/lib/mongo/cursor/builder/op_get_more.rb +64 -0
  108. data/lib/mongo/cursor/builder/op_kill_cursors.rb +106 -0
  109. data/lib/mongo/cursor/builder.rb +21 -0
  110. data/lib/mongo/cursor.rb +336 -505
  111. data/lib/mongo/database/view.rb +199 -0
  112. data/lib/mongo/database.rb +457 -0
  113. data/lib/mongo/dbref.rb +124 -0
  114. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  115. data/lib/mongo/error/auth_error.rb +32 -0
  116. data/lib/mongo/error/bulk_write_error.rb +76 -0
  117. data/lib/mongo/error/change_stream_resumable.rb +40 -0
  118. data/lib/mongo/error/closed_stream.rb +37 -0
  119. data/lib/mongo/error/connection_check_out_timeout.rb +51 -0
  120. data/lib/mongo/error/connection_perished.rb +26 -0
  121. data/lib/mongo/error/credential_check_error.rb +29 -0
  122. data/lib/mongo/error/crypt_error.rb +34 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +37 -0
  124. data/lib/mongo/error/failed_string_prep_validation.rb +41 -0
  125. data/lib/mongo/error/file_not_found.rb +40 -0
  126. data/lib/mongo/error/handshake_error.rb +27 -0
  127. data/lib/mongo/error/insufficient_iteration_count.rb +41 -0
  128. data/lib/mongo/error/internal_driver_error.rb +25 -0
  129. data/lib/mongo/error/invalid_address.rb +27 -0
  130. data/lib/mongo/error/invalid_application_name.rb +41 -0
  131. data/lib/mongo/error/invalid_bulk_operation.rb +40 -0
  132. data/lib/mongo/error/invalid_bulk_operation_type.rb +39 -0
  133. data/lib/mongo/error/invalid_collection_name.rb +42 -0
  134. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  135. data/lib/mongo/error/invalid_database_name.rb +42 -0
  136. data/lib/mongo/error/invalid_document.rb +42 -0
  137. data/lib/mongo/error/invalid_file.rb +41 -0
  138. data/lib/mongo/error/invalid_file_revision.rb +40 -0
  139. data/lib/mongo/error/invalid_min_pool_size.rb +38 -0
  140. data/lib/mongo/error/invalid_nonce.rb +49 -0
  141. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  142. data/lib/mongo/error/invalid_read_option.rb +38 -0
  143. data/lib/mongo/error/invalid_replacement_document.rb +42 -0
  144. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  145. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  146. data/lib/mongo/error/invalid_server_preference.rb +68 -0
  147. data/lib/mongo/error/invalid_session.rb +40 -0
  148. data/lib/mongo/error/invalid_signature.rb +50 -0
  149. data/lib/mongo/error/invalid_transaction_operation.rb +85 -0
  150. data/lib/mongo/error/invalid_txt_record.rb +30 -0
  151. data/lib/mongo/error/invalid_update_document.rb +42 -0
  152. data/lib/mongo/error/invalid_uri.rb +42 -0
  153. data/lib/mongo/error/invalid_write_concern.rb +38 -0
  154. data/lib/mongo/error/kms_error.rb +25 -0
  155. data/lib/mongo/error/lint_error.rb +38 -0
  156. data/lib/mongo/error/max_bson_size.rb +54 -0
  157. data/lib/mongo/error/max_message_size.rb +45 -0
  158. data/lib/mongo/error/mismatched_domain.rb +30 -0
  159. data/lib/mongo/error/missing_file_chunk.rb +41 -0
  160. data/lib/mongo/error/missing_password.rb +32 -0
  161. data/lib/mongo/error/missing_resume_token.rb +42 -0
  162. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  163. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  164. data/lib/mongo/error/multi_index_drop.rb +37 -0
  165. data/lib/mongo/error/need_primary_server.rb +26 -0
  166. data/lib/mongo/error/no_server_available.rb +51 -0
  167. data/lib/mongo/error/no_srv_records.rb +29 -0
  168. data/lib/mongo/error/notable.rb +83 -0
  169. data/lib/mongo/error/operation_failure.rb +311 -0
  170. data/lib/mongo/error/parser.rb +294 -0
  171. data/lib/mongo/error/pool_closed_error.rb +53 -0
  172. data/lib/mongo/error/raise_original_error.rb +32 -0
  173. data/lib/mongo/error/sdam_error_detection.rb +83 -0
  174. data/lib/mongo/error/server_api_conflict.rb +26 -0
  175. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  176. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  177. data/lib/mongo/error/session_ended.rb +30 -0
  178. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  179. data/lib/mongo/error/socket_error.rb +29 -0
  180. data/lib/mongo/error/socket_timeout_error.rb +29 -0
  181. data/lib/mongo/error/unchangeable_collection_option.rb +41 -0
  182. data/lib/mongo/error/unexpected_chunk_length.rb +42 -0
  183. data/lib/mongo/error/unexpected_response.rb +41 -0
  184. data/lib/mongo/error/unknown_payload_type.rb +44 -0
  185. data/lib/mongo/error/unmet_dependency.rb +24 -0
  186. data/lib/mongo/error/unsupported_array_filters.rb +59 -0
  187. data/lib/mongo/error/unsupported_collation.rb +59 -0
  188. data/lib/mongo/error/unsupported_features.rb +28 -0
  189. data/lib/mongo/error/unsupported_message_type.rb +26 -0
  190. data/lib/mongo/error/unsupported_option.rb +104 -0
  191. data/lib/mongo/error/write_retryable.rb +30 -0
  192. data/lib/mongo/error.rb +246 -0
  193. data/lib/mongo/event/base.rb +45 -0
  194. data/lib/mongo/event/listeners.rb +66 -0
  195. data/lib/mongo/event/publisher.rb +45 -0
  196. data/lib/mongo/event/subscriber.rb +44 -0
  197. data/lib/mongo/event.rb +50 -0
  198. data/lib/mongo/grid/file/chunk.rb +191 -0
  199. data/lib/mongo/grid/file/info.rb +268 -0
  200. data/lib/mongo/grid/file.rb +124 -0
  201. data/lib/mongo/grid/fs_bucket.rb +517 -0
  202. data/lib/mongo/grid/stream/read.rb +244 -0
  203. data/lib/mongo/grid/stream/write.rb +213 -0
  204. data/lib/mongo/grid/stream.rb +67 -0
  205. data/lib/mongo/grid.rb +20 -0
  206. data/lib/mongo/id.rb +67 -0
  207. data/lib/mongo/index/view.rb +358 -0
  208. data/lib/mongo/index.rb +73 -0
  209. data/lib/mongo/lint.rb +105 -0
  210. data/lib/mongo/loggable.rb +112 -0
  211. data/lib/mongo/logger.rb +87 -0
  212. data/lib/mongo/monitoring/cmap_log_subscriber.rb +56 -0
  213. data/lib/mongo/monitoring/command_log_subscriber.rb +132 -0
  214. data/lib/mongo/monitoring/event/cmap/base.rb +31 -0
  215. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +88 -0
  216. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +59 -0
  217. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +74 -0
  218. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +75 -0
  219. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +106 -0
  220. data/lib/mongo/monitoring/event/cmap/connection_created.rb +67 -0
  221. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +67 -0
  222. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +60 -0
  223. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +68 -0
  224. data/lib/mongo/monitoring/event/cmap/pool_created.rb +75 -0
  225. data/lib/mongo/monitoring/event/cmap.rb +28 -0
  226. data/lib/mongo/monitoring/event/command_failed.rb +147 -0
  227. data/lib/mongo/monitoring/event/command_started.rb +183 -0
  228. data/lib/mongo/monitoring/event/command_succeeded.rb +157 -0
  229. data/lib/mongo/monitoring/event/secure.rb +112 -0
  230. data/lib/mongo/monitoring/event/server_closed.rb +62 -0
  231. data/lib/mongo/monitoring/event/server_description_changed.rb +99 -0
  232. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +92 -0
  233. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +65 -0
  234. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +84 -0
  235. data/lib/mongo/monitoring/event/server_opening.rb +62 -0
  236. data/lib/mongo/monitoring/event/topology_changed.rb +63 -0
  237. data/lib/mongo/monitoring/event/topology_closed.rb +57 -0
  238. data/lib/mongo/monitoring/event/topology_opening.rb +57 -0
  239. data/lib/mongo/monitoring/event.rb +32 -0
  240. data/lib/mongo/monitoring/publishable.rb +122 -0
  241. data/lib/mongo/monitoring/sdam_log_subscriber.rb +57 -0
  242. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +33 -0
  243. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +44 -0
  244. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +33 -0
  245. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +43 -0
  246. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
  247. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +33 -0
  248. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  249. data/lib/mongo/monitoring.rb +379 -0
  250. data/lib/mongo/operation/aggregate/command.rb +47 -0
  251. data/lib/mongo/operation/aggregate/op_msg.rb +34 -0
  252. data/lib/mongo/operation/aggregate/result.rb +104 -0
  253. data/lib/mongo/operation/aggregate.rb +39 -0
  254. data/lib/mongo/operation/collections_info/command.rb +48 -0
  255. data/lib/mongo/operation/collections_info/result.rb +59 -0
  256. data/lib/mongo/operation/collections_info.rb +51 -0
  257. data/lib/mongo/operation/command/command.rb +41 -0
  258. data/lib/mongo/operation/command/op_msg.rb +31 -0
  259. data/lib/mongo/operation/command.rb +34 -0
  260. data/lib/mongo/operation/context.rb +102 -0
  261. data/lib/mongo/operation/count/command.rb +41 -0
  262. data/lib/mongo/operation/count/op_msg.rb +32 -0
  263. data/lib/mongo/operation/count.rb +34 -0
  264. data/lib/mongo/operation/create/command.rb +41 -0
  265. data/lib/mongo/operation/create/op_msg.rb +32 -0
  266. data/lib/mongo/operation/create.rb +34 -0
  267. data/lib/mongo/operation/create_index/command.rb +45 -0
  268. data/lib/mongo/operation/create_index/op_msg.rb +41 -0
  269. data/lib/mongo/operation/create_index.rb +34 -0
  270. data/lib/mongo/operation/create_user/command.rb +46 -0
  271. data/lib/mongo/operation/create_user/op_msg.rb +38 -0
  272. data/lib/mongo/operation/create_user.rb +34 -0
  273. data/lib/mongo/operation/delete/bulk_result.rb +51 -0
  274. data/lib/mongo/operation/delete/command.rb +49 -0
  275. data/lib/mongo/operation/delete/legacy.rb +57 -0
  276. data/lib/mongo/operation/delete/op_msg.rb +48 -0
  277. data/lib/mongo/operation/delete/result.rb +48 -0
  278. data/lib/mongo/operation/delete.rb +41 -0
  279. data/lib/mongo/operation/distinct/command.rb +41 -0
  280. data/lib/mongo/operation/distinct/op_msg.rb +33 -0
  281. data/lib/mongo/operation/distinct.rb +34 -0
  282. data/lib/mongo/operation/drop/command.rb +41 -0
  283. data/lib/mongo/operation/drop/op_msg.rb +32 -0
  284. data/lib/mongo/operation/drop.rb +34 -0
  285. data/lib/mongo/operation/drop_database/command.rb +41 -0
  286. data/lib/mongo/operation/drop_database/op_msg.rb +32 -0
  287. data/lib/mongo/operation/drop_database.rb +34 -0
  288. data/lib/mongo/operation/drop_index/command.rb +45 -0
  289. data/lib/mongo/operation/drop_index/op_msg.rb +38 -0
  290. data/lib/mongo/operation/drop_index.rb +34 -0
  291. data/lib/mongo/operation/explain/command.rb +46 -0
  292. data/lib/mongo/operation/explain/legacy.rb +45 -0
  293. data/lib/mongo/operation/explain/op_msg.rb +40 -0
  294. data/lib/mongo/operation/explain/result.rb +56 -0
  295. data/lib/mongo/operation/explain.rb +36 -0
  296. data/lib/mongo/operation/find/command.rb +42 -0
  297. data/lib/mongo/operation/find/legacy/result.rb +46 -0
  298. data/lib/mongo/operation/find/legacy.rb +43 -0
  299. data/lib/mongo/operation/find/op_msg.rb +34 -0
  300. data/lib/mongo/operation/find/result.rb +76 -0
  301. data/lib/mongo/operation/find.rb +36 -0
  302. data/lib/mongo/operation/get_more/command.rb +42 -0
  303. data/lib/mongo/operation/get_more/legacy.rb +39 -0
  304. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  305. data/lib/mongo/operation/get_more/result.rb +75 -0
  306. data/lib/mongo/operation/get_more.rb +36 -0
  307. data/lib/mongo/operation/indexes/command.rb +42 -0
  308. data/lib/mongo/operation/indexes/legacy.rb +48 -0
  309. data/lib/mongo/operation/indexes/op_msg.rb +34 -0
  310. data/lib/mongo/operation/indexes/result.rb +105 -0
  311. data/lib/mongo/operation/indexes.rb +50 -0
  312. data/lib/mongo/operation/insert/bulk_result.rb +112 -0
  313. data/lib/mongo/operation/insert/command.rb +59 -0
  314. data/lib/mongo/operation/insert/legacy.rb +68 -0
  315. data/lib/mongo/operation/insert/op_msg.rb +54 -0
  316. data/lib/mongo/operation/insert/result.rb +75 -0
  317. data/lib/mongo/operation/insert.rb +44 -0
  318. data/lib/mongo/operation/kill_cursors/command.rb +40 -0
  319. data/lib/mongo/operation/kill_cursors/legacy.rb +40 -0
  320. data/lib/mongo/operation/kill_cursors/op_msg.rb +32 -0
  321. data/lib/mongo/operation/kill_cursors.rb +35 -0
  322. data/lib/mongo/operation/list_collections/command.rb +46 -0
  323. data/lib/mongo/operation/list_collections/op_msg.rb +39 -0
  324. data/lib/mongo/operation/list_collections/result.rb +113 -0
  325. data/lib/mongo/operation/list_collections.rb +35 -0
  326. data/lib/mongo/operation/map_reduce/command.rb +43 -0
  327. data/lib/mongo/operation/map_reduce/op_msg.rb +34 -0
  328. data/lib/mongo/operation/map_reduce/result.rb +142 -0
  329. data/lib/mongo/operation/map_reduce.rb +35 -0
  330. data/lib/mongo/operation/op_msg_base.rb +33 -0
  331. data/lib/mongo/operation/parallel_scan/command.rb +57 -0
  332. data/lib/mongo/operation/parallel_scan/op_msg.rb +46 -0
  333. data/lib/mongo/operation/parallel_scan/result.rb +68 -0
  334. data/lib/mongo/operation/parallel_scan.rb +35 -0
  335. data/lib/mongo/operation/remove_user/command.rb +46 -0
  336. data/lib/mongo/operation/remove_user/op_msg.rb +38 -0
  337. data/lib/mongo/operation/remove_user.rb +34 -0
  338. data/lib/mongo/operation/result.rb +461 -0
  339. data/lib/mongo/operation/shared/bypass_document_validation.rb +46 -0
  340. data/lib/mongo/operation/shared/causal_consistency_supported.rb +45 -0
  341. data/lib/mongo/operation/shared/executable.rb +116 -0
  342. data/lib/mongo/operation/shared/executable_no_validate.rb +32 -0
  343. data/lib/mongo/operation/shared/executable_transaction_label.rb +30 -0
  344. data/lib/mongo/operation/shared/idable.rb +68 -0
  345. data/lib/mongo/operation/shared/limited.rb +42 -0
  346. data/lib/mongo/operation/shared/object_id_generator.rb +40 -0
  347. data/lib/mongo/operation/shared/op_msg_or_command.rb +41 -0
  348. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +44 -0
  349. data/lib/mongo/operation/shared/polymorphic_lookup.rb +36 -0
  350. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  351. data/lib/mongo/operation/shared/polymorphic_result.rb +50 -0
  352. data/lib/mongo/operation/shared/read_preference_supported.rb +114 -0
  353. data/lib/mongo/operation/shared/response_handling.rb +172 -0
  354. data/lib/mongo/operation/shared/result/aggregatable.rb +74 -0
  355. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
  356. data/lib/mongo/operation/shared/sessions_supported.rb +254 -0
  357. data/lib/mongo/operation/shared/specifiable.rb +585 -0
  358. data/lib/mongo/operation/shared/write.rb +90 -0
  359. data/lib/mongo/operation/shared/write_concern_supported.rb +43 -0
  360. data/lib/mongo/operation/update/bulk_result.rb +129 -0
  361. data/lib/mongo/operation/update/command.rb +50 -0
  362. data/lib/mongo/operation/update/legacy/result.rb +112 -0
  363. data/lib/mongo/operation/update/legacy.rb +68 -0
  364. data/lib/mongo/operation/update/op_msg.rb +48 -0
  365. data/lib/mongo/operation/update/result.rb +113 -0
  366. data/lib/mongo/operation/update.rb +41 -0
  367. data/lib/mongo/operation/update_user/command.rb +45 -0
  368. data/lib/mongo/operation/update_user/op_msg.rb +38 -0
  369. data/lib/mongo/operation/update_user.rb +34 -0
  370. data/lib/mongo/operation/users_info/command.rb +46 -0
  371. data/lib/mongo/operation/users_info/op_msg.rb +39 -0
  372. data/lib/mongo/operation/users_info/result.rb +48 -0
  373. data/lib/mongo/operation/users_info.rb +35 -0
  374. data/lib/mongo/operation.rb +106 -0
  375. data/lib/mongo/options/mapper.rb +129 -0
  376. data/lib/mongo/options/redacted.rb +159 -0
  377. data/lib/mongo/options.rb +19 -0
  378. data/lib/mongo/protocol/bit_vector.rb +67 -0
  379. data/lib/mongo/protocol/compressed.rb +184 -0
  380. data/lib/mongo/protocol/delete.rb +172 -0
  381. data/lib/mongo/protocol/get_more.rb +165 -0
  382. data/lib/mongo/protocol/insert.rb +181 -0
  383. data/lib/mongo/protocol/kill_cursors.rb +133 -0
  384. data/lib/mongo/protocol/message.rb +465 -0
  385. data/lib/mongo/protocol/msg.rb +404 -0
  386. data/lib/mongo/protocol/query.rb +356 -0
  387. data/lib/mongo/protocol/registry.rb +79 -0
  388. data/lib/mongo/protocol/reply.rb +207 -0
  389. data/lib/mongo/protocol/serializers.rb +460 -0
  390. data/lib/mongo/protocol/update.rb +214 -0
  391. data/lib/mongo/protocol.rb +21 -0
  392. data/lib/mongo/query_cache.rb +275 -0
  393. data/lib/mongo/retryable.rb +496 -0
  394. data/lib/mongo/semaphore.rb +49 -0
  395. data/lib/mongo/server/app_metadata.rb +267 -0
  396. data/lib/mongo/server/connection.rb +326 -0
  397. data/lib/mongo/server/connection_base.rb +265 -0
  398. data/lib/mongo/server/connection_common.rb +168 -0
  399. data/lib/mongo/server/connection_pool/populator.rb +61 -0
  400. data/lib/mongo/server/connection_pool.rb +802 -0
  401. data/lib/mongo/server/context.rb +72 -0
  402. data/lib/mongo/server/description/features.rb +151 -0
  403. data/lib/mongo/server/description.rb +832 -0
  404. data/lib/mongo/server/monitor/app_metadata.rb +37 -0
  405. data/lib/mongo/server/monitor/connection.rb +269 -0
  406. data/lib/mongo/server/monitor.rb +339 -0
  407. data/lib/mongo/server/pending_connection.rb +272 -0
  408. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  409. data/lib/mongo/server/push_monitor.rb +194 -0
  410. data/lib/mongo/server/round_trip_time_averager.rb +76 -0
  411. data/lib/mongo/server.rb +584 -0
  412. data/lib/mongo/server_selector/base.rb +625 -0
  413. data/lib/mongo/server_selector/nearest.rb +110 -0
  414. data/lib/mongo/server_selector/primary.rb +110 -0
  415. data/lib/mongo/server_selector/primary_preferred.rb +115 -0
  416. data/lib/mongo/server_selector/secondary.rb +109 -0
  417. data/lib/mongo/server_selector/secondary_preferred.rb +113 -0
  418. data/lib/mongo/server_selector.rb +91 -0
  419. data/lib/mongo/session/server_session.rb +122 -0
  420. data/lib/mongo/session/session_pool.rb +155 -0
  421. data/lib/mongo/session.rb +1074 -0
  422. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  423. data/lib/mongo/socket/ocsp_verifier.rb +376 -0
  424. data/lib/mongo/socket/ssl.rb +395 -0
  425. data/lib/mongo/socket/tcp.rb +97 -0
  426. data/lib/mongo/socket/unix.rb +63 -0
  427. data/lib/mongo/socket.rb +463 -0
  428. data/lib/mongo/srv/monitor.rb +113 -0
  429. data/lib/mongo/srv/resolver.rb +137 -0
  430. data/lib/mongo/srv/result.rb +128 -0
  431. data/lib/mongo/srv.rb +20 -0
  432. data/lib/mongo/timeout.rb +54 -0
  433. data/lib/mongo/topology_version.rb +92 -0
  434. data/lib/mongo/uri/options_mapper.rb +623 -0
  435. data/lib/mongo/uri/srv_protocol.rb +241 -0
  436. data/lib/mongo/uri.rb +528 -0
  437. data/lib/mongo/utils.rb +118 -0
  438. data/lib/mongo/version.rb +24 -0
  439. data/lib/mongo/write_concern/acknowledged.rb +65 -0
  440. data/lib/mongo/write_concern/base.rb +70 -0
  441. data/lib/mongo/write_concern/unacknowledged.rb +68 -0
  442. data/lib/mongo/write_concern.rb +99 -0
  443. data/lib/mongo.rb +98 -71
  444. data/mongo.gemspec +29 -18
  445. data/spec/NOTES.aws-auth.md +296 -0
  446. data/spec/README.aws-auth.md +318 -0
  447. data/spec/README.md +715 -0
  448. data/spec/USERS.md +72 -0
  449. data/spec/atlas/atlas_connectivity_spec.rb +27 -0
  450. data/spec/atlas/operations_spec.rb +28 -0
  451. data/spec/integration/auth_spec.rb +279 -0
  452. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  453. data/spec/integration/aws_auth_request_spec.rb +77 -0
  454. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  455. data/spec/integration/bson_symbol_spec.rb +39 -0
  456. data/spec/integration/bulk_insert_spec.rb +83 -0
  457. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  458. data/spec/integration/bulk_write_spec.rb +70 -0
  459. data/spec/integration/change_stream_examples_spec.rb +208 -0
  460. data/spec/integration/change_stream_spec.rb +808 -0
  461. data/spec/integration/check_clean_slate_spec.rb +19 -0
  462. data/spec/integration/client_authentication_options_spec.rb +514 -0
  463. data/spec/integration/client_connectivity_spec.rb +41 -0
  464. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  465. data/spec/integration/client_construction_spec.rb +239 -0
  466. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  467. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  468. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
  469. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  470. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
  471. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
  472. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  473. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  474. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  475. data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
  476. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
  477. data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
  478. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
  479. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  480. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  481. data/spec/integration/client_spec.rb +47 -0
  482. data/spec/integration/client_update_spec.rb +157 -0
  483. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  484. data/spec/integration/command_monitoring_spec.rb +184 -0
  485. data/spec/integration/command_spec.rb +179 -0
  486. data/spec/integration/connect_single_rs_name_spec.rb +75 -0
  487. data/spec/integration/connection_pool_populator_spec.rb +305 -0
  488. data/spec/integration/connection_spec.rb +336 -0
  489. data/spec/integration/crud_spec.rb +193 -0
  490. data/spec/integration/cursor_reaping_spec.rb +139 -0
  491. data/spec/integration/docs_examples_spec.rb +207 -0
  492. data/spec/integration/error_detection_spec.rb +42 -0
  493. data/spec/integration/fork_reconnect_spec.rb +204 -0
  494. data/spec/integration/get_more_spec.rb +42 -0
  495. data/spec/integration/grid_fs_bucket_spec.rb +51 -0
  496. data/spec/integration/heartbeat_events_spec.rb +102 -0
  497. data/spec/integration/mmapv1_spec.rb +31 -0
  498. data/spec/integration/mongos_pinning_spec.rb +37 -0
  499. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  500. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  501. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  502. data/spec/integration/operation_failure_code_spec.rb +29 -0
  503. data/spec/integration/operation_failure_message_spec.rb +90 -0
  504. data/spec/integration/query_cache_spec.rb +1093 -0
  505. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  506. data/spec/integration/read_concern_spec.rb +92 -0
  507. data/spec/integration/read_preference_spec.rb +544 -0
  508. data/spec/integration/reconnect_spec.rb +177 -0
  509. data/spec/integration/retryable_errors_spec.rb +286 -0
  510. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +764 -0
  511. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  512. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  513. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  514. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  515. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  516. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  517. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  518. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  519. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  520. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  521. data/spec/integration/retryable_writes_errors_spec.rb +34 -0
  522. data/spec/integration/sdam_error_handling_spec.rb +424 -0
  523. data/spec/integration/sdam_events_spec.rb +122 -0
  524. data/spec/integration/sdam_prose_spec.rb +67 -0
  525. data/spec/integration/secondary_reads_spec.rb +102 -0
  526. data/spec/integration/server_description_spec.rb +48 -0
  527. data/spec/integration/server_monitor_spec.rb +55 -0
  528. data/spec/integration/server_selection_spec.rb +39 -0
  529. data/spec/integration/server_selector_spec.rb +88 -0
  530. data/spec/integration/server_spec.rb +67 -0
  531. data/spec/integration/shell_examples_spec.rb +984 -0
  532. data/spec/integration/size_limit_spec.rb +115 -0
  533. data/spec/integration/snappy_compression_spec.rb +28 -0
  534. data/spec/integration/srv_monitoring_spec.rb +406 -0
  535. data/spec/integration/srv_spec.rb +59 -0
  536. data/spec/integration/ssl_uri_options_spec.rb +28 -0
  537. data/spec/integration/step_down_spec.rb +207 -0
  538. data/spec/integration/time_zone_querying_spec.rb +55 -0
  539. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  540. data/spec/integration/transactions_examples_spec.rb +235 -0
  541. data/spec/integration/truncated_utf8_spec.rb +26 -0
  542. data/spec/integration/versioned_api_examples_spec.rb +69 -0
  543. data/spec/integration/x509_auth_spec.rb +112 -0
  544. data/spec/integration/zlib_compression_spec.rb +28 -0
  545. data/spec/integration/zstd_compression_spec.rb +29 -0
  546. data/spec/kerberos/kerberos_spec.rb +94 -0
  547. data/spec/lite_spec_helper.rb +168 -0
  548. data/spec/mongo/address/ipv4_spec.rb +102 -0
  549. data/spec/mongo/address/ipv6_spec.rb +130 -0
  550. data/spec/mongo/address/unix_spec.rb +44 -0
  551. data/spec/mongo/address/validator_spec.rb +54 -0
  552. data/spec/mongo/address_spec.rb +344 -0
  553. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  554. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  555. data/spec/mongo/auth/cr_spec.rb +79 -0
  556. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  557. data/spec/mongo/auth/invalid_mechanism_spec.rb +14 -0
  558. data/spec/mongo/auth/ldap/conversation_spec.rb +46 -0
  559. data/spec/mongo/auth/ldap_spec.rb +47 -0
  560. data/spec/mongo/auth/scram/conversation_spec.rb +205 -0
  561. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  562. data/spec/mongo/auth/scram_negotiation_spec.rb +531 -0
  563. data/spec/mongo/auth/scram_spec.rb +122 -0
  564. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +116 -0
  565. data/spec/mongo/auth/stringprep_spec.rb +191 -0
  566. data/spec/mongo/auth/user/view_spec.rb +489 -0
  567. data/spec/mongo/auth/user_spec.rb +343 -0
  568. data/spec/mongo/auth/x509/conversation_spec.rb +72 -0
  569. data/spec/mongo/auth/x509_spec.rb +73 -0
  570. data/spec/mongo/auth_spec.rb +68 -0
  571. data/spec/mongo/bson_spec.rb +14 -0
  572. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +287 -0
  573. data/spec/mongo/bulk_write/result_spec.rb +127 -0
  574. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +242 -0
  575. data/spec/mongo/bulk_write_spec.rb +2393 -0
  576. data/spec/mongo/caching_cursor_spec.rb +73 -0
  577. data/spec/mongo/client_construction_spec.rb +2389 -0
  578. data/spec/mongo/client_encryption_spec.rb +414 -0
  579. data/spec/mongo/client_spec.rb +964 -0
  580. data/spec/mongo/cluster/cursor_reaper_spec.rb +190 -0
  581. data/spec/mongo/cluster/periodic_executor_spec.rb +19 -0
  582. data/spec/mongo/cluster/socket_reaper_spec.rb +46 -0
  583. data/spec/mongo/cluster/topology/replica_set_spec.rb +601 -0
  584. data/spec/mongo/cluster/topology/sharded_spec.rb +158 -0
  585. data/spec/mongo/cluster/topology/single_spec.rb +192 -0
  586. data/spec/mongo/cluster/topology/unknown_spec.rb +103 -0
  587. data/spec/mongo/cluster/topology_spec.rb +211 -0
  588. data/spec/mongo/cluster_spec.rb +790 -0
  589. data/spec/mongo/cluster_time_spec.rb +151 -0
  590. data/spec/mongo/collection/view/aggregation_spec.rb +678 -0
  591. data/spec/mongo/collection/view/builder/find_command_spec.rb +524 -0
  592. data/spec/mongo/collection/view/builder/flags_spec.rb +109 -0
  593. data/spec/mongo/collection/view/builder/modifiers_spec.rb +213 -0
  594. data/spec/mongo/collection/view/builder/op_query_spec.rb +157 -0
  595. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  596. data/spec/mongo/collection/view/change_stream_spec.rb +547 -0
  597. data/spec/mongo/collection/view/explainable_spec.rb +117 -0
  598. data/spec/mongo/collection/view/immutable_spec.rb +57 -0
  599. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  600. data/spec/mongo/collection/view/map_reduce_spec.rb +868 -0
  601. data/spec/mongo/collection/view/readable_spec.rb +1485 -0
  602. data/spec/mongo/collection/view/writable_spec.rb +1864 -0
  603. data/spec/mongo/collection/view_spec.rb +424 -0
  604. data/spec/mongo/collection_crud_spec.rb +4360 -0
  605. data/spec/mongo/collection_ddl_spec.rb +537 -0
  606. data/spec/mongo/collection_spec.rb +804 -0
  607. data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
  608. data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
  609. data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
  610. data/spec/mongo/crypt/binary_spec.rb +113 -0
  611. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  612. data/spec/mongo/crypt/binding/context_spec.rb +255 -0
  613. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  614. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
  615. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  616. data/spec/mongo/crypt/binding/version_spec.rb +20 -0
  617. data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
  618. data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
  619. data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
  620. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
  621. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
  622. data/spec/mongo/crypt/handle_spec.rb +235 -0
  623. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  624. data/spec/mongo/crypt/status_spec.rb +150 -0
  625. data/spec/mongo/cursor/builder/get_more_command_spec.rb +191 -0
  626. data/spec/mongo/cursor/builder/op_get_more_spec.rb +64 -0
  627. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +66 -0
  628. data/spec/mongo/cursor_spec.rb +690 -0
  629. data/spec/mongo/database_spec.rb +1300 -0
  630. data/spec/mongo/dbref_spec.rb +152 -0
  631. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  632. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  633. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  634. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  635. data/spec/mongo/error/no_server_available_spec.rb +35 -0
  636. data/spec/mongo/error/notable_spec.rb +62 -0
  637. data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
  638. data/spec/mongo/error/operation_failure_spec.rb +553 -0
  639. data/spec/mongo/error/parser_spec.rb +519 -0
  640. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  641. data/spec/mongo/event/publisher_spec.rb +53 -0
  642. data/spec/mongo/event/subscriber_spec.rb +37 -0
  643. data/spec/mongo/grid/file/chunk_spec.rb +230 -0
  644. data/spec/mongo/grid/file/info_spec.rb +107 -0
  645. data/spec/mongo/grid/file_spec.rb +194 -0
  646. data/spec/mongo/grid/fs_bucket_spec.rb +1263 -0
  647. data/spec/mongo/grid/stream/read_spec.rb +292 -0
  648. data/spec/mongo/grid/stream/write_spec.rb +565 -0
  649. data/spec/mongo/grid/stream_spec.rb +51 -0
  650. data/spec/mongo/id_spec.rb +38 -0
  651. data/spec/mongo/index/view_spec.rb +1171 -0
  652. data/spec/mongo/lint_spec.rb +231 -0
  653. data/spec/mongo/logger_spec.rb +62 -0
  654. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +79 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +26 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +22 -0
  657. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +33 -0
  658. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +33 -0
  659. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +30 -0
  660. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +27 -0
  661. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +27 -0
  662. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +22 -0
  663. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +29 -0
  664. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +36 -0
  665. data/spec/mongo/monitoring/event/command_failed_spec.rb +87 -0
  666. data/spec/mongo/monitoring/event/command_started_spec.rb +51 -0
  667. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +88 -0
  668. data/spec/mongo/monitoring/event/secure_spec.rb +123 -0
  669. data/spec/mongo/monitoring/event/server_closed_spec.rb +38 -0
  670. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +38 -0
  671. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +34 -0
  672. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +34 -0
  673. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +34 -0
  674. data/spec/mongo/monitoring/event/server_opening_spec.rb +38 -0
  675. data/spec/mongo/monitoring/event/topology_changed_spec.rb +44 -0
  676. data/spec/mongo/monitoring/event/topology_closed_spec.rb +38 -0
  677. data/spec/mongo/monitoring/event/topology_opening_spec.rb +38 -0
  678. data/spec/mongo/monitoring_spec.rb +196 -0
  679. data/spec/mongo/operation/aggregate/result_spec.rb +90 -0
  680. data/spec/mongo/operation/aggregate_spec.rb +76 -0
  681. data/spec/mongo/operation/collections_info_spec.rb +48 -0
  682. data/spec/mongo/operation/command_spec.rb +86 -0
  683. data/spec/mongo/operation/create_index_spec.rb +62 -0
  684. data/spec/mongo/operation/create_user_spec.rb +53 -0
  685. data/spec/mongo/operation/delete/bulk_spec.rb +245 -0
  686. data/spec/mongo/operation/delete/command_spec.rb +115 -0
  687. data/spec/mongo/operation/delete/op_msg_spec.rb +257 -0
  688. data/spec/mongo/operation/delete_spec.rb +233 -0
  689. data/spec/mongo/operation/drop_index_spec.rb +61 -0
  690. data/spec/mongo/operation/find/legacy_spec.rb +130 -0
  691. data/spec/mongo/operation/get_more_spec.rb +63 -0
  692. data/spec/mongo/operation/indexes_spec.rb +41 -0
  693. data/spec/mongo/operation/insert/bulk_spec.rb +273 -0
  694. data/spec/mongo/operation/insert/command_spec.rb +118 -0
  695. data/spec/mongo/operation/insert/op_msg_spec.rb +288 -0
  696. data/spec/mongo/operation/insert_spec.rb +290 -0
  697. data/spec/mongo/operation/kill_cursors_spec.rb +44 -0
  698. data/spec/mongo/operation/limited_spec.rb +55 -0
  699. data/spec/mongo/operation/map_reduce_spec.rb +131 -0
  700. data/spec/mongo/operation/read_preference_legacy_spec.rb +356 -0
  701. data/spec/mongo/operation/read_preference_op_msg_spec.rb +307 -0
  702. data/spec/mongo/operation/remove_user_spec.rb +52 -0
  703. data/spec/mongo/operation/result_spec.rb +349 -0
  704. data/spec/mongo/operation/specifiable_spec.rb +87 -0
  705. data/spec/mongo/operation/update/bulk_spec.rb +239 -0
  706. data/spec/mongo/operation/update/command_spec.rb +122 -0
  707. data/spec/mongo/operation/update/op_msg_spec.rb +263 -0
  708. data/spec/mongo/operation/update_spec.rb +264 -0
  709. data/spec/mongo/operation/update_user_spec.rb +52 -0
  710. data/spec/mongo/options/redacted_spec.rb +353 -0
  711. data/spec/mongo/protocol/compressed_spec.rb +83 -0
  712. data/spec/mongo/protocol/delete_spec.rb +185 -0
  713. data/spec/mongo/protocol/get_more_spec.rb +164 -0
  714. data/spec/mongo/protocol/insert_spec.rb +179 -0
  715. data/spec/mongo/protocol/kill_cursors_spec.rb +121 -0
  716. data/spec/mongo/protocol/msg_spec.rb +528 -0
  717. data/spec/mongo/protocol/query_spec.rb +347 -0
  718. data/spec/mongo/protocol/registry_spec.rb +34 -0
  719. data/spec/mongo/protocol/reply_spec.rb +198 -0
  720. data/spec/mongo/protocol/update_spec.rb +204 -0
  721. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  722. data/spec/mongo/query_cache_spec.rb +283 -0
  723. data/spec/mongo/retryable_spec.rb +592 -0
  724. data/spec/mongo/semaphore_spec.rb +54 -0
  725. data/spec/mongo/server/app_metadata_spec.rb +170 -0
  726. data/spec/mongo/server/connection_auth_spec.rb +136 -0
  727. data/spec/mongo/server/connection_common_spec.rb +24 -0
  728. data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
  729. data/spec/mongo/server/connection_pool_spec.rb +1039 -0
  730. data/spec/mongo/server/connection_spec.rb +1285 -0
  731. data/spec/mongo/server/description/features_spec.rb +250 -0
  732. data/spec/mongo/server/description_query_methods_spec.rb +291 -0
  733. data/spec/mongo/server/description_spec.rb +846 -0
  734. data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
  735. data/spec/mongo/server/monitor/connection_spec.rb +175 -0
  736. data/spec/mongo/server/monitor_spec.rb +324 -0
  737. data/spec/mongo/server/round_trip_time_averager_spec.rb +48 -0
  738. data/spec/mongo/server_selector/nearest_spec.rb +338 -0
  739. data/spec/mongo/server_selector/primary_preferred_spec.rb +372 -0
  740. data/spec/mongo/server_selector/primary_spec.rb +181 -0
  741. data/spec/mongo/server_selector/secondary_preferred_spec.rb +350 -0
  742. data/spec/mongo/server_selector/secondary_spec.rb +278 -0
  743. data/spec/mongo/server_selector_spec.rb +615 -0
  744. data/spec/mongo/server_spec.rb +436 -0
  745. data/spec/mongo/session/server_session_spec.rb +62 -0
  746. data/spec/mongo/session/session_pool_spec.rb +240 -0
  747. data/spec/mongo/session_spec.rb +348 -0
  748. data/spec/mongo/session_transaction_spec.rb +221 -0
  749. data/spec/mongo/socket/ssl_spec.rb +867 -0
  750. data/spec/mongo/socket/tcp_spec.rb +17 -0
  751. data/spec/mongo/socket/unix_spec.rb +55 -0
  752. data/spec/mongo/socket_spec.rb +119 -0
  753. data/spec/mongo/srv/monitor_spec.rb +233 -0
  754. data/spec/mongo/srv/result_spec.rb +57 -0
  755. data/spec/mongo/timeout_spec.rb +42 -0
  756. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  757. data/spec/mongo/uri/srv_protocol_spec.rb +1108 -0
  758. data/spec/mongo/uri_option_parsing_spec.rb +592 -0
  759. data/spec/mongo/uri_spec.rb +1286 -0
  760. data/spec/mongo/utils_spec.rb +56 -0
  761. data/spec/mongo/write_concern/acknowledged_spec.rb +58 -0
  762. data/spec/mongo/write_concern/unacknowledged_spec.rb +29 -0
  763. data/spec/mongo/write_concern_spec.rb +227 -0
  764. data/spec/runners/auth.rb +140 -0
  765. data/spec/runners/change_streams/outcome.rb +45 -0
  766. data/spec/runners/change_streams/spec.rb +60 -0
  767. data/spec/runners/change_streams/test.rb +232 -0
  768. data/spec/runners/cmap/verifier.rb +48 -0
  769. data/spec/runners/cmap.rb +373 -0
  770. data/spec/runners/command_monitoring.rb +346 -0
  771. data/spec/runners/connection_string.rb +381 -0
  772. data/spec/runners/crud/context.rb +30 -0
  773. data/spec/runners/crud/operation.rb +469 -0
  774. data/spec/runners/crud/outcome.rb +56 -0
  775. data/spec/runners/crud/requirement.rb +133 -0
  776. data/spec/runners/crud/spec.rb +73 -0
  777. data/spec/runners/crud/test.rb +123 -0
  778. data/spec/runners/crud/test_base.rb +53 -0
  779. data/spec/runners/crud/verifier.rb +217 -0
  780. data/spec/runners/crud.rb +257 -0
  781. data/spec/runners/gridfs.rb +641 -0
  782. data/spec/runners/read_write_concern_document.rb +70 -0
  783. data/spec/runners/sdam/verifier.rb +112 -0
  784. data/spec/runners/sdam.rb +278 -0
  785. data/spec/runners/server_selection.rb +365 -0
  786. data/spec/runners/server_selection_rtt.rb +41 -0
  787. data/spec/runners/transactions/operation.rb +328 -0
  788. data/spec/runners/transactions/spec.rb +29 -0
  789. data/spec/runners/transactions/test.rb +326 -0
  790. data/spec/runners/transactions.rb +104 -0
  791. data/spec/runners/unified/assertions.rb +282 -0
  792. data/spec/runners/unified/change_stream_operations.rb +29 -0
  793. data/spec/runners/unified/crud_operations.rb +206 -0
  794. data/spec/runners/unified/ddl_operations.rb +106 -0
  795. data/spec/runners/unified/entity_map.rb +42 -0
  796. data/spec/runners/unified/error.rb +28 -0
  797. data/spec/runners/unified/event_subscriber.rb +104 -0
  798. data/spec/runners/unified/exceptions.rb +24 -0
  799. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  800. data/spec/runners/unified/support_operations.rb +253 -0
  801. data/spec/runners/unified/test.rb +423 -0
  802. data/spec/runners/unified/test_group.rb +31 -0
  803. data/spec/runners/unified/using_hash.rb +34 -0
  804. data/spec/runners/unified.rb +99 -0
  805. data/spec/shared/LICENSE +20 -0
  806. data/spec/shared/bin/get-mongodb-download-url +17 -0
  807. data/spec/shared/bin/s3-copy +45 -0
  808. data/spec/shared/bin/s3-upload +69 -0
  809. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  810. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  811. data/spec/shared/lib/mrss/constraints.rb +379 -0
  812. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  813. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  814. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  815. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  816. data/spec/shared/lib/mrss/utils.rb +15 -0
  817. data/spec/shared/share/Dockerfile.erb +322 -0
  818. data/spec/shared/share/haproxy-1.conf +16 -0
  819. data/spec/shared/share/haproxy-2.conf +17 -0
  820. data/spec/shared/shlib/distro.sh +73 -0
  821. data/spec/shared/shlib/server.sh +317 -0
  822. data/spec/shared/shlib/set_env.sh +131 -0
  823. data/spec/solo/clean_exit_spec.rb +24 -0
  824. data/spec/spec_helper.rb +36 -0
  825. data/spec/spec_tests/auth_spec.rb +58 -0
  826. data/spec/spec_tests/change_streams_spec.rb +93 -0
  827. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  828. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  829. data/spec/spec_tests/cmap_spec.rb +109 -0
  830. data/spec/spec_tests/collection_management_spec.rb +13 -0
  831. data/spec/spec_tests/command_monitoring_spec.rb +71 -0
  832. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  833. data/spec/spec_tests/connection_string_spec.rb +10 -0
  834. data/spec/spec_tests/crud_spec.rb +22 -0
  835. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  836. data/spec/spec_tests/data/auth/connection-string.yml +366 -0
  837. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +101 -0
  838. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
  839. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  840. data/spec/spec_tests/data/change_streams/change-streams.yml +535 -0
  841. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  842. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  843. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  844. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  845. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  846. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  847. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  848. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  849. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  850. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  851. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  852. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  853. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  854. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  855. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  856. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  857. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  858. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  859. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  860. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  861. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  862. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  863. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  864. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  865. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  866. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  867. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  868. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  869. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  870. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  871. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +27 -0
  872. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +27 -0
  873. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +27 -0
  874. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +27 -0
  875. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +24 -0
  876. data/spec/spec_tests/data/cmap/pool-checkin.yml +19 -0
  877. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +19 -0
  878. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +36 -0
  879. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +37 -0
  880. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +35 -0
  881. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +33 -0
  882. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +28 -0
  883. data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
  884. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +71 -0
  885. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +34 -0
  886. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +21 -0
  887. data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
  888. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +124 -0
  889. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +46 -0
  890. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  891. data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +49 -0
  892. data/spec/spec_tests/data/command_monitoring/command.yml +61 -0
  893. data/spec/spec_tests/data/command_monitoring/deleteMany.yml +55 -0
  894. data/spec/spec_tests/data/command_monitoring/deleteOne.yml +55 -0
  895. data/spec/spec_tests/data/command_monitoring/find.yml +266 -0
  896. data/spec/spec_tests/data/command_monitoring/insertMany.yml +75 -0
  897. data/spec/spec_tests/data/command_monitoring/insertOne.yml +51 -0
  898. data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
  899. data/spec/spec_tests/data/command_monitoring/updateMany.yml +65 -0
  900. data/spec/spec_tests/data/command_monitoring/updateOne.yml +90 -0
  901. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  902. data/spec/spec_tests/data/connection_string/invalid-uris.yml +261 -0
  903. data/spec/spec_tests/data/connection_string/valid-auth.yml +257 -0
  904. data/spec/spec_tests/data/connection_string/valid-db-with-dotted-name.yml +77 -0
  905. data/spec/spec_tests/data/connection_string/valid-host_identifiers.yml +121 -0
  906. data/spec/spec_tests/data/connection_string/valid-options.yml +17 -0
  907. data/spec/spec_tests/data/connection_string/valid-unix_socket-absolute.yml +197 -0
  908. data/spec/spec_tests/data/connection_string/valid-unix_socket-relative.yml +213 -0
  909. data/spec/spec_tests/data/connection_string/valid-warnings.yml +75 -0
  910. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +17 -0
  911. data/spec/spec_tests/data/crud/read/aggregate-out.yml +43 -0
  912. data/spec/spec_tests/data/crud/read/aggregate.yml +21 -0
  913. data/spec/spec_tests/data/crud/read/count-collation.yml +25 -0
  914. data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
  915. data/spec/spec_tests/data/crud/read/count.yml +74 -0
  916. data/spec/spec_tests/data/crud/read/distinct-collation.yml +17 -0
  917. data/spec/spec_tests/data/crud/read/distinct.yml +32 -0
  918. data/spec/spec_tests/data/crud/read/find-collation.yml +15 -0
  919. data/spec/spec_tests/data/crud/read/find.yml +49 -0
  920. data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +45 -0
  921. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +101 -0
  922. data/spec/spec_tests/data/crud/write/bulkWrite.yml +405 -0
  923. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +22 -0
  924. data/spec/spec_tests/data/crud/write/deleteMany.yml +35 -0
  925. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +22 -0
  926. data/spec/spec_tests/data/crud/write/deleteOne.yml +48 -0
  927. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +23 -0
  928. data/spec/spec_tests/data/crud/write/findOneAndDelete.yml +53 -0
  929. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +24 -0
  930. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert.yml +91 -0
  931. data/spec/spec_tests/data/crud/write/findOneAndReplace-upsert_pre_2.6.yml +88 -0
  932. data/spec/spec_tests/data/crud/write/findOneAndReplace.yml +113 -0
  933. data/spec/spec_tests/data/crud/write/findOneAndUpdate-arrayFilters.yml +69 -0
  934. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +27 -0
  935. data/spec/spec_tests/data/crud/write/findOneAndUpdate.yml +163 -0
  936. data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
  937. data/spec/spec_tests/data/crud/write/insertOne.yml +18 -0
  938. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +24 -0
  939. data/spec/spec_tests/data/crud/write/replaceOne-pre_2.6.yml +98 -0
  940. data/spec/spec_tests/data/crud/write/replaceOne-upsert.yml +48 -0
  941. data/spec/spec_tests/data/crud/write/replaceOne.yml +102 -0
  942. data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +66 -0
  943. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +28 -0
  944. data/spec/spec_tests/data/crud/write/updateMany-pre_2.6.yml +86 -0
  945. data/spec/spec_tests/data/crud/write/updateMany.yml +87 -0
  946. data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +114 -0
  947. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +25 -0
  948. data/spec/spec_tests/data/crud/write/updateOne-pre_2.6.yml +83 -0
  949. data/spec/spec_tests/data/crud/write/updateOne.yml +84 -0
  950. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  951. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  952. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
  953. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +111 -0
  954. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +103 -0
  955. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  956. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  957. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  958. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  959. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  960. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  961. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +39 -0
  962. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  963. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  964. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  965. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  966. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  967. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  968. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  969. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  970. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  971. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  972. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  973. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  974. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  975. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  976. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  977. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  978. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  979. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  980. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  981. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  982. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  983. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  984. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  985. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  986. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  987. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  988. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  989. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  990. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  991. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  992. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  993. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  994. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  995. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  996. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  997. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +157 -0
  998. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  999. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  1000. data/spec/spec_tests/data/dns_seedlist_discovery/longer-parent-in-return.yml +11 -0
  1001. data/spec/spec_tests/data/dns_seedlist_discovery/misformatted-option.yml +5 -0
  1002. data/spec/spec_tests/data/dns_seedlist_discovery/no-results.yml +5 -0
  1003. data/spec/spec_tests/data/dns_seedlist_discovery/not-enough-parts.yml +5 -0
  1004. data/spec/spec_tests/data/dns_seedlist_discovery/one-result-default-port.yml +10 -0
  1005. data/spec/spec_tests/data/dns_seedlist_discovery/one-txt-record-multiple-strings.yml +10 -0
  1006. data/spec/spec_tests/data/dns_seedlist_discovery/one-txt-record.yml +11 -0
  1007. data/spec/spec_tests/data/dns_seedlist_discovery/parent-part-mismatch1.yml +5 -0
  1008. data/spec/spec_tests/data/dns_seedlist_discovery/parent-part-mismatch2.yml +5 -0
  1009. data/spec/spec_tests/data/dns_seedlist_discovery/parent-part-mismatch3.yml +5 -0
  1010. data/spec/spec_tests/data/dns_seedlist_discovery/parent-part-mismatch4.yml +5 -0
  1011. data/spec/spec_tests/data/dns_seedlist_discovery/parent-part-mismatch5.yml +5 -0
  1012. data/spec/spec_tests/data/dns_seedlist_discovery/returned-parent-too-short.yml +5 -0
  1013. data/spec/spec_tests/data/dns_seedlist_discovery/returned-parent-wrong.yml +5 -0
  1014. data/spec/spec_tests/data/dns_seedlist_discovery/two-results-default-port.yml +11 -0
  1015. data/spec/spec_tests/data/dns_seedlist_discovery/two-results-nonstandard-port.yml +11 -0
  1016. data/spec/spec_tests/data/dns_seedlist_discovery/two-txt-records.yml +5 -0
  1017. data/spec/spec_tests/data/dns_seedlist_discovery/txt-record-not-allowed-option.yml +5 -0
  1018. data/spec/spec_tests/data/dns_seedlist_discovery/txt-record-with-overridden-ssl-option.yml +11 -0
  1019. data/spec/spec_tests/data/dns_seedlist_discovery/txt-record-with-overridden-uri-option.yml +11 -0
  1020. data/spec/spec_tests/data/dns_seedlist_discovery/txt-record-with-unallowed-option.yml +5 -0
  1021. data/spec/spec_tests/data/dns_seedlist_discovery/uri-with-port.yml +5 -0
  1022. data/spec/spec_tests/data/dns_seedlist_discovery/uri-with-two-hosts.yml +5 -0
  1023. data/spec/spec_tests/data/gridfs/delete.yml +123 -0
  1024. data/spec/spec_tests/data/gridfs/download.yml +192 -0
  1025. data/spec/spec_tests/data/gridfs/download_by_name.yml +113 -0
  1026. data/spec/spec_tests/data/gridfs/upload.yml +158 -0
  1027. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +26 -0
  1028. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +25 -0
  1029. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +33 -0
  1030. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  1031. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +33 -0
  1032. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +33 -0
  1033. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
  1034. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +27 -0
  1035. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +36 -0
  1036. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +51 -0
  1037. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +26 -0
  1038. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +51 -0
  1039. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
  1040. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +26 -0
  1041. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +25 -0
  1042. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +35 -0
  1043. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +29 -0
  1044. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +25 -0
  1045. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +26 -0
  1046. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +23 -0
  1047. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +33 -0
  1048. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +33 -0
  1049. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +36 -0
  1050. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +27 -0
  1051. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +27 -0
  1052. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +26 -0
  1053. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +59 -0
  1054. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +43 -0
  1055. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +59 -0
  1056. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +43 -0
  1057. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +23 -0
  1058. data/spec/spec_tests/data/max_staleness/Sharded/Incompatible.yml +25 -0
  1059. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +28 -0
  1060. data/spec/spec_tests/data/max_staleness/Single/Incompatible.yml +18 -0
  1061. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +20 -0
  1062. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +15 -0
  1063. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  1064. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
  1065. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  1066. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  1067. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  1068. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  1069. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  1070. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  1071. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  1072. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
  1073. data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
  1074. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +150 -0
  1075. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +62 -0
  1076. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +150 -0
  1077. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +66 -0
  1078. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +154 -0
  1079. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +62 -0
  1080. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
  1081. data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
  1082. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
  1083. data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
  1084. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
  1085. data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
  1086. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  1087. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-pre4.9.yml +64 -0
  1088. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  1089. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +150 -0
  1090. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
  1091. data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
  1092. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
  1093. data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
  1094. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
  1095. data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
  1096. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
  1097. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
  1098. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
  1099. data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
  1100. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
  1101. data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
  1102. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
  1103. data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
  1104. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
  1105. data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
  1106. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
  1107. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
  1108. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
  1109. data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
  1110. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
  1111. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
  1112. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
  1113. data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
  1114. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +60 -0
  1115. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  1116. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +130 -0
  1117. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +402 -0
  1118. data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
  1119. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  1120. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +73 -0
  1121. data/spec/spec_tests/data/retryable_writes/deleteOne.yml +57 -0
  1122. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  1123. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +74 -0
  1124. data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +58 -0
  1125. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  1126. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +80 -0
  1127. data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +63 -0
  1128. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  1129. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +79 -0
  1130. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +62 -0
  1131. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  1132. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +84 -0
  1133. data/spec/spec_tests/data/retryable_writes/insertMany.yml +74 -0
  1134. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  1135. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +527 -0
  1136. data/spec/spec_tests/data/retryable_writes/insertOne.yml +61 -0
  1137. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  1138. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +82 -0
  1139. data/spec/spec_tests/data/retryable_writes/replaceOne.yml +66 -0
  1140. data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
  1141. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  1142. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +82 -0
  1143. data/spec/spec_tests/data/retryable_writes/updateOne.yml +129 -0
  1144. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1145. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1146. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1147. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1148. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1149. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1150. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1151. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1152. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1153. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1154. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1155. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1156. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1157. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1158. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1159. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1160. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1161. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1162. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1163. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1164. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1165. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1166. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1167. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1168. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1169. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1170. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1171. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1172. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1173. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1174. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1175. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1176. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1177. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1178. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1179. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1180. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1181. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1182. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1183. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1184. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1185. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1186. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1187. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1188. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1189. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1190. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1191. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1192. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1193. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1194. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1195. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1196. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1197. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1198. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1199. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1200. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1201. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1202. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1203. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1204. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1205. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1206. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1207. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1208. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1209. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1210. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1211. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1212. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1213. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1214. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1215. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1216. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1217. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1218. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1219. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1220. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1221. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1222. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1223. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1224. data/spec/spec_tests/data/sdam/rs/compatible.yml +45 -0
  1225. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +34 -0
  1226. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +44 -0
  1227. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1228. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1229. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +42 -0
  1230. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1231. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1232. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +83 -0
  1233. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1234. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +43 -0
  1235. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1236. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1237. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +68 -0
  1238. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +44 -0
  1239. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1240. data/spec/spec_tests/data/sdam/rs/discovery.yml +207 -0
  1241. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +57 -0
  1242. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +37 -0
  1243. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +36 -0
  1244. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +34 -0
  1245. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +36 -0
  1246. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +249 -0
  1247. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +74 -0
  1248. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +66 -0
  1249. data/spec/spec_tests/data/sdam/rs/new_primary.yml +80 -0
  1250. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +119 -0
  1251. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +119 -0
  1252. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +77 -0
  1253. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +33 -0
  1254. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +52 -0
  1255. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +102 -0
  1256. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +175 -0
  1257. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +65 -0
  1258. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +58 -0
  1259. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +55 -0
  1260. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +63 -0
  1261. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +59 -0
  1262. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +189 -0
  1263. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +189 -0
  1264. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +64 -0
  1265. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +27 -0
  1266. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1267. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +175 -0
  1268. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -0
  1269. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +30 -0
  1270. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1271. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1272. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +69 -0
  1273. data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
  1274. data/spec/spec_tests/data/sdam/rs/ruby_secondary_wrong_set_name_with_primary_second.yml +73 -0
  1275. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +55 -0
  1276. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +87 -0
  1277. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +28 -0
  1278. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +31 -0
  1279. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +75 -0
  1280. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +79 -0
  1281. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +65 -0
  1282. data/spec/spec_tests/data/sdam/rs/too_new.yml +45 -0
  1283. data/spec/spec_tests/data/sdam/rs/too_old.yml +41 -0
  1284. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1285. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1286. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1287. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +29 -0
  1288. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +117 -0
  1289. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +38 -0
  1290. data/spec/spec_tests/data/sdam/sharded/compatible.yml +40 -0
  1291. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1292. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +101 -0
  1293. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +113 -0
  1294. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +52 -0
  1295. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +47 -0
  1296. data/spec/spec_tests/data/sdam/sharded/normalize_uri_case.yml +32 -0
  1297. data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
  1298. data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
  1299. data/spec/spec_tests/data/sdam/sharded/too_new.yml +38 -0
  1300. data/spec/spec_tests/data/sdam/sharded/too_old.yml +38 -0
  1301. data/spec/spec_tests/data/sdam/single/compatible.yml +27 -0
  1302. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +37 -0
  1303. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +36 -0
  1304. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1305. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +38 -0
  1306. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +37 -0
  1307. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +38 -0
  1308. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +35 -0
  1309. data/spec/spec_tests/data/sdam/single/direct_connection_unavailable_seed.yml +28 -0
  1310. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1311. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1312. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1313. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +36 -0
  1314. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +44 -0
  1315. data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
  1316. data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
  1317. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +35 -0
  1318. data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
  1319. data/spec/spec_tests/data/sdam/single/too_new.yml +27 -0
  1320. data/spec/spec_tests/data/sdam/single/too_old.yml +25 -0
  1321. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1322. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1323. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1324. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  1325. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  1326. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +158 -0
  1327. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +156 -0
  1328. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +223 -0
  1329. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  1330. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  1331. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1332. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +70 -0
  1333. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_chain.yml +222 -0
  1334. data/spec/spec_tests/data/sdam_monitoring/replica_set_other_change.yml +225 -0
  1335. data/spec/spec_tests/data/sdam_monitoring/replica_set_primary_address_change.yml +251 -0
  1336. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
  1337. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +113 -0
  1338. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +112 -0
  1339. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_and_secondary.yml +198 -0
  1340. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +175 -0
  1341. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +111 -0
  1342. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_second_seed_removal.yml +106 -0
  1343. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +108 -0
  1344. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +70 -0
  1345. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +86 -0
  1346. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1347. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
  1348. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest.yml +25 -0
  1349. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml +26 -0
  1350. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +20 -0
  1351. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimary.yml +15 -0
  1352. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +15 -0
  1353. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Primary.yml +18 -0
  1354. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +25 -0
  1355. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +20 -0
  1356. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary.yml +25 -0
  1357. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +25 -0
  1358. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +20 -0
  1359. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +31 -0
  1360. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +31 -0
  1361. data/spec/spec_tests/data/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +20 -0
  1362. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest.yml +32 -0
  1363. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml +33 -0
  1364. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +25 -0
  1365. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Primary.yml +26 -0
  1366. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +28 -0
  1367. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +28 -0
  1368. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary.yml +30 -0
  1369. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +30 -0
  1370. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +28 -0
  1371. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +28 -0
  1372. data/spec/spec_tests/data/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +25 -0
  1373. data/spec/spec_tests/data/server_selection/Sharded/read/Nearest.yml +21 -0
  1374. data/spec/spec_tests/data/server_selection/Sharded/read/Primary.yml +19 -0
  1375. data/spec/spec_tests/data/server_selection/Sharded/read/PrimaryPreferred.yml +21 -0
  1376. data/spec/spec_tests/data/server_selection/Sharded/read/Secondary.yml +21 -0
  1377. data/spec/spec_tests/data/server_selection/Sharded/read/SecondaryPreferred.yml +21 -0
  1378. data/spec/spec_tests/data/server_selection/Single/read/SecondaryPreferred.yml +18 -0
  1379. data/spec/spec_tests/data/server_selection/Unknown/read/SecondaryPreferred.yml +10 -0
  1380. data/spec/spec_tests/data/server_selection_rtt/first_value.yml +4 -0
  1381. data/spec/spec_tests/data/server_selection_rtt/first_value_zero.yml +4 -0
  1382. data/spec/spec_tests/data/server_selection_rtt/value_test_1.yml +4 -0
  1383. data/spec/spec_tests/data/server_selection_rtt/value_test_2.yml +4 -0
  1384. data/spec/spec_tests/data/server_selection_rtt/value_test_3.yml +4 -0
  1385. data/spec/spec_tests/data/server_selection_rtt/value_test_4.yml +4 -0
  1386. data/spec/spec_tests/data/server_selection_rtt/value_test_5.yml +4 -0
  1387. data/spec/spec_tests/data/transactions/abort.yml +413 -0
  1388. data/spec/spec_tests/data/transactions/bulk.yml +267 -0
  1389. data/spec/spec_tests/data/transactions/causal-consistency.yml +175 -0
  1390. data/spec/spec_tests/data/transactions/commit.yml +603 -0
  1391. data/spec/spec_tests/data/transactions/count.yml +67 -0
  1392. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1393. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1394. data/spec/spec_tests/data/transactions/delete.yml +192 -0
  1395. data/spec/spec_tests/data/transactions/error-labels.yml +1030 -0
  1396. data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
  1397. data/spec/spec_tests/data/transactions/errors.yml +133 -0
  1398. data/spec/spec_tests/data/transactions/findOneAndDelete.yml +134 -0
  1399. data/spec/spec_tests/data/transactions/findOneAndReplace.yml +148 -0
  1400. data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +236 -0
  1401. data/spec/spec_tests/data/transactions/insert.yml +390 -0
  1402. data/spec/spec_tests/data/transactions/isolation.yml +133 -0
  1403. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1674 -0
  1404. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +350 -0
  1405. data/spec/spec_tests/data/transactions/pin-mongos.yml +559 -0
  1406. data/spec/spec_tests/data/transactions/read-concern.yml +623 -0
  1407. data/spec/spec_tests/data/transactions/read-pref.yml +348 -0
  1408. data/spec/spec_tests/data/transactions/reads.yml +261 -0
  1409. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  1410. data/spec/spec_tests/data/transactions/retryable-abort.yml +1315 -0
  1411. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  1412. data/spec/spec_tests/data/transactions/retryable-commit.yml +1460 -0
  1413. data/spec/spec_tests/data/transactions/retryable-writes.yml +216 -0
  1414. data/spec/spec_tests/data/transactions/run-command.yml +197 -0
  1415. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  1416. data/spec/spec_tests/data/transactions/transaction-options.yml +781 -0
  1417. data/spec/spec_tests/data/transactions/update.yml +246 -0
  1418. data/spec/spec_tests/data/transactions/write-concern.yml +554 -0
  1419. data/spec/spec_tests/data/transactions_api/callback-aborts.yml +170 -0
  1420. data/spec/spec_tests/data/transactions_api/callback-commits.yml +204 -0
  1421. data/spec/spec_tests/data/transactions_api/callback-retry.yml +215 -0
  1422. data/spec/spec_tests/data/transactions_api/commit-retry.yml +324 -0
  1423. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +139 -0
  1424. data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +175 -0
  1425. data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +216 -0
  1426. data/spec/spec_tests/data/transactions_api/commit.yml +193 -0
  1427. data/spec/spec_tests/data/transactions_api/transaction-options.yml +274 -0
  1428. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1429. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1430. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1431. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1432. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1433. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1434. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1435. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1436. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1437. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1438. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1439. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1440. data/spec/spec_tests/data/uri_options/auth-options.yml +49 -0
  1441. data/spec/spec_tests/data/uri_options/compression-options.yml +51 -0
  1442. data/spec/spec_tests/data/uri_options/concern-options.yml +55 -0
  1443. data/spec/spec_tests/data/uri_options/connection-options.yml +149 -0
  1444. data/spec/spec_tests/data/uri_options/connection-pool-options.yml +26 -0
  1445. data/spec/spec_tests/data/uri_options/read-preference-options.yml +66 -0
  1446. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1447. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1448. data/spec/spec_tests/data/uri_options/tls-options.yml +364 -0
  1449. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1450. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1451. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1452. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1453. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1454. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1455. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +79 -0
  1456. data/spec/spec_tests/gridfs_spec.rb +55 -0
  1457. data/spec/spec_tests/max_staleness_spec.rb +12 -0
  1458. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
  1459. data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
  1460. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1461. data/spec/spec_tests/retryable_reads_spec.rb +50 -0
  1462. data/spec/spec_tests/retryable_writes_spec.rb +22 -0
  1463. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1464. data/spec/spec_tests/sdam_monitoring_spec.rb +96 -0
  1465. data/spec/spec_tests/sdam_spec.rb +242 -0
  1466. data/spec/spec_tests/server_selection_rtt_spec.rb +33 -0
  1467. data/spec/spec_tests/server_selection_spec.rb +12 -0
  1468. data/spec/spec_tests/transactions_api_spec.rb +13 -0
  1469. data/spec/spec_tests/transactions_spec.rb +13 -0
  1470. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1471. data/spec/spec_tests/unified_spec.rb +18 -0
  1472. data/spec/spec_tests/uri_options_spec.rb +93 -0
  1473. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1474. data/spec/stress/cleanup_spec.rb +61 -0
  1475. data/spec/stress/connection_pool_stress_spec.rb +204 -0
  1476. data/spec/stress/connection_pool_timing_spec.rb +184 -0
  1477. data/spec/stress/fork_reconnect_stress_spec.rb +112 -0
  1478. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1479. data/spec/support/authorization.rb +161 -0
  1480. data/spec/support/aws_utils/base.rb +137 -0
  1481. data/spec/support/aws_utils/inspector.rb +227 -0
  1482. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1483. data/spec/support/aws_utils/provisioner.rb +363 -0
  1484. data/spec/support/aws_utils.rb +65 -0
  1485. data/spec/support/background_thread_registry.rb +70 -0
  1486. data/spec/support/certificates/README.md +106 -0
  1487. data/spec/support/certificates/atlas-ocsp-ca.crt +118 -0
  1488. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1489. data/spec/support/certificates/ca.crt +76 -0
  1490. data/spec/support/certificates/client-encrypted.key +30 -0
  1491. data/spec/support/certificates/client-int.crt +78 -0
  1492. data/spec/support/certificates/client-second-level-bundle.pem +179 -0
  1493. data/spec/support/certificates/client-second-level.crt +74 -0
  1494. data/spec/support/certificates/client-second-level.key +27 -0
  1495. data/spec/support/certificates/client-second-level.pem +101 -0
  1496. data/spec/support/certificates/client-x509.crt +78 -0
  1497. data/spec/support/certificates/client-x509.key +27 -0
  1498. data/spec/support/certificates/client-x509.pem +105 -0
  1499. data/spec/support/certificates/client.crt +74 -0
  1500. data/spec/support/certificates/client.key +27 -0
  1501. data/spec/support/certificates/client.pem +101 -0
  1502. data/spec/support/certificates/crl.pem +12 -0
  1503. data/spec/support/certificates/crl_client_revoked.pem +13 -0
  1504. data/spec/support/certificates/multi-ca.crt +152 -0
  1505. data/spec/support/certificates/python-ca.crt +76 -0
  1506. data/spec/support/certificates/server-int.crt +78 -0
  1507. data/spec/support/certificates/server-second-level-bundle.pem +179 -0
  1508. data/spec/support/certificates/server-second-level.crt +74 -0
  1509. data/spec/support/certificates/server-second-level.key +27 -0
  1510. data/spec/support/certificates/server-second-level.pem +101 -0
  1511. data/spec/support/certificates/server.pem +101 -0
  1512. data/spec/support/client_registry.rb +254 -0
  1513. data/spec/support/client_registry_macros.rb +26 -0
  1514. data/spec/support/cluster_tools.rb +379 -0
  1515. data/spec/support/common_shortcuts.rb +375 -0
  1516. data/spec/support/constraints.rb +19 -0
  1517. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1518. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1519. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  1520. data/spec/support/crypt/corpus/corpus.json +3657 -0
  1521. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  1522. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1523. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1524. data/spec/support/crypt/external/external-key.json +31 -0
  1525. data/spec/support/crypt/external/external-schema.json +19 -0
  1526. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1527. data/spec/support/crypt/limits/limits-key.json +31 -0
  1528. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1529. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1530. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1531. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1532. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1533. data/spec/support/crypt.rb +157 -0
  1534. data/spec/support/dns.rb +16 -0
  1535. data/spec/support/event_subscriber.rb +221 -0
  1536. data/spec/support/json_ext_formatter.rb +16 -0
  1537. data/spec/support/keyword_struct.rb +29 -0
  1538. data/spec/support/local_resource_registry.rb +37 -0
  1539. data/spec/support/matchers.rb +75 -0
  1540. data/spec/support/monitoring_ext.rb +19 -0
  1541. data/spec/support/ocsp +1 -0
  1542. data/spec/support/primary_socket.rb +24 -0
  1543. data/spec/support/sdam_formatter_integration.rb +119 -0
  1544. data/spec/support/session_registry.rb +55 -0
  1545. data/spec/support/shared/app_metadata.rb +167 -0
  1546. data/spec/support/shared/protocol.rb +36 -0
  1547. data/spec/support/shared/scram_conversation.rb +103 -0
  1548. data/spec/support/shared/server_selector.rb +233 -0
  1549. data/spec/support/shared/session.rb +910 -0
  1550. data/spec/support/spec_config.rb +637 -0
  1551. data/spec/support/spec_setup.rb +83 -0
  1552. data/spec/support/utils.rb +598 -0
  1553. data.tar.gz.sig +0 -0
  1554. metadata +2696 -179
  1555. metadata.gz.sig +0 -0
  1556. data/VERSION +0 -1
  1557. data/lib/mongo/db.rb +0 -644
  1558. data/lib/mongo/exceptions.rb +0 -65
  1559. data/lib/mongo/gridfs/grid.rb +0 -101
  1560. data/lib/mongo/gridfs/grid_ext.rb +0 -39
  1561. data/lib/mongo/gridfs/grid_file_system.rb +0 -150
  1562. data/lib/mongo/gridfs/grid_io.rb +0 -472
  1563. data/lib/mongo/legacy.rb +0 -71
  1564. data/lib/mongo/mongo_client.rb +0 -657
  1565. data/lib/mongo/mongo_replica_set_client.rb +0 -485
  1566. data/lib/mongo/mongo_sharded_client.rb +0 -144
  1567. data/lib/mongo/networking.rb +0 -343
  1568. data/lib/mongo/util/conversions.rb +0 -95
  1569. data/lib/mongo/util/core_ext.rb +0 -87
  1570. data/lib/mongo/util/logging.rb +0 -69
  1571. data/lib/mongo/util/node.rb +0 -197
  1572. data/lib/mongo/util/pool.rb +0 -316
  1573. data/lib/mongo/util/pool_manager.rb +0 -270
  1574. data/lib/mongo/util/read_preference.rb +0 -112
  1575. data/lib/mongo/util/server_version.rb +0 -54
  1576. data/lib/mongo/util/sharding_pool_manager.rb +0 -54
  1577. data/lib/mongo/util/socket_util.rb +0 -20
  1578. data/lib/mongo/util/ssl_socket.rb +0 -51
  1579. data/lib/mongo/util/support.rb +0 -113
  1580. data/lib/mongo/util/tcp_socket.rb +0 -62
  1581. data/lib/mongo/util/thread_local_variable_manager.rb +0 -11
  1582. data/lib/mongo/util/unix_socket.rb +0 -23
  1583. data/lib/mongo/util/uri_parser.rb +0 -337
  1584. data/lib/mongo/util/write_concern.rb +0 -54
  1585. data/test/functional/authentication_test.rb +0 -18
  1586. data/test/functional/collection_test.rb +0 -1410
  1587. data/test/functional/connection_test.rb +0 -449
  1588. data/test/functional/conversions_test.rb +0 -119
  1589. data/test/functional/cursor_fail_test.rb +0 -49
  1590. data/test/functional/cursor_message_test.rb +0 -43
  1591. data/test/functional/cursor_test.rb +0 -548
  1592. data/test/functional/db_api_test.rb +0 -805
  1593. data/test/functional/db_connection_test.rb +0 -13
  1594. data/test/functional/db_test.rb +0 -282
  1595. data/test/functional/grid_file_system_test.rb +0 -273
  1596. data/test/functional/grid_io_test.rb +0 -238
  1597. data/test/functional/grid_test.rb +0 -259
  1598. data/test/functional/pool_test.rb +0 -47
  1599. data/test/functional/safe_test.rb +0 -84
  1600. data/test/functional/support_test.rb +0 -48
  1601. data/test/functional/threading_test.rb +0 -95
  1602. data/test/functional/timeout_test.rb +0 -60
  1603. data/test/functional/uri_test.rb +0 -200
  1604. data/test/functional/write_concern_test.rb +0 -104
  1605. data/test/replica_set/authentication_test.rb +0 -20
  1606. data/test/replica_set/basic_test.rb +0 -133
  1607. data/test/replica_set/client_test.rb +0 -264
  1608. data/test/replica_set/complex_connect_test.rb +0 -64
  1609. data/test/replica_set/connection_test.rb +0 -116
  1610. data/test/replica_set/count_test.rb +0 -50
  1611. data/test/replica_set/cursor_test.rb +0 -198
  1612. data/test/replica_set/insert_test.rb +0 -50
  1613. data/test/replica_set/max_values_test.rb +0 -76
  1614. data/test/replica_set/pinning_test.rb +0 -41
  1615. data/test/replica_set/query_test.rb +0 -59
  1616. data/test/replica_set/read_preference_test.rb +0 -200
  1617. data/test/replica_set/refresh_test.rb +0 -161
  1618. data/test/replica_set/replication_ack_test.rb +0 -74
  1619. data/test/sharded_cluster/basic_test.rb +0 -155
  1620. data/test/shared/authentication.rb +0 -66
  1621. data/test/test_helper.rb +0 -210
  1622. data/test/threading/basic_test.rb +0 -80
  1623. data/test/tools/mongo_config.rb +0 -568
  1624. data/test/tools/mongo_config_test.rb +0 -146
  1625. data/test/unit/client_test.rb +0 -252
  1626. data/test/unit/collection_test.rb +0 -176
  1627. data/test/unit/connection_test.rb +0 -246
  1628. data/test/unit/cursor_test.rb +0 -273
  1629. data/test/unit/db_test.rb +0 -112
  1630. data/test/unit/grid_test.rb +0 -62
  1631. data/test/unit/mongo_sharded_client_test.rb +0 -32
  1632. data/test/unit/node_test.rb +0 -78
  1633. data/test/unit/pool_manager_test.rb +0 -94
  1634. data/test/unit/pool_test.rb +0 -9
  1635. data/test/unit/read_pref_test.rb +0 -21
  1636. data/test/unit/read_test.rb +0 -145
  1637. data/test/unit/safe_test.rb +0 -144
  1638. data/test/unit/sharding_pool_manager_test.rb +0 -63
  1639. data/test/unit/util_test.rb +0 -55
  1640. data/test/unit/write_concern_test.rb +0 -161
@@ -0,0 +1,1074 @@
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 [ BSON::Document | nil ] Recovery token for the sharded
212
+ # transaction being executed on this session, if any.
213
+ #
214
+ # @api private
215
+ attr_accessor :recovery_token
216
+
217
+ # Error message indicating that the session was retrieved from a client with a different cluster than that of the
218
+ # client through which it is currently being used.
219
+ #
220
+ # @since 2.5.0
221
+ MISMATCHED_CLUSTER_ERROR_MSG = 'The configuration of the client used to create this session does not match that ' +
222
+ 'of the client owning this operation. Please only use this session for operations through its parent ' +
223
+ 'client.'.freeze
224
+
225
+ # Error message describing that the session cannot be used because it has already been ended.
226
+ #
227
+ # @since 2.5.0
228
+ SESSION_ENDED_ERROR_MSG = 'This session has ended and cannot be used. Please create a new one.'.freeze
229
+
230
+ # Error message describing that sessions are not supported by the server version.
231
+ #
232
+ # @since 2.5.0
233
+ # @deprecated
234
+ SESSIONS_NOT_SUPPORTED = 'Sessions are not supported by the connected servers.'.freeze
235
+ # Note: SESSIONS_NOT_SUPPORTED is used by Mongoid - do not remove from driver.
236
+
237
+ # The state of a session in which the last operation was not related to
238
+ # any transaction or no operations have yet occurred.
239
+ #
240
+ # @since 2.6.0
241
+ NO_TRANSACTION_STATE = :no_transaction
242
+
243
+ # The state of a session in which a user has initiated a transaction but
244
+ # no operations within the transactions have occurred yet.
245
+ #
246
+ # @since 2.6.0
247
+ STARTING_TRANSACTION_STATE = :starting_transaction
248
+
249
+ # The state of a session in which a transaction has been started and at
250
+ # least one operation has occurred, but the transaction has not yet been
251
+ # committed or aborted.
252
+ #
253
+ # @since 2.6.0
254
+ TRANSACTION_IN_PROGRESS_STATE = :transaction_in_progress
255
+
256
+ # The state of a session in which the last operation executed was a transaction commit.
257
+ #
258
+ # @since 2.6.0
259
+ TRANSACTION_COMMITTED_STATE = :transaction_committed
260
+
261
+ # The state of a session in which the last operation executed was a transaction abort.
262
+ #
263
+ # @since 2.6.0
264
+ TRANSACTION_ABORTED_STATE = :transaction_aborted
265
+
266
+ # @api private
267
+ UNLABELED_WRITE_CONCERN_CODES = [
268
+ 79, # UnknownReplWriteConcern
269
+ 100, # CannotSatisfyWriteConcern,
270
+ ].freeze
271
+
272
+ # Get a formatted string for use in inspection.
273
+ #
274
+ # @example Inspect the session object.
275
+ # session.inspect
276
+ #
277
+ # @return [ String ] The session inspection.
278
+ #
279
+ # @since 2.5.0
280
+ def inspect
281
+ "#<Mongo::Session:0x#{object_id} session_id=#{session_id} options=#{@options}>"
282
+ end
283
+
284
+ # End this session.
285
+ #
286
+ # If there is an in-progress transaction on this session, the transaction
287
+ # is aborted. The server session associated with this session is returned
288
+ # to the server session pool. Finally, this session is marked ended and
289
+ # is no longer usable.
290
+ #
291
+ # If this session is already ended, this method does nothing.
292
+ #
293
+ # Note that this method does not directly issue an endSessions command
294
+ # to this server, contrary to what its name might suggest.
295
+ #
296
+ # @example
297
+ # session.end_session
298
+ #
299
+ # @return [ nil ] Always nil.
300
+ #
301
+ # @since 2.5.0
302
+ def end_session
303
+ if !ended? && @client
304
+ if within_states?(TRANSACTION_IN_PROGRESS_STATE)
305
+ begin
306
+ abort_transaction
307
+ rescue Mongo::Error, Error::AuthError
308
+ end
309
+ end
310
+ @client.cluster.session_pool.checkin(@server_session)
311
+ end
312
+ ensure
313
+ @server_session = nil
314
+ end
315
+
316
+ # Executes the provided block in a transaction, retrying as necessary.
317
+ #
318
+ # Returns the return value of the block.
319
+ #
320
+ # Exact number of retries and when they are performed are implementation
321
+ # details of the driver; the provided block should be idempotent, and
322
+ # should be prepared to be called more than once. The driver may retry
323
+ # the commit command within an active transaction or it may repeat the
324
+ # transaction and invoke the block again, depending on the error
325
+ # encountered if any. Note also that the retries may be executed against
326
+ # different servers.
327
+ #
328
+ # Transactions cannot be nested - InvalidTransactionOperation will be raised
329
+ # if this method is called when the session already has an active transaction.
330
+ #
331
+ # Exceptions raised by the block which are not derived from Mongo::Error
332
+ # stop processing, abort the transaction and are propagated out of
333
+ # with_transaction. Exceptions derived from Mongo::Error may be
334
+ # handled by with_transaction, resulting in retries of the process.
335
+ #
336
+ # Currently, with_transaction will retry commits and block invocations
337
+ # until at least 120 seconds have passed since with_transaction started
338
+ # executing. This timeout is not configurable and may change in a future
339
+ # driver version.
340
+ #
341
+ # @note with_transaction contains a loop, therefore the if with_transaction
342
+ # itself is placed in a loop, its block should not call next or break to
343
+ # control the outer loop because this will instead affect the loop in
344
+ # with_transaction. The driver will warn and abort the transaction
345
+ # if it detects this situation.
346
+ #
347
+ # @example Execute a statement in a transaction
348
+ # session.with_transaction(write_concern: {w: :majority}) do
349
+ # collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
350
+ # session: session)
351
+ #
352
+ # end
353
+ #
354
+ # @example Execute a statement in a transaction, limiting total time consumed
355
+ # Timeout.timeout(5) do
356
+ # session.with_transaction(write_concern: {w: :majority}) do
357
+ # collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
358
+ # session: session)
359
+ #
360
+ # end
361
+ # end
362
+ #
363
+ # @param [ Hash ] options The options for the transaction being started.
364
+ # These are the same options that start_transaction accepts.
365
+ #
366
+ # @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
367
+ # progress or if the write concern is unacknowledged.
368
+ #
369
+ # @since 2.7.0
370
+ def with_transaction(options=nil)
371
+ # Non-configurable 120 second timeout for the entire operation
372
+ deadline = Utils.monotonic_time + 120
373
+ transaction_in_progress = false
374
+ loop do
375
+ commit_options = {}
376
+ if options
377
+ commit_options[:write_concern] = options[:write_concern]
378
+ end
379
+ start_transaction(options)
380
+ transaction_in_progress = true
381
+ begin
382
+ rv = yield self
383
+ rescue Exception => e
384
+ if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
385
+ log_warn("Aborting transaction due to #{e.class}: #{e}")
386
+ abort_transaction
387
+ transaction_in_progress = false
388
+ end
389
+
390
+ if Utils.monotonic_time >= deadline
391
+ transaction_in_progress = false
392
+ raise
393
+ end
394
+
395
+ if e.is_a?(Mongo::Error) && e.label?('TransientTransactionError')
396
+ next
397
+ end
398
+
399
+ raise
400
+ else
401
+ if within_states?(TRANSACTION_ABORTED_STATE, NO_TRANSACTION_STATE, TRANSACTION_COMMITTED_STATE)
402
+ transaction_in_progress = false
403
+ return rv
404
+ end
405
+
406
+ begin
407
+ commit_transaction(commit_options)
408
+ transaction_in_progress = false
409
+ return rv
410
+ rescue Mongo::Error => e
411
+ if e.label?('UnknownTransactionCommitResult')
412
+ if Utils.monotonic_time >= deadline ||
413
+ e.is_a?(Error::OperationFailure) && e.max_time_ms_expired?
414
+ then
415
+ transaction_in_progress = false
416
+ raise
417
+ end
418
+ wc_options = case v = commit_options[:write_concern]
419
+ when WriteConcern::Base
420
+ v.options
421
+ when nil
422
+ {}
423
+ else
424
+ v
425
+ end
426
+ commit_options[:write_concern] = wc_options.merge(w: :majority)
427
+ retry
428
+ elsif e.label?('TransientTransactionError')
429
+ if Utils.monotonic_time >= deadline
430
+ transaction_in_progress = false
431
+ raise
432
+ end
433
+ next
434
+ else
435
+ transaction_in_progress = false
436
+ raise
437
+ end
438
+ rescue Error::AuthError
439
+ transaction_in_progress = false
440
+ raise
441
+ end
442
+ end
443
+ end
444
+
445
+ # No official return value, but return true so that in interactive
446
+ # use the method hints that it succeeded.
447
+ true
448
+ ensure
449
+ if transaction_in_progress
450
+ log_warn('with_transaction callback broke out of with_transaction loop, aborting transaction')
451
+ begin
452
+ abort_transaction
453
+ rescue Error::OperationFailure, Error::InvalidTransactionOperation
454
+ end
455
+ end
456
+ end
457
+
458
+ # Places subsequent operations in this session into a new transaction.
459
+ #
460
+ # Note that the transaction will not be started on the server until an
461
+ # operation is performed after start_transaction is called.
462
+ #
463
+ # @example Start a new transaction
464
+ # session.start_transaction(options)
465
+ #
466
+ # @param [ Hash ] options The options for the transaction being started.
467
+ #
468
+ # @option options [ Integer ] :max_commit_time_ms The maximum amount of
469
+ # time to allow a single commitTransaction command to run, in milliseconds.
470
+ # @option options [ Hash ] read_concern The read concern options hash,
471
+ # with the following optional keys:
472
+ # - *:level* -- the read preference level as a symbol; valid values
473
+ # are *:local*, *:majority*, and *:snapshot*
474
+ # @option options [ Hash ] :write_concern The write concern options. Can be :w =>
475
+ # Integer|String, :fsync => Boolean, :j => Boolean.
476
+ # @option options [ Hash ] :read The read preference options. The hash may have the following
477
+ # items:
478
+ # - *:mode* -- read preference specified as a symbol; the only valid value is
479
+ # *:primary*.
480
+ #
481
+ # @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
482
+ # progress or if the write concern is unacknowledged.
483
+ #
484
+ # @since 2.6.0
485
+ def start_transaction(options = nil)
486
+ if options
487
+ Lint.validate_read_concern_option(options[:read_concern])
488
+
489
+ =begin
490
+ # It would be handy to detect invalid read preferences here, but
491
+ # some of the spec tests require later detection of invalid read prefs.
492
+ # Maybe we can do this when lint mode is on.
493
+ mode = options[:read] && options[:read][:mode].to_s
494
+ if mode && mode != 'primary'
495
+ raise Mongo::Error::InvalidTransactionOperation.new(
496
+ "read preference in a transaction must be primary (requested: #{mode})"
497
+ )
498
+ end
499
+ =end
500
+ end
501
+
502
+ check_if_ended!
503
+
504
+ if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
505
+ raise Mongo::Error::InvalidTransactionOperation.new(
506
+ Mongo::Error::InvalidTransactionOperation::TRANSACTION_ALREADY_IN_PROGRESS)
507
+ end
508
+
509
+ unpin
510
+
511
+ next_txn_num
512
+ @txn_options = (@options[:default_transaction_options] || {}).merge(options || {})
513
+
514
+ if txn_write_concern && !WriteConcern.get(txn_write_concern).acknowledged?
515
+ raise Mongo::Error::InvalidTransactionOperation.new(
516
+ Mongo::Error::InvalidTransactionOperation::UNACKNOWLEDGED_WRITE_CONCERN)
517
+ end
518
+
519
+ @state = STARTING_TRANSACTION_STATE
520
+ @already_committed = false
521
+
522
+ # This method has no explicit return value.
523
+ # We could return nil here but true indicates to the user that the
524
+ # operation succeeded. This is intended for interactive use.
525
+ # Note that the return value is not documented.
526
+ true
527
+ end
528
+
529
+ # Commit the currently active transaction on the session.
530
+ #
531
+ # @example Commits the transaction.
532
+ # session.commit_transaction
533
+ #
534
+ # @option options :write_concern [ nil | WriteConcern::Base ] The write
535
+ # concern to use for this operation.
536
+ #
537
+ # @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
538
+ #
539
+ # @since 2.6.0
540
+ def commit_transaction(options=nil)
541
+ QueryCache.clear
542
+ check_if_ended!
543
+ check_if_no_transaction!
544
+
545
+ if within_states?(TRANSACTION_ABORTED_STATE)
546
+ raise Mongo::Error::InvalidTransactionOperation.new(
547
+ Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
548
+ :abortTransaction, :commitTransaction))
549
+ end
550
+
551
+ options ||= {}
552
+
553
+ begin
554
+ # If commitTransaction is called twice, we need to run the same commit
555
+ # operation again, so we revert the session to the previous state.
556
+ if within_states?(TRANSACTION_COMMITTED_STATE)
557
+ @state = @last_commit_skipped ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGRESS_STATE
558
+ @already_committed = true
559
+ end
560
+
561
+ if starting_transaction?
562
+ @last_commit_skipped = true
563
+ else
564
+ @last_commit_skipped = false
565
+ @committing_transaction = true
566
+
567
+ write_concern = options[:write_concern] || txn_options[:write_concern]
568
+ if write_concern && !write_concern.is_a?(WriteConcern::Base)
569
+ write_concern = WriteConcern.get(write_concern)
570
+ end
571
+ write_with_retry(self, write_concern, true) do |server, txn_num, is_retry|
572
+ if is_retry
573
+ if write_concern
574
+ wco = write_concern.options.merge(w: :majority)
575
+ wco[:wtimeout] ||= 10000
576
+ write_concern = WriteConcern.get(wco)
577
+ else
578
+ write_concern = WriteConcern.get(w: :majority, wtimeout: 10000)
579
+ end
580
+ end
581
+ spec = {
582
+ selector: { commitTransaction: 1 },
583
+ db_name: 'admin',
584
+ session: self,
585
+ txn_num: txn_num,
586
+ write_concern: write_concern,
587
+ }
588
+ Operation::Command.new(spec).execute(server, context: Operation::Context.new(client: @client, session: self))
589
+ end
590
+ end
591
+ ensure
592
+ @state = TRANSACTION_COMMITTED_STATE
593
+ @committing_transaction = false
594
+ end
595
+
596
+ # No official return value, but return true so that in interactive
597
+ # use the method hints that it succeeded.
598
+ true
599
+ end
600
+
601
+ # Abort the currently active transaction without making any changes to the database.
602
+ #
603
+ # @example Abort the transaction.
604
+ # session.abort_transaction
605
+ #
606
+ # @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
607
+ #
608
+ # @since 2.6.0
609
+ def abort_transaction
610
+ QueryCache.clear
611
+
612
+ check_if_ended!
613
+ check_if_no_transaction!
614
+
615
+ if within_states?(TRANSACTION_COMMITTED_STATE)
616
+ raise Mongo::Error::InvalidTransactionOperation.new(
617
+ Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
618
+ :commitTransaction, :abortTransaction))
619
+ end
620
+
621
+ if within_states?(TRANSACTION_ABORTED_STATE)
622
+ raise Mongo::Error::InvalidTransactionOperation.new(
623
+ Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
624
+ end
625
+
626
+ begin
627
+ unless starting_transaction?
628
+ @aborting_transaction = true
629
+ write_with_retry(self, txn_options[:write_concern], true) do |server, txn_num|
630
+ begin
631
+ Operation::Command.new(
632
+ selector: { abortTransaction: 1 },
633
+ db_name: 'admin',
634
+ session: self,
635
+ txn_num: txn_num
636
+ ).execute(server, context: Operation::Context.new(client: @client, session: self))
637
+ ensure
638
+ unpin
639
+ end
640
+ end
641
+ end
642
+
643
+ @state = TRANSACTION_ABORTED_STATE
644
+ rescue Mongo::Error::InvalidTransactionOperation
645
+ raise
646
+ rescue Mongo::Error
647
+ @state = TRANSACTION_ABORTED_STATE
648
+ rescue Exception
649
+ @state = TRANSACTION_ABORTED_STATE
650
+ raise
651
+ ensure
652
+ @aborting_transaction = false
653
+ end
654
+
655
+ # No official return value, but return true so that in interactive
656
+ # use the method hints that it succeeded.
657
+ true
658
+ end
659
+
660
+ # @api private
661
+ def starting_transaction?
662
+ within_states?(STARTING_TRANSACTION_STATE)
663
+ end
664
+
665
+ # Whether or not the session is currently in a transaction.
666
+ #
667
+ # @example Is the session in a transaction?
668
+ # session.in_transaction?
669
+ #
670
+ # @return [ true | false ] Whether or not the session in a transaction.
671
+ #
672
+ # @since 2.6.0
673
+ def in_transaction?
674
+ within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
675
+ end
676
+
677
+ # @return [ true | false ] Whether the session is currently committing a
678
+ # transaction.
679
+ #
680
+ # @api private
681
+ def committing_transaction?
682
+ !!@committing_transaction
683
+ end
684
+
685
+ # @return [ true | false ] Whether the session is currently aborting a
686
+ # transaction.
687
+ #
688
+ # @api private
689
+ def aborting_transaction?
690
+ !!@aborting_transaction
691
+ end
692
+
693
+ # Pins this session to the specified server, which should be a mongos.
694
+ #
695
+ # @param [ Server ] server The server to pin this session to.
696
+ #
697
+ # @api private
698
+ def pin(server)
699
+ if server.nil?
700
+ raise ArgumentError, 'Cannot pin to a nil server'
701
+ end
702
+ if Lint.enabled?
703
+ unless server.mongos?
704
+ raise Error::LintError, "Attempted to pin the session to server #{server.summary} which is not a mongos"
705
+ end
706
+ end
707
+ @pinned_server = server
708
+ end
709
+
710
+ # Unpins this session from the pinned server, if the session was pinned.
711
+ #
712
+ # @api private
713
+ def unpin
714
+ @pinned_server = nil
715
+ end
716
+
717
+ # Unpins this session from the pinned server, if the session was pinned
718
+ # and the specified exception instance and the session's transaction state
719
+ # require it to be unpinned.
720
+ #
721
+ # The exception instance should already have all of the labels set on it
722
+ # (both client- and server-side generated ones).
723
+ #
724
+ # @param [ Error ] error The exception instance to process.
725
+ #
726
+ # @api private
727
+ def unpin_maybe(error)
728
+ if !within_states?(Session::NO_TRANSACTION_STATE) &&
729
+ error.label?('TransientTransactionError')
730
+ then
731
+ unpin
732
+ end
733
+
734
+ if committing_transaction? &&
735
+ error.label?('UnknownTransactionCommitResult')
736
+ then
737
+ unpin
738
+ end
739
+ end
740
+
741
+ # Add the autocommit field to a command document if applicable.
742
+ #
743
+ # @example
744
+ # session.add_autocommit!(cmd)
745
+ #
746
+ # @return [ Hash, BSON::Document ] The command document.
747
+ #
748
+ # @since 2.6.0
749
+ # @api private
750
+ def add_autocommit!(command)
751
+ command.tap do |c|
752
+ c[:autocommit] = false if in_transaction?
753
+ end
754
+ end
755
+
756
+ # Add the startTransaction field to a command document if applicable.
757
+ #
758
+ # @example
759
+ # session.add_start_transaction!(cmd)
760
+ #
761
+ # @return [ Hash, BSON::Document ] The command document.
762
+ #
763
+ # @since 2.6.0
764
+ # @api private
765
+ def add_start_transaction!(command)
766
+ command.tap do |c|
767
+ if starting_transaction?
768
+ c[:startTransaction] = true
769
+ end
770
+ end
771
+ end
772
+
773
+ # Add the transaction number to a command document if applicable.
774
+ #
775
+ # @example
776
+ # session.add_txn_num!(cmd)
777
+ #
778
+ # @return [ Hash, BSON::Document ] The command document.
779
+ #
780
+ # @since 2.6.0
781
+ # @api private
782
+ def add_txn_num!(command)
783
+ command.tap do |c|
784
+ c[:txnNumber] = BSON::Int64.new(@server_session.txn_num) if in_transaction?
785
+ end
786
+ end
787
+
788
+ # Add the transactions options if applicable.
789
+ #
790
+ # @example
791
+ # session.add_txn_opts!(cmd)
792
+ #
793
+ # @return [ Hash, BSON::Document ] The command document.
794
+ #
795
+ # @since 2.6.0
796
+ # @api private
797
+ def add_txn_opts!(command, read)
798
+ command.tap do |c|
799
+ # The read concern should be added to any command that starts a transaction.
800
+ if starting_transaction?
801
+ # https://jira.mongodb.org/browse/SPEC-1161: transaction's
802
+ # read concern overrides collection/database/client read concerns,
803
+ # even if transaction's read concern is not set.
804
+ # Read concern here is the one sent to the server and may
805
+ # include afterClusterTime.
806
+ if rc = c[:readConcern]
807
+ rc = rc.dup
808
+ rc.delete(:level)
809
+ end
810
+ if txn_read_concern
811
+ if rc
812
+ rc.update(txn_read_concern)
813
+ else
814
+ rc = txn_read_concern.dup
815
+ end
816
+ end
817
+ if rc.nil? || rc.empty?
818
+ c.delete(:readConcern)
819
+ else
820
+ c[:readConcern ] = Options::Mapper.transform_values_to_strings(rc)
821
+ end
822
+ end
823
+
824
+ # We need to send the read concern level as a string rather than a symbol.
825
+ if c[:readConcern]
826
+ c[:readConcern] = Options::Mapper.transform_values_to_strings(c[:readConcern])
827
+ end
828
+
829
+ if c[:commitTransaction]
830
+ if max_time_ms = txn_options[:max_commit_time_ms]
831
+ c[:maxTimeMS] = max_time_ms
832
+ end
833
+ end
834
+
835
+ # The write concern should be added to any abortTransaction or commitTransaction command.
836
+ if (c[:abortTransaction] || c[:commitTransaction])
837
+ if @already_committed
838
+ wc = BSON::Document.new(c[:writeConcern] || txn_write_concern || {})
839
+ wc.merge!(w: :majority)
840
+ wc[:wtimeout] ||= 10000
841
+ c[:writeConcern] = wc
842
+ elsif txn_write_concern
843
+ c[:writeConcern] ||= txn_write_concern
844
+ end
845
+ end
846
+
847
+ # A non-numeric write concern w value needs to be sent as a string rather than a symbol.
848
+ if c[:writeConcern] && c[:writeConcern][:w] && c[:writeConcern][:w].is_a?(Symbol)
849
+ c[:writeConcern][:w] = c[:writeConcern][:w].to_s
850
+ end
851
+ end
852
+ end
853
+
854
+ # Remove the read concern and/or write concern from the command if not applicable.
855
+ #
856
+ # @example
857
+ # session.suppress_read_write_concern!(cmd)
858
+ #
859
+ # @return [ Hash, BSON::Document ] The command document.
860
+ #
861
+ # @since 2.6.0
862
+ # @api private
863
+ def suppress_read_write_concern!(command)
864
+ command.tap do |c|
865
+ next unless in_transaction?
866
+
867
+ c.delete(:readConcern) unless starting_transaction?
868
+ c.delete(:writeConcern) unless c[:commitTransaction] || c[:abortTransaction]
869
+ end
870
+ end
871
+
872
+ # Ensure that the read preference of a command primary.
873
+ #
874
+ # @example
875
+ # session.validate_read_preference!(command)
876
+ #
877
+ # @raise [ Mongo::Error::InvalidTransactionOperation ] If the read preference of the command is
878
+ # not primary.
879
+ #
880
+ # @since 2.6.0
881
+ # @api private
882
+ def validate_read_preference!(command)
883
+ return unless in_transaction?
884
+ return unless command['$readPreference']
885
+
886
+ mode = command['$readPreference']['mode'] || command['$readPreference'][:mode]
887
+
888
+ if mode && mode != 'primary'
889
+ raise Mongo::Error::InvalidTransactionOperation.new(
890
+ "read preference in a transaction must be primary (requested: #{mode})"
891
+ )
892
+ end
893
+ end
894
+
895
+ # Update the state of the session due to a (non-commit and non-abort) operation being run.
896
+ #
897
+ # @since 2.6.0
898
+ # @api private
899
+ def update_state!
900
+ case @state
901
+ when STARTING_TRANSACTION_STATE
902
+ @state = TRANSACTION_IN_PROGRESS_STATE
903
+ when TRANSACTION_COMMITTED_STATE, TRANSACTION_ABORTED_STATE
904
+ @state = NO_TRANSACTION_STATE
905
+ end
906
+ end
907
+
908
+ # Validate the session for use by the specified client.
909
+ #
910
+ # The session must not be ended and must have been created by a client
911
+ # with the same cluster as the client that the session is to be used with.
912
+ #
913
+ # @param [ Client ] client The client the session is to be used with.
914
+ #
915
+ # @return [ Session ] self, if the session is valid.
916
+ #
917
+ # @raise [ Mongo::Error::InvalidSession ] Exception raised if the session is not valid.
918
+ #
919
+ # @since 2.5.0
920
+ # @api private
921
+ def validate!(client)
922
+ check_matching_cluster!(client)
923
+ check_if_ended!
924
+ self
925
+ end
926
+
927
+ # Process a response from the server that used this session.
928
+ #
929
+ # @example Process a response from the server.
930
+ # session.process(result)
931
+ #
932
+ # @param [ Operation::Result ] result The result from the operation.
933
+ #
934
+ # @return [ Operation::Result ] The result.
935
+ #
936
+ # @since 2.5.0
937
+ # @api private
938
+ def process(result)
939
+ unless implicit?
940
+ set_operation_time(result)
941
+ if cluster_time_doc = result.cluster_time
942
+ advance_cluster_time(cluster_time_doc)
943
+ end
944
+ end
945
+ @server_session.set_last_use!
946
+
947
+ if doc = result.reply && result.reply.documents.first
948
+ if doc[:recoveryToken]
949
+ self.recovery_token = doc[:recoveryToken]
950
+ end
951
+ end
952
+
953
+ result
954
+ end
955
+
956
+ # Advance the cached operation time for this session.
957
+ #
958
+ # @example Advance the operation time.
959
+ # session.advance_operation_time(timestamp)
960
+ #
961
+ # @param [ BSON::Timestamp ] new_operation_time The new operation time.
962
+ #
963
+ # @return [ BSON::Timestamp ] The max operation time, considering the current and new times.
964
+ #
965
+ # @since 2.5.0
966
+ def advance_operation_time(new_operation_time)
967
+ if @operation_time
968
+ @operation_time = [ @operation_time, new_operation_time ].max
969
+ else
970
+ @operation_time = new_operation_time
971
+ end
972
+ end
973
+
974
+ # Increment and return the next transaction number.
975
+ #
976
+ # @example Get the next transaction number.
977
+ # session.next_txn_num
978
+ #
979
+ # @return [ Integer ] The next transaction number.
980
+ #
981
+ # @since 2.5.0
982
+ # @api private
983
+ def next_txn_num
984
+ if ended?
985
+ raise Error::SessionEnded
986
+ end
987
+
988
+ @server_session.next_txn_num
989
+ end
990
+
991
+ # Get the current transaction number.
992
+ #
993
+ # @example Get the current transaction number.
994
+ # session.txn_num
995
+ #
996
+ # @return [ Integer ] The current transaction number.
997
+ #
998
+ # @since 2.6.0
999
+ def txn_num
1000
+ if ended?
1001
+ raise Error::SessionEnded
1002
+ end
1003
+
1004
+ @server_session.txn_num
1005
+ end
1006
+
1007
+ private
1008
+
1009
+ # Get the read concern the session will use when starting a transaction.
1010
+ #
1011
+ # This is a driver style hash with underscore keys.
1012
+ #
1013
+ # @example Get the session's transaction read concern.
1014
+ # session.txn_read_concern
1015
+ #
1016
+ # @return [ Hash ] The read concern used for starting transactions.
1017
+ #
1018
+ # @since 2.9.0
1019
+ def txn_read_concern
1020
+ # Read concern is inherited from client but not db or collection.
1021
+ txn_options[:read_concern] || @client.read_concern
1022
+ end
1023
+
1024
+ def within_states?(*states)
1025
+ states.include?(@state)
1026
+ end
1027
+
1028
+ def check_if_no_transaction!
1029
+ return unless within_states?(NO_TRANSACTION_STATE)
1030
+
1031
+ raise Mongo::Error::InvalidTransactionOperation.new(
1032
+ Mongo::Error::InvalidTransactionOperation::NO_TRANSACTION_STARTED)
1033
+ end
1034
+
1035
+ def txn_write_concern
1036
+ txn_options[:write_concern] ||
1037
+ (@client.write_concern && @client.write_concern.options)
1038
+ end
1039
+
1040
+ # Returns causal consistency document if the last operation time is
1041
+ # known and causal consistency is enabled, otherwise returns nil.
1042
+ def causal_consistency_doc
1043
+ if operation_time && causal_consistency?
1044
+ {:afterClusterTime => operation_time}
1045
+ else
1046
+ nil
1047
+ end
1048
+ end
1049
+
1050
+ def causal_consistency?
1051
+ @causal_consistency ||= (if @options.key?(:causal_consistency)
1052
+ !!@options[:causal_consistency]
1053
+ else
1054
+ true
1055
+ end)
1056
+ end
1057
+
1058
+ def set_operation_time(result)
1059
+ if result && result.operation_time
1060
+ @operation_time = result.operation_time
1061
+ end
1062
+ end
1063
+
1064
+ def check_if_ended!
1065
+ raise Mongo::Error::InvalidSession.new(SESSION_ENDED_ERROR_MSG) if ended?
1066
+ end
1067
+
1068
+ def check_matching_cluster!(client)
1069
+ if @client.cluster != client.cluster
1070
+ raise Mongo::Error::InvalidSession.new(MISMATCHED_CLUSTER_ERROR_MSG)
1071
+ end
1072
+ end
1073
+ end
1074
+ end