mongo 2.15.0.alpha → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1198) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +1 -1
  4. data/lib/mongo/active_support.rb +3 -0
  5. data/lib/mongo/address/ipv4.rb +3 -0
  6. data/lib/mongo/address/ipv6.rb +3 -0
  7. data/lib/mongo/address/unix.rb +3 -0
  8. data/lib/mongo/address/validator.rb +3 -0
  9. data/lib/mongo/address.rb +3 -0
  10. data/lib/mongo/auth/aws/conversation.rb +3 -0
  11. data/lib/mongo/auth/aws/credentials_retriever.rb +3 -0
  12. data/lib/mongo/auth/aws/request.rb +3 -0
  13. data/lib/mongo/auth/aws.rb +3 -0
  14. data/lib/mongo/auth/base.rb +4 -1
  15. data/lib/mongo/auth/conversation_base.rb +3 -0
  16. data/lib/mongo/auth/cr/conversation.rb +3 -0
  17. data/lib/mongo/auth/cr.rb +3 -0
  18. data/lib/mongo/auth/credential_cache.rb +3 -0
  19. data/lib/mongo/auth/gssapi/conversation.rb +3 -0
  20. data/lib/mongo/auth/gssapi.rb +3 -0
  21. data/lib/mongo/auth/ldap/conversation.rb +3 -0
  22. data/lib/mongo/auth/ldap.rb +3 -0
  23. data/lib/mongo/auth/roles.rb +3 -0
  24. data/lib/mongo/auth/sasl_conversation_base.rb +3 -0
  25. data/lib/mongo/auth/scram/conversation.rb +3 -0
  26. data/lib/mongo/auth/scram.rb +5 -2
  27. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  28. data/lib/mongo/auth/scram256.rb +3 -0
  29. data/lib/mongo/auth/scram_conversation_base.rb +3 -0
  30. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  31. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  32. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  33. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -1
  34. data/lib/mongo/auth/stringprep.rb +4 -1
  35. data/lib/mongo/auth/user/view.rb +3 -0
  36. data/lib/mongo/auth/user.rb +3 -0
  37. data/lib/mongo/auth/x509/conversation.rb +3 -0
  38. data/lib/mongo/auth/x509.rb +3 -0
  39. data/lib/mongo/auth.rb +4 -1
  40. data/lib/mongo/background_thread.rb +5 -2
  41. data/lib/mongo/bson.rb +3 -0
  42. data/lib/mongo/bulk_write/combineable.rb +3 -0
  43. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  44. data/lib/mongo/bulk_write/result.rb +3 -0
  45. data/lib/mongo/bulk_write/result_combiner.rb +3 -0
  46. data/lib/mongo/bulk_write/transformable.rb +3 -0
  47. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  48. data/lib/mongo/bulk_write/validatable.rb +3 -0
  49. data/lib/mongo/bulk_write.rb +5 -2
  50. data/lib/mongo/caching_cursor.rb +3 -0
  51. data/lib/mongo/client.rb +49 -6
  52. data/lib/mongo/client_encryption.rb +3 -0
  53. data/lib/mongo/cluster/periodic_executor.rb +7 -3
  54. data/lib/mongo/cluster/reapers/cursor_reaper.rb +79 -43
  55. data/lib/mongo/cluster/reapers/socket_reaper.rb +3 -0
  56. data/lib/mongo/cluster/sdam_flow.rb +12 -3
  57. data/lib/mongo/cluster/topology/base.rb +16 -9
  58. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  59. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  60. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  61. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  62. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  63. data/lib/mongo/cluster/topology/single.rb +3 -0
  64. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  65. data/lib/mongo/cluster/topology.rb +31 -8
  66. data/lib/mongo/cluster.rb +142 -54
  67. data/lib/mongo/cluster_time.rb +3 -0
  68. data/lib/mongo/collection/view/aggregation.rb +8 -10
  69. data/lib/mongo/collection/view/builder/aggregation.rb +9 -5
  70. data/lib/mongo/collection/view/builder/map_reduce.rb +15 -49
  71. data/lib/mongo/collection/view/builder.rb +3 -4
  72. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  73. data/lib/mongo/collection/view/change_stream.rb +4 -1
  74. data/lib/mongo/collection/view/explainable.rb +3 -0
  75. data/lib/mongo/collection/view/immutable.rb +3 -0
  76. data/lib/mongo/collection/view/iterable.rb +61 -24
  77. data/lib/mongo/collection/view/map_reduce.rb +42 -15
  78. data/lib/mongo/collection/view/readable.rb +71 -53
  79. data/lib/mongo/collection/view/writable.rb +181 -175
  80. data/lib/mongo/collection/view.rb +18 -21
  81. data/lib/mongo/collection.rb +48 -24
  82. data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
  83. data/lib/mongo/crypt/auto_encrypter.rb +4 -1
  84. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  85. data/lib/mongo/crypt/binary.rb +3 -0
  86. data/lib/mongo/crypt/binding.rb +4 -1
  87. data/lib/mongo/crypt/context.rb +3 -0
  88. data/lib/mongo/crypt/data_key_context.rb +3 -0
  89. data/lib/mongo/crypt/encryption_io.rb +3 -0
  90. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  91. data/lib/mongo/crypt/explicit_encrypter.rb +3 -0
  92. data/lib/mongo/crypt/explicit_encryption_context.rb +3 -0
  93. data/lib/mongo/crypt/handle.rb +3 -0
  94. data/lib/mongo/crypt/hooks.rb +3 -0
  95. data/lib/mongo/crypt/kms_context.rb +3 -0
  96. data/lib/mongo/crypt/status.rb +3 -0
  97. data/lib/mongo/crypt.rb +3 -0
  98. data/lib/mongo/cursor/kill_spec.rb +38 -0
  99. data/lib/mongo/cursor.rb +76 -31
  100. data/lib/mongo/database/view.rb +4 -1
  101. data/lib/mongo/database.rb +4 -1
  102. data/lib/mongo/dbref.rb +3 -0
  103. data/lib/mongo/distinguishing_semaphore.rb +3 -0
  104. data/lib/mongo/error/auth_error.rb +3 -0
  105. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  106. data/lib/mongo/error/bulk_write_error.rb +3 -0
  107. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  108. data/lib/mongo/error/closed_stream.rb +3 -0
  109. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  110. data/lib/mongo/error/connection_perished.rb +3 -0
  111. data/lib/mongo/error/credential_check_error.rb +3 -0
  112. data/lib/mongo/error/crypt_error.rb +3 -0
  113. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  114. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  115. data/lib/mongo/error/file_not_found.rb +3 -0
  116. data/lib/mongo/error/handshake_error.rb +3 -0
  117. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  118. data/lib/mongo/error/internal_driver_error.rb +3 -0
  119. data/lib/mongo/error/invalid_address.rb +3 -0
  120. data/lib/mongo/error/invalid_application_name.rb +3 -0
  121. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  122. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  123. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  124. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  125. data/lib/mongo/error/invalid_database_name.rb +3 -0
  126. data/lib/mongo/error/invalid_document.rb +3 -0
  127. data/lib/mongo/error/invalid_file.rb +3 -0
  128. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  129. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  130. data/lib/mongo/error/invalid_nonce.rb +3 -0
  131. data/lib/mongo/error/invalid_read_concern.rb +3 -0
  132. data/lib/mongo/error/invalid_read_option.rb +3 -0
  133. data/lib/mongo/error/invalid_replacement_document.rb +3 -0
  134. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  135. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  136. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  137. data/lib/mongo/error/invalid_session.rb +3 -0
  138. data/lib/mongo/error/invalid_signature.rb +3 -0
  139. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  140. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  141. data/lib/mongo/error/invalid_update_document.rb +3 -0
  142. data/lib/mongo/error/invalid_uri.rb +3 -0
  143. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  144. data/lib/mongo/error/kms_error.rb +3 -0
  145. data/lib/mongo/error/lint_error.rb +3 -0
  146. data/lib/mongo/error/max_bson_size.rb +3 -0
  147. data/lib/mongo/error/max_message_size.rb +3 -0
  148. data/lib/mongo/error/mismatched_domain.rb +3 -0
  149. data/lib/mongo/error/missing_file_chunk.rb +3 -0
  150. data/lib/mongo/error/missing_password.rb +3 -0
  151. data/lib/mongo/error/missing_resume_token.rb +3 -0
  152. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  153. data/lib/mongo/error/missing_service_id.rb +26 -0
  154. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  155. data/lib/mongo/error/multi_index_drop.rb +3 -0
  156. data/lib/mongo/error/need_primary_server.rb +3 -0
  157. data/lib/mongo/error/no_server_available.rb +3 -0
  158. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  159. data/lib/mongo/error/no_srv_records.rb +3 -0
  160. data/lib/mongo/error/notable.rb +10 -0
  161. data/lib/mongo/error/operation_failure.rb +5 -2
  162. data/lib/mongo/error/parser.rb +4 -1
  163. data/lib/mongo/error/pool_closed_error.rb +3 -0
  164. data/lib/mongo/error/raise_original_error.rb +3 -0
  165. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  166. data/lib/mongo/error/server_api_conflict.rb +3 -0
  167. data/lib/mongo/error/server_api_not_supported.rb +3 -0
  168. data/lib/mongo/error/server_certificate_revoked.rb +3 -0
  169. data/lib/mongo/error/session_ended.rb +3 -0
  170. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  171. data/lib/mongo/error/socket_error.rb +3 -0
  172. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  173. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  174. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  175. data/lib/mongo/error/unexpected_response.rb +3 -0
  176. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  177. data/lib/mongo/error/unmet_dependency.rb +3 -0
  178. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  179. data/lib/mongo/error/unsupported_collation.rb +3 -0
  180. data/lib/mongo/error/unsupported_features.rb +3 -0
  181. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  182. data/lib/mongo/error/unsupported_option.rb +3 -0
  183. data/lib/mongo/error/write_retryable.rb +3 -0
  184. data/lib/mongo/error.rb +6 -0
  185. data/lib/mongo/event/base.rb +3 -0
  186. data/lib/mongo/event/listeners.rb +3 -0
  187. data/lib/mongo/event/publisher.rb +3 -0
  188. data/lib/mongo/event/subscriber.rb +3 -0
  189. data/lib/mongo/event.rb +3 -0
  190. data/lib/mongo/grid/file/chunk.rb +4 -1
  191. data/lib/mongo/grid/file/info.rb +3 -0
  192. data/lib/mongo/grid/file.rb +3 -0
  193. data/lib/mongo/grid/fs_bucket.rb +50 -10
  194. data/lib/mongo/grid/stream/read.rb +22 -7
  195. data/lib/mongo/grid/stream/write.rb +3 -0
  196. data/lib/mongo/grid/stream.rb +3 -0
  197. data/lib/mongo/grid.rb +3 -0
  198. data/lib/mongo/id.rb +10 -5
  199. data/lib/mongo/index/view.rb +25 -41
  200. data/lib/mongo/index.rb +3 -0
  201. data/lib/mongo/lint.rb +3 -0
  202. data/lib/mongo/loggable.rb +3 -0
  203. data/lib/mongo/logger.rb +3 -0
  204. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  205. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  206. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  207. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  208. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  209. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  210. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  211. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  212. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  213. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  214. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +10 -4
  215. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  216. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  217. data/lib/mongo/monitoring/event/cmap.rb +3 -0
  218. data/lib/mongo/monitoring/event/command_failed.rb +32 -5
  219. data/lib/mongo/monitoring/event/command_started.rb +22 -2
  220. data/lib/mongo/monitoring/event/command_succeeded.rb +29 -3
  221. data/lib/mongo/monitoring/event/secure.rb +39 -5
  222. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  223. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  224. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +6 -3
  225. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  226. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +5 -2
  227. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  228. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  229. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  230. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  231. data/lib/mongo/monitoring/event.rb +3 -0
  232. data/lib/mongo/monitoring/publishable.rb +34 -12
  233. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  234. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  235. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  236. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  237. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  238. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  239. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  240. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  241. data/lib/mongo/monitoring.rb +9 -6
  242. data/lib/mongo/operation/aggregate/command.rb +11 -0
  243. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  244. data/lib/mongo/operation/aggregate/result.rb +3 -0
  245. data/lib/mongo/operation/aggregate.rb +3 -0
  246. data/lib/mongo/operation/collections_info/command.rb +3 -0
  247. data/lib/mongo/operation/collections_info/result.rb +3 -0
  248. data/lib/mongo/operation/collections_info.rb +3 -0
  249. data/lib/mongo/operation/command/command.rb +3 -0
  250. data/lib/mongo/operation/command/op_msg.rb +3 -0
  251. data/lib/mongo/operation/command.rb +3 -0
  252. data/lib/mongo/operation/context.rb +22 -1
  253. data/lib/mongo/operation/count/command.rb +9 -0
  254. data/lib/mongo/operation/count/op_msg.rb +9 -0
  255. data/lib/mongo/operation/count.rb +3 -0
  256. data/lib/mongo/operation/create/command.rb +10 -1
  257. data/lib/mongo/operation/create/op_msg.rb +10 -0
  258. data/lib/mongo/operation/create.rb +3 -0
  259. data/lib/mongo/operation/create_index/command.rb +20 -1
  260. data/lib/mongo/operation/create_index/op_msg.rb +20 -4
  261. data/lib/mongo/operation/create_index.rb +3 -0
  262. data/lib/mongo/operation/create_user/command.rb +3 -0
  263. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  264. data/lib/mongo/operation/create_user.rb +3 -0
  265. data/lib/mongo/operation/delete/bulk_result.rb +3 -0
  266. data/lib/mongo/operation/delete/command.rb +9 -3
  267. data/lib/mongo/operation/delete/legacy.rb +12 -2
  268. data/lib/mongo/operation/delete/op_msg.rb +11 -1
  269. data/lib/mongo/operation/delete/result.rb +3 -0
  270. data/lib/mongo/operation/delete.rb +3 -0
  271. data/lib/mongo/operation/distinct/command.rb +9 -0
  272. data/lib/mongo/operation/distinct/op_msg.rb +10 -0
  273. data/lib/mongo/operation/distinct.rb +3 -0
  274. data/lib/mongo/operation/drop/command.rb +3 -0
  275. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  276. data/lib/mongo/operation/drop.rb +3 -0
  277. data/lib/mongo/operation/drop_database/command.rb +3 -0
  278. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  279. data/lib/mongo/operation/drop_database.rb +3 -0
  280. data/lib/mongo/operation/drop_index/command.rb +3 -0
  281. data/lib/mongo/operation/drop_index/op_msg.rb +3 -0
  282. data/lib/mongo/operation/drop_index.rb +3 -0
  283. data/lib/mongo/operation/explain/command.rb +16 -1
  284. data/lib/mongo/operation/explain/legacy.rb +15 -5
  285. data/lib/mongo/operation/explain/op_msg.rb +12 -1
  286. data/lib/mongo/operation/explain/result.rb +3 -0
  287. data/lib/mongo/operation/explain.rb +3 -0
  288. data/lib/mongo/operation/find/builder/command.rb +110 -0
  289. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +13 -14
  290. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  291. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +34 -25
  292. data/lib/mongo/{cursor → operation/find}/builder.rb +7 -4
  293. data/lib/mongo/operation/find/command.rb +12 -0
  294. data/lib/mongo/operation/find/legacy/result.rb +3 -0
  295. data/lib/mongo/operation/find/legacy.rb +13 -1
  296. data/lib/mongo/operation/find/op_msg.rb +15 -0
  297. data/lib/mongo/operation/find/result.rb +3 -0
  298. data/lib/mongo/operation/find.rb +4 -0
  299. data/lib/mongo/operation/get_more/command.rb +4 -0
  300. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  301. data/lib/mongo/operation/get_more/legacy.rb +3 -0
  302. data/lib/mongo/operation/get_more/op_msg.rb +4 -0
  303. data/lib/mongo/operation/get_more/result.rb +3 -0
  304. data/lib/mongo/operation/get_more.rb +4 -0
  305. data/lib/mongo/operation/indexes/command.rb +3 -0
  306. data/lib/mongo/operation/indexes/legacy.rb +3 -0
  307. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  308. data/lib/mongo/operation/indexes/result.rb +3 -0
  309. data/lib/mongo/operation/indexes.rb +3 -0
  310. data/lib/mongo/operation/insert/bulk_result.rb +3 -0
  311. data/lib/mongo/operation/insert/command.rb +3 -0
  312. data/lib/mongo/operation/insert/legacy.rb +3 -0
  313. data/lib/mongo/operation/insert/op_msg.rb +3 -0
  314. data/lib/mongo/operation/insert/result.rb +3 -0
  315. data/lib/mongo/operation/insert.rb +3 -0
  316. data/lib/mongo/operation/kill_cursors/command.rb +11 -0
  317. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  318. data/lib/mongo/operation/kill_cursors/legacy.rb +5 -1
  319. data/lib/mongo/operation/kill_cursors/op_msg.rb +13 -0
  320. data/lib/mongo/operation/kill_cursors.rb +4 -0
  321. data/lib/mongo/operation/list_collections/command.rb +3 -0
  322. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  323. data/lib/mongo/operation/list_collections/result.rb +3 -0
  324. data/lib/mongo/operation/list_collections.rb +3 -0
  325. data/lib/mongo/operation/map_reduce/command.rb +11 -0
  326. data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
  327. data/lib/mongo/operation/map_reduce/result.rb +3 -0
  328. data/lib/mongo/operation/map_reduce.rb +3 -0
  329. data/lib/mongo/operation/op_msg_base.rb +3 -0
  330. data/lib/mongo/operation/parallel_scan/command.rb +4 -2
  331. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  332. data/lib/mongo/operation/parallel_scan/result.rb +3 -0
  333. data/lib/mongo/operation/parallel_scan.rb +3 -0
  334. data/lib/mongo/operation/remove_user/command.rb +3 -0
  335. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  336. data/lib/mongo/operation/remove_user.rb +3 -0
  337. data/lib/mongo/operation/result.rb +3 -0
  338. data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -0
  339. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -0
  340. data/lib/mongo/operation/shared/executable.rb +19 -5
  341. data/lib/mongo/operation/shared/executable_no_validate.rb +3 -0
  342. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  343. data/lib/mongo/operation/shared/idable.rb +3 -0
  344. data/lib/mongo/operation/shared/limited.rb +3 -0
  345. data/lib/mongo/operation/shared/object_id_generator.rb +3 -0
  346. data/lib/mongo/operation/shared/op_msg_or_command.rb +3 -0
  347. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +3 -0
  348. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  349. data/lib/mongo/operation/shared/polymorphic_operation.rb +4 -1
  350. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  351. data/lib/mongo/operation/shared/read_preference_supported.rb +44 -37
  352. data/lib/mongo/operation/shared/response_handling.rb +4 -0
  353. data/lib/mongo/operation/shared/result/aggregatable.rb +3 -0
  354. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  355. data/lib/mongo/operation/shared/sessions_supported.rb +18 -14
  356. data/lib/mongo/operation/shared/specifiable.rb +14 -29
  357. data/lib/mongo/operation/shared/validatable.rb +87 -0
  358. data/lib/mongo/operation/shared/write.rb +4 -1
  359. data/lib/mongo/operation/shared/write_concern_supported.rb +3 -0
  360. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  361. data/lib/mongo/operation/update/command.rb +9 -3
  362. data/lib/mongo/operation/update/legacy/result.rb +3 -0
  363. data/lib/mongo/operation/update/legacy.rb +22 -11
  364. data/lib/mongo/operation/update/op_msg.rb +10 -4
  365. data/lib/mongo/operation/update/result.rb +3 -0
  366. data/lib/mongo/operation/update.rb +3 -0
  367. data/lib/mongo/operation/update_user/command.rb +3 -0
  368. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  369. data/lib/mongo/operation/update_user.rb +3 -0
  370. data/lib/mongo/operation/users_info/command.rb +3 -0
  371. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  372. data/lib/mongo/operation/users_info/result.rb +3 -0
  373. data/lib/mongo/operation/users_info.rb +3 -0
  374. data/lib/mongo/operation/write_command/command.rb +51 -0
  375. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  376. data/lib/mongo/operation/write_command.rb +32 -0
  377. data/lib/mongo/operation.rb +13 -0
  378. data/lib/mongo/options/mapper.rb +3 -0
  379. data/lib/mongo/options/redacted.rb +3 -0
  380. data/lib/mongo/options.rb +3 -0
  381. data/lib/mongo/protocol/bit_vector.rb +3 -0
  382. data/lib/mongo/protocol/compressed.rb +3 -0
  383. data/lib/mongo/protocol/delete.rb +3 -0
  384. data/lib/mongo/protocol/get_more.rb +3 -0
  385. data/lib/mongo/protocol/insert.rb +3 -0
  386. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  387. data/lib/mongo/protocol/message.rb +3 -0
  388. data/lib/mongo/protocol/msg.rb +8 -10
  389. data/lib/mongo/protocol/query.rb +53 -32
  390. data/lib/mongo/protocol/registry.rb +3 -0
  391. data/lib/mongo/protocol/reply.rb +3 -0
  392. data/lib/mongo/protocol/serializers.rb +3 -0
  393. data/lib/mongo/protocol/update.rb +3 -0
  394. data/lib/mongo/protocol.rb +3 -0
  395. data/lib/mongo/query_cache.rb +3 -0
  396. data/lib/mongo/retryable.rb +3 -0
  397. data/lib/mongo/semaphore.rb +3 -0
  398. data/lib/mongo/server/app_metadata.rb +40 -18
  399. data/lib/mongo/server/connection.rb +29 -4
  400. data/lib/mongo/server/connection_base.rb +34 -11
  401. data/lib/mongo/server/connection_common.rb +71 -1
  402. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  403. data/lib/mongo/server/connection_pool/populator.rb +3 -0
  404. data/lib/mongo/server/connection_pool.rb +105 -29
  405. data/lib/mongo/server/description/features.rb +22 -18
  406. data/lib/mongo/server/description/load_balancer.rb +33 -0
  407. data/lib/mongo/server/description.rb +108 -16
  408. data/lib/mongo/server/monitor/app_metadata.rb +3 -0
  409. data/lib/mongo/server/monitor/connection.rb +49 -39
  410. data/lib/mongo/server/monitor.rb +17 -22
  411. data/lib/mongo/server/pending_connection.rb +57 -42
  412. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  413. data/lib/mongo/server/push_monitor.rb +32 -21
  414. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  415. data/lib/mongo/server.rb +90 -26
  416. data/lib/mongo/server_selector/base.rb +11 -4
  417. data/lib/mongo/server_selector/nearest.rb +6 -4
  418. data/lib/mongo/server_selector/primary.rb +6 -4
  419. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  420. data/lib/mongo/server_selector/secondary.rb +6 -4
  421. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  422. data/lib/mongo/server_selector.rb +3 -0
  423. data/lib/mongo/session/server_session.rb +3 -0
  424. data/lib/mongo/session/session_pool.rb +14 -0
  425. data/lib/mongo/session.rb +38 -11
  426. data/lib/mongo/socket/ocsp_cache.rb +3 -0
  427. data/lib/mongo/socket/ocsp_verifier.rb +15 -38
  428. data/lib/mongo/socket/ssl.rb +3 -0
  429. data/lib/mongo/socket/tcp.rb +3 -0
  430. data/lib/mongo/socket/unix.rb +3 -0
  431. data/lib/mongo/socket.rb +8 -3
  432. data/lib/mongo/srv/monitor.rb +3 -0
  433. data/lib/mongo/srv/resolver.rb +3 -0
  434. data/lib/mongo/srv/result.rb +3 -0
  435. data/lib/mongo/srv.rb +3 -0
  436. data/lib/mongo/timeout.rb +3 -0
  437. data/lib/mongo/topology_version.rb +4 -1
  438. data/lib/mongo/uri/options_mapper.rb +4 -0
  439. data/lib/mongo/uri/srv_protocol.rb +9 -8
  440. data/lib/mongo/uri.rb +21 -0
  441. data/lib/mongo/utils.rb +23 -0
  442. data/lib/mongo/version.rb +4 -1
  443. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  444. data/lib/mongo/write_concern/base.rb +3 -0
  445. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  446. data/lib/mongo/write_concern.rb +3 -0
  447. data/lib/mongo.rb +3 -0
  448. data/mongo.gemspec +1 -1
  449. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  450. data/spec/atlas/operations_spec.rb +3 -0
  451. data/spec/integration/auth_spec.rb +34 -1
  452. data/spec/integration/awaited_ismaster_spec.rb +9 -6
  453. data/spec/integration/aws_auth_request_spec.rb +3 -0
  454. data/spec/integration/aws_credentials_retriever_spec.rb +3 -0
  455. data/spec/integration/bson_symbol_spec.rb +4 -1
  456. data/spec/integration/bulk_insert_spec.rb +3 -0
  457. data/spec/integration/bulk_write_spec.rb +4 -1
  458. data/spec/integration/change_stream_examples_spec.rb +3 -0
  459. data/spec/integration/change_stream_spec.rb +6 -3
  460. data/spec/integration/check_clean_slate_spec.rb +3 -0
  461. data/spec/integration/client_authentication_options_spec.rb +21 -8
  462. data/spec/integration/client_connectivity_spec.rb +4 -1
  463. data/spec/integration/client_construction_aws_auth_spec.rb +3 -0
  464. data/spec/integration/client_construction_spec.rb +57 -0
  465. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +4 -1
  466. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +4 -1
  467. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -0
  468. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  469. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +3 -0
  470. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +3 -0
  471. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +4 -1
  472. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +4 -1
  473. data/spec/integration/client_side_encryption/client_close_spec.rb +3 -0
  474. data/spec/integration/client_side_encryption/corpus_spec.rb +3 -0
  475. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -0
  476. data/spec/integration/client_side_encryption/data_key_spec.rb +4 -1
  477. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +3 -0
  478. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +3 -0
  479. data/spec/integration/client_side_encryption/views_spec.rb +3 -0
  480. data/spec/integration/client_spec.rb +7 -2
  481. data/spec/integration/client_update_spec.rb +3 -0
  482. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  483. data/spec/integration/command_monitoring_spec.rb +62 -24
  484. data/spec/integration/command_spec.rb +4 -1
  485. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  486. data/spec/integration/connection_pool_populator_spec.rb +3 -0
  487. data/spec/integration/connection_spec.rb +56 -36
  488. data/spec/integration/crud_spec.rb +205 -1
  489. data/spec/integration/cursor_pinning_spec.rb +121 -0
  490. data/spec/integration/cursor_reaping_spec.rb +11 -4
  491. data/spec/integration/docs_examples_spec.rb +3 -0
  492. data/spec/integration/error_detection_spec.rb +3 -0
  493. data/spec/integration/fork_reconnect_spec.rb +5 -6
  494. data/spec/integration/get_more_spec.rb +4 -1
  495. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  496. data/spec/integration/heartbeat_events_spec.rb +8 -5
  497. data/spec/integration/map_reduce_spec.rb +77 -0
  498. data/spec/integration/mmapv1_spec.rb +3 -0
  499. data/spec/integration/mongos_pinning_spec.rb +3 -0
  500. data/spec/integration/ocsp_connectivity_spec.rb +3 -0
  501. data/spec/integration/ocsp_verifier_cache_spec.rb +3 -0
  502. data/spec/integration/ocsp_verifier_spec.rb +16 -1
  503. data/spec/integration/operation_failure_code_spec.rb +3 -0
  504. data/spec/integration/query_cache_spec.rb +50 -2
  505. data/spec/integration/query_cache_transactions_spec.rb +4 -1
  506. data/spec/integration/read_concern_spec.rb +4 -1
  507. data/spec/integration/read_preference_spec.rb +4 -1
  508. data/spec/integration/reconnect_spec.rb +33 -12
  509. data/spec/integration/retryable_errors_spec.rb +4 -1
  510. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +4 -1
  511. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +4 -1
  512. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  513. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  514. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  515. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +3 -0
  516. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  517. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  518. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  519. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  520. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  521. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  522. data/spec/integration/sdam_error_handling_spec.rb +10 -5
  523. data/spec/integration/sdam_events_spec.rb +47 -25
  524. data/spec/integration/sdam_prose_spec.rb +5 -2
  525. data/spec/integration/secondary_reads_spec.rb +102 -0
  526. data/spec/integration/server_description_spec.rb +3 -0
  527. data/spec/integration/server_monitor_spec.rb +5 -1
  528. data/spec/integration/server_selection_spec.rb +3 -0
  529. data/spec/integration/server_selector_spec.rb +25 -5
  530. data/spec/integration/server_spec.rb +5 -0
  531. data/spec/integration/shell_examples_spec.rb +3 -0
  532. data/spec/integration/size_limit_spec.rb +3 -0
  533. data/spec/integration/snappy_compression_spec.rb +3 -0
  534. data/spec/integration/srv_monitoring_spec.rb +4 -1
  535. data/spec/integration/srv_spec.rb +3 -0
  536. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  537. data/spec/integration/step_down_spec.rb +4 -1
  538. data/spec/integration/time_zone_querying_spec.rb +3 -0
  539. data/spec/integration/transaction_pinning_spec.rb +120 -0
  540. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  541. data/spec/integration/transactions_examples_spec.rb +3 -0
  542. data/spec/integration/truncated_utf8_spec.rb +26 -0
  543. data/spec/integration/versioned_api_examples_spec.rb +114 -0
  544. data/spec/integration/x509_auth_spec.rb +5 -2
  545. data/spec/integration/zlib_compression_spec.rb +3 -0
  546. data/spec/integration/zstd_compression_spec.rb +3 -0
  547. data/spec/kerberos/kerberos_spec.rb +3 -0
  548. data/spec/lite_spec_helper.rb +5 -2
  549. data/spec/mongo/address/ipv4_spec.rb +3 -0
  550. data/spec/mongo/address/ipv6_spec.rb +3 -0
  551. data/spec/mongo/address/unix_spec.rb +4 -0
  552. data/spec/mongo/address/validator_spec.rb +3 -0
  553. data/spec/mongo/address_spec.rb +3 -0
  554. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  555. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  556. data/spec/mongo/auth/cr_spec.rb +5 -3
  557. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  558. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  559. data/spec/mongo/auth/ldap/conversation_spec.rb +3 -0
  560. data/spec/mongo/auth/ldap_spec.rb +5 -3
  561. data/spec/mongo/auth/scram/conversation_spec.rb +3 -0
  562. data/spec/mongo/auth/scram256/conversation_spec.rb +3 -0
  563. data/spec/mongo/auth/scram_negotiation_spec.rb +3 -0
  564. data/spec/mongo/auth/scram_spec.rb +5 -3
  565. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  566. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  567. data/spec/mongo/auth/user/view_spec.rb +4 -1
  568. data/spec/mongo/auth/user_spec.rb +3 -0
  569. data/spec/mongo/auth/x509/conversation_spec.rb +3 -0
  570. data/spec/mongo/auth/x509_spec.rb +5 -3
  571. data/spec/mongo/auth_spec.rb +3 -0
  572. data/spec/mongo/bson_spec.rb +3 -0
  573. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  574. data/spec/mongo/bulk_write/result_spec.rb +3 -0
  575. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  576. data/spec/mongo/bulk_write_spec.rb +6 -3
  577. data/spec/mongo/caching_cursor_spec.rb +3 -0
  578. data/spec/mongo/client_construction_spec.rb +269 -33
  579. data/spec/mongo/client_encryption_spec.rb +3 -0
  580. data/spec/mongo/client_spec.rb +9 -4
  581. data/spec/mongo/cluster/cursor_reaper_spec.rb +39 -21
  582. data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
  583. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  584. data/spec/mongo/cluster/topology/replica_set_spec.rb +12 -9
  585. data/spec/mongo/cluster/topology/sharded_spec.rb +5 -2
  586. data/spec/mongo/cluster/topology/single_spec.rb +5 -2
  587. data/spec/mongo/cluster/topology/unknown_spec.rb +3 -0
  588. data/spec/mongo/cluster/topology_spec.rb +3 -0
  589. data/spec/mongo/cluster_spec.rb +48 -3
  590. data/spec/mongo/cluster_time_spec.rb +3 -0
  591. data/spec/mongo/collection/view/aggregation_spec.rb +4 -1
  592. data/spec/mongo/collection/view/builder/find_command_spec.rb +7 -0
  593. data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
  594. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -2
  595. data/spec/mongo/collection/view/change_stream_spec.rb +16 -0
  596. data/spec/mongo/collection/view/explainable_spec.rb +3 -0
  597. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  598. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  599. data/spec/mongo/collection/view/map_reduce_spec.rb +4 -1
  600. data/spec/mongo/collection/view/readable_spec.rb +19 -0
  601. data/spec/mongo/collection/view/writable_spec.rb +3 -0
  602. data/spec/mongo/collection/view_spec.rb +3 -0
  603. data/spec/mongo/collection_crud_spec.rb +10 -2
  604. data/spec/mongo/collection_ddl_spec.rb +4 -1
  605. data/spec/mongo/collection_spec.rb +4 -1
  606. data/spec/mongo/crypt/auto_decryption_context_spec.rb +3 -0
  607. data/spec/mongo/crypt/auto_encrypter_spec.rb +3 -0
  608. data/spec/mongo/crypt/auto_encryption_context_spec.rb +3 -0
  609. data/spec/mongo/crypt/binary_spec.rb +3 -0
  610. data/spec/mongo/crypt/binding/binary_spec.rb +3 -0
  611. data/spec/mongo/crypt/binding/context_spec.rb +3 -0
  612. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -0
  613. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +3 -0
  614. data/spec/mongo/crypt/binding/status_spec.rb +3 -0
  615. data/spec/mongo/crypt/binding/version_spec.rb +3 -0
  616. data/spec/mongo/crypt/binding_unloaded_spec.rb +3 -0
  617. data/spec/mongo/crypt/data_key_context_spec.rb +3 -0
  618. data/spec/mongo/crypt/encryption_io_spec.rb +3 -0
  619. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +3 -0
  620. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +3 -0
  621. data/spec/mongo/crypt/handle_spec.rb +3 -0
  622. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  623. data/spec/mongo/crypt/status_spec.rb +3 -0
  624. data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -2
  625. data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -2
  626. data/spec/mongo/cursor_spec.rb +89 -12
  627. data/spec/mongo/database_spec.rb +24 -21
  628. data/spec/mongo/dbref_spec.rb +3 -0
  629. data/spec/mongo/distinguishing_semaphore_spec.rb +3 -0
  630. data/spec/mongo/error/bulk_write_error_spec.rb +3 -0
  631. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  632. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  633. data/spec/mongo/error/no_server_available_spec.rb +3 -0
  634. data/spec/mongo/error/notable_spec.rb +3 -0
  635. data/spec/mongo/error/operation_failure_heavy_spec.rb +4 -1
  636. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  637. data/spec/mongo/error/parser_spec.rb +3 -0
  638. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  639. data/spec/mongo/event/publisher_spec.rb +3 -0
  640. data/spec/mongo/event/subscriber_spec.rb +3 -0
  641. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  642. data/spec/mongo/grid/file/info_spec.rb +3 -0
  643. data/spec/mongo/grid/file_spec.rb +4 -1
  644. data/spec/mongo/grid/fs_bucket_spec.rb +40 -17
  645. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  646. data/spec/mongo/grid/stream/write_spec.rb +6 -9
  647. data/spec/mongo/grid/stream_spec.rb +4 -1
  648. data/spec/mongo/id_spec.rb +3 -0
  649. data/spec/mongo/index/view_spec.rb +5 -2
  650. data/spec/mongo/lint_spec.rb +3 -0
  651. data/spec/mongo/logger_spec.rb +3 -0
  652. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  653. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  654. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  657. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  658. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  661. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  663. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  664. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  665. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  666. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  667. data/spec/mongo/monitoring/event/server_closed_spec.rb +3 -0
  668. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  669. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +3 -0
  670. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  671. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +3 -0
  672. data/spec/mongo/monitoring/event/server_opening_spec.rb +3 -0
  673. data/spec/mongo/monitoring/event/topology_changed_spec.rb +3 -0
  674. data/spec/mongo/monitoring/event/topology_closed_spec.rb +3 -0
  675. data/spec/mongo/monitoring/event/topology_opening_spec.rb +3 -0
  676. data/spec/mongo/monitoring_spec.rb +3 -0
  677. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  678. data/spec/mongo/operation/aggregate_spec.rb +3 -0
  679. data/spec/mongo/operation/collections_info_spec.rb +3 -0
  680. data/spec/mongo/operation/command_spec.rb +5 -2
  681. data/spec/mongo/operation/create_index_spec.rb +3 -0
  682. data/spec/mongo/operation/create_user_spec.rb +3 -0
  683. data/spec/mongo/operation/delete/bulk_spec.rb +3 -0
  684. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  685. data/spec/mongo/operation/delete/op_msg_spec.rb +4 -1
  686. data/spec/mongo/operation/delete_spec.rb +3 -0
  687. data/spec/mongo/operation/drop_index_spec.rb +3 -0
  688. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +5 -2
  689. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +5 -2
  690. data/spec/mongo/operation/find/legacy_spec.rb +5 -1
  691. data/spec/mongo/operation/get_more_spec.rb +3 -0
  692. data/spec/mongo/operation/indexes_spec.rb +3 -0
  693. data/spec/mongo/operation/insert/bulk_spec.rb +4 -1
  694. data/spec/mongo/operation/insert/command_spec.rb +3 -0
  695. data/spec/mongo/operation/insert/op_msg_spec.rb +4 -1
  696. data/spec/mongo/operation/insert_spec.rb +3 -0
  697. data/spec/mongo/operation/kill_cursors_spec.rb +7 -1
  698. data/spec/mongo/operation/limited_spec.rb +3 -0
  699. data/spec/mongo/operation/map_reduce_spec.rb +3 -0
  700. data/spec/mongo/operation/read_preference_legacy_spec.rb +39 -42
  701. data/spec/mongo/operation/read_preference_op_msg_spec.rb +8 -3
  702. data/spec/mongo/operation/remove_user_spec.rb +3 -0
  703. data/spec/mongo/operation/result_spec.rb +9 -4
  704. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  705. data/spec/mongo/operation/update/bulk_spec.rb +4 -1
  706. data/spec/mongo/operation/update/command_spec.rb +3 -0
  707. data/spec/mongo/operation/update/op_msg_spec.rb +4 -1
  708. data/spec/mongo/operation/update_spec.rb +3 -0
  709. data/spec/mongo/operation/update_user_spec.rb +3 -0
  710. data/spec/mongo/options/redacted_spec.rb +3 -0
  711. data/spec/mongo/protocol/compressed_spec.rb +3 -0
  712. data/spec/mongo/protocol/delete_spec.rb +3 -0
  713. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  714. data/spec/mongo/protocol/insert_spec.rb +3 -0
  715. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  716. data/spec/mongo/protocol/msg_spec.rb +4 -1
  717. data/spec/mongo/protocol/query_spec.rb +6 -3
  718. data/spec/mongo/protocol/registry_spec.rb +3 -0
  719. data/spec/mongo/protocol/reply_spec.rb +3 -0
  720. data/spec/mongo/protocol/update_spec.rb +3 -0
  721. data/spec/mongo/query_cache_spec.rb +9 -2
  722. data/spec/mongo/retryable_spec.rb +3 -0
  723. data/spec/mongo/semaphore_spec.rb +3 -0
  724. data/spec/mongo/server/app_metadata_spec.rb +44 -21
  725. data/spec/mongo/server/connection_auth_spec.rb +6 -9
  726. data/spec/mongo/server/connection_common_spec.rb +75 -0
  727. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -0
  728. data/spec/mongo/server/connection_pool_spec.rb +76 -7
  729. data/spec/mongo/server/connection_spec.rb +143 -39
  730. data/spec/mongo/server/description/features_spec.rb +3 -0
  731. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  732. data/spec/mongo/server/description_spec.rb +624 -611
  733. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  734. data/spec/mongo/server/monitor/connection_spec.rb +40 -0
  735. data/spec/mongo/server/monitor_spec.rb +17 -13
  736. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  737. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  738. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  739. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  740. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  741. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  742. data/spec/mongo/server_selector_spec.rb +5 -1
  743. data/spec/mongo/server_spec.rb +3 -0
  744. data/spec/mongo/session/server_session_spec.rb +3 -0
  745. data/spec/mongo/session/session_pool_spec.rb +45 -10
  746. data/spec/mongo/session_spec.rb +3 -0
  747. data/spec/mongo/session_transaction_spec.rb +17 -37
  748. data/spec/mongo/socket/ssl_spec.rb +3 -0
  749. data/spec/mongo/socket/tcp_spec.rb +3 -0
  750. data/spec/mongo/socket/unix_spec.rb +4 -0
  751. data/spec/mongo/socket_spec.rb +3 -0
  752. data/spec/mongo/srv/monitor_spec.rb +3 -0
  753. data/spec/mongo/srv/result_spec.rb +3 -0
  754. data/spec/mongo/timeout_spec.rb +3 -0
  755. data/spec/mongo/tls_context_hooks_spec.rb +3 -0
  756. data/spec/mongo/uri/srv_protocol_spec.rb +4 -0
  757. data/spec/mongo/uri_option_parsing_spec.rb +41 -5
  758. data/spec/mongo/uri_spec.rb +3 -0
  759. data/spec/mongo/utils_spec.rb +17 -0
  760. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  761. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  762. data/spec/mongo/write_concern_spec.rb +3 -0
  763. data/spec/runners/auth.rb +22 -1
  764. data/spec/runners/change_streams/outcome.rb +3 -0
  765. data/spec/runners/change_streams/spec.rb +3 -0
  766. data/spec/runners/change_streams/test.rb +4 -1
  767. data/spec/runners/cmap/verifier.rb +3 -0
  768. data/spec/runners/cmap.rb +4 -1
  769. data/spec/runners/command_monitoring.rb +3 -0
  770. data/spec/runners/connection_string.rb +10 -3
  771. data/spec/runners/crud/context.rb +3 -0
  772. data/spec/runners/crud/operation.rb +8 -3
  773. data/spec/runners/crud/outcome.rb +3 -0
  774. data/spec/runners/crud/requirement.rb +29 -1
  775. data/spec/runners/crud/spec.rb +3 -0
  776. data/spec/runners/crud/test.rb +3 -0
  777. data/spec/runners/crud/test_base.rb +3 -0
  778. data/spec/runners/crud/verifier.rb +3 -0
  779. data/spec/runners/crud.rb +23 -1
  780. data/spec/runners/gridfs.rb +3 -0
  781. data/spec/runners/read_write_concern_document.rb +3 -0
  782. data/spec/runners/sdam/verifier.rb +3 -0
  783. data/spec/runners/sdam.rb +8 -4
  784. data/spec/runners/server_selection.rb +3 -0
  785. data/spec/runners/server_selection_rtt.rb +4 -1
  786. data/spec/runners/transactions/operation.rb +3 -0
  787. data/spec/runners/transactions/spec.rb +3 -0
  788. data/spec/runners/transactions/test.rb +5 -2
  789. data/spec/runners/transactions.rb +3 -0
  790. data/spec/runners/unified/assertions.rb +44 -12
  791. data/spec/runners/unified/change_stream_operations.rb +3 -0
  792. data/spec/runners/unified/crud_operations.rb +8 -1
  793. data/spec/runners/unified/ddl_operations.rb +11 -1
  794. data/spec/runners/unified/entity_map.rb +3 -0
  795. data/spec/runners/unified/error.rb +3 -0
  796. data/spec/runners/unified/event_subscriber.rb +26 -13
  797. data/spec/runners/unified/exceptions.rb +3 -0
  798. data/spec/runners/unified/grid_fs_operations.rb +3 -0
  799. data/spec/runners/unified/support_operations.rb +13 -2
  800. data/spec/runners/unified/test.rb +56 -23
  801. data/spec/runners/unified/test_group.rb +3 -0
  802. data/spec/runners/unified.rb +4 -1
  803. data/spec/shared/bin/s3-copy +45 -0
  804. data/spec/shared/bin/s3-upload +69 -0
  805. data/spec/shared/lib/mrss/cluster_config.rb +17 -4
  806. data/spec/shared/lib/mrss/constraints.rb +49 -10
  807. data/spec/shared/lib/mrss/docker_runner.rb +10 -1
  808. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  809. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  810. data/spec/shared/lib/mrss/server_version_registry.rb +20 -12
  811. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  812. data/spec/shared/share/Dockerfile.erb +127 -35
  813. data/spec/shared/share/haproxy-1.conf +16 -0
  814. data/spec/shared/share/haproxy-2.conf +17 -0
  815. data/spec/shared/shlib/server.sh +100 -23
  816. data/spec/shared/shlib/set_env.sh +4 -1
  817. data/spec/solo/clean_exit_spec.rb +3 -0
  818. data/spec/spec_helper.rb +4 -2
  819. data/spec/spec_tests/auth_spec.rb +30 -13
  820. data/spec/spec_tests/change_streams_spec.rb +4 -1
  821. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  822. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  823. data/spec/spec_tests/cmap_spec.rb +7 -1
  824. data/spec/spec_tests/collection_management_spec.rb +13 -0
  825. data/spec/spec_tests/command_monitoring_spec.rb +32 -27
  826. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  827. data/spec/spec_tests/connection_string_spec.rb +3 -0
  828. data/spec/spec_tests/crud_spec.rb +3 -0
  829. data/spec/spec_tests/crud_unified_spec.rb +3 -0
  830. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +5 -5
  831. data/spec/spec_tests/data/change_streams/{change-streams-resume-whitelist.yml → change-streams-resume-allowlist.yml} +58 -58
  832. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +46 -46
  833. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  834. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  835. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  836. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  837. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  838. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  839. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  840. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  841. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  842. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  843. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  844. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  845. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  846. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  847. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  848. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  849. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  850. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  851. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  852. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  853. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  854. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  855. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  856. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  857. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  858. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  859. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  860. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  861. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +7 -6
  862. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +2 -1
  863. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +7 -6
  864. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +2 -1
  865. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +7 -6
  866. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +2 -1
  867. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  868. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  869. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  870. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +1 -1
  871. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +1 -1
  872. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  873. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  874. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  875. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  876. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  877. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  878. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  879. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  880. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  881. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  882. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  883. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  884. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  885. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  886. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +5 -4
  887. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  888. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  889. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  890. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  891. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  892. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  893. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml} +5 -4
  894. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterOrSecondary.yml → non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml} +5 -4
  895. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMaster.yml → non-stale-topologyVersion-greater-NotWritablePrimary.yml} +5 -4
  896. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  897. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  898. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  899. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  900. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  901. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml} +5 -4
  902. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterOrSecondary.yml → non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml} +5 -4
  903. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMaster.yml → non-stale-topologyVersion-missing-NotWritablePrimary.yml} +5 -4
  904. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  905. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  906. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  907. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  908. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  909. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml} +5 -4
  910. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml} +5 -4
  911. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMaster.yml → non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml} +5 -4
  912. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  913. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  914. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  915. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  916. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  917. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterNoSlaveOk.yml → post-42-NotPrimaryNoSecondaryOk.yml} +5 -4
  918. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterOrSecondary.yml → post-42-NotPrimaryOrSecondary.yml} +5 -4
  919. data/spec/spec_tests/data/sdam/errors/{post-42-NotMaster.yml → post-42-NotWritablePrimary.yml} +5 -4
  920. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  921. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  922. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  923. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  924. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMaster.yml → pre-42-LegacyNotPrimary.yml} +6 -5
  925. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  926. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterOrSecondary.yml → pre-42-NotPrimaryOrSecondary.yml} +5 -4
  927. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterNoSlaveOk.yml → pre-42-NotWritablePrimary.yml} +6 -5
  928. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  929. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  930. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  931. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  932. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  933. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterNoSlaveOk.yml → stale-generation-NotPrimaryNoSecondaryOk.yml} +7 -5
  934. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterOrSecondary.yml → stale-generation-NotPrimaryOrSecondary.yml} +7 -5
  935. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMaster.yml → stale-generation-NotWritablePrimary.yml} +7 -5
  936. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  937. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  938. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  939. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  940. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMaster.yml → stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  941. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  942. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  943. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  944. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  945. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  946. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  947. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  948. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  949. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  950. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMaster.yml → stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  951. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  952. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  953. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  954. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  955. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  956. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  957. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  958. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  959. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  960. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  961. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterNoSlaveOk.yml → stale-topologyVersion-NotPrimaryNoSecondaryOk.yml} +7 -6
  962. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterOrSecondary.yml → stale-topologyVersion-NotPrimaryOrSecondary.yml} +7 -6
  963. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMaster.yml → stale-topologyVersion-NotWritablePrimary.yml} +7 -6
  964. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  965. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  966. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  967. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  968. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  969. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  970. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  971. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  972. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  973. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  974. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  975. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  976. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  977. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  978. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  979. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  980. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  981. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  982. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  983. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  984. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  985. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  986. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  987. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  988. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  989. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  990. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  991. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  992. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  993. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  994. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  995. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  996. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  997. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  998. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  999. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  1000. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  1001. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  1002. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  1003. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  1004. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  1005. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  1006. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  1007. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  1008. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  1009. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  1010. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  1011. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  1012. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  1013. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1014. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1015. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1016. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1017. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1018. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1019. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1020. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1021. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1022. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1023. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1024. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1025. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1026. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1027. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1028. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1029. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1030. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1031. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1032. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1033. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1034. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1035. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1036. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1037. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1038. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1039. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1040. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1041. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1042. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1043. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1044. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1045. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1046. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1047. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1048. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1049. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1050. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1051. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1052. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1053. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +3 -3
  1054. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1055. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1056. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1057. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +1 -1
  1058. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +2 -2
  1059. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  1060. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  1061. data/spec/spec_tests/data/sdam_integration/{isMaster-command-error.yml → hello-command-error.yml} +22 -30
  1062. data/spec/spec_tests/data/sdam_integration/{isMaster-network-error.yml → hello-network-error.yml} +12 -16
  1063. data/spec/spec_tests/data/sdam_integration/{isMaster-timeout.yml → hello-timeout.yml} +9 -13
  1064. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  1065. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  1066. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +14 -3
  1067. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
  1068. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  1069. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1070. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1071. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +3 -2
  1072. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1073. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
  1074. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  1075. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  1076. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  1077. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  1078. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  1079. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  1080. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  1081. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  1082. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  1083. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  1084. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  1085. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  1086. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  1087. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  1088. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  1089. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  1090. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  1091. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  1092. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  1093. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  1094. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  1095. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  1096. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  1097. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  1098. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  1099. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  1100. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  1101. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  1102. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  1103. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  1104. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  1105. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  1106. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  1107. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  1108. data/spec/spec_tests/data/transactions/error-labels.yml +3 -0
  1109. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1110. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +2 -0
  1111. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1112. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  1113. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  1114. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  1115. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  1116. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  1117. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1118. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  1119. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +7 -6
  1120. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  1121. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +9 -1
  1122. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +1 -1
  1123. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +3 -1
  1124. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +5 -57
  1125. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1126. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  1127. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1128. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1129. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1130. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1131. data/spec/spec_tests/retryable_reads_spec.rb +5 -2
  1132. data/spec/spec_tests/retryable_writes_spec.rb +10 -7
  1133. data/spec/spec_tests/sdam_integration_spec.rb +4 -1
  1134. data/spec/spec_tests/sdam_monitoring_spec.rb +14 -6
  1135. data/spec/spec_tests/sdam_spec.rb +5 -2
  1136. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  1137. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1138. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1139. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1140. data/spec/spec_tests/transactions_spec.rb +3 -0
  1141. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1142. data/spec/spec_tests/unified_spec.rb +3 -0
  1143. data/spec/spec_tests/uri_options_spec.rb +7 -4
  1144. data/spec/spec_tests/versioned_api_spec.rb +3 -0
  1145. data/spec/stress/cleanup_spec.rb +3 -0
  1146. data/spec/stress/connection_pool_stress_spec.rb +3 -0
  1147. data/spec/stress/connection_pool_timing_spec.rb +3 -0
  1148. data/spec/stress/fork_reconnect_stress_spec.rb +7 -8
  1149. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1150. data/spec/support/authorization.rb +3 -0
  1151. data/spec/support/aws_utils/base.rb +3 -0
  1152. data/spec/support/aws_utils/inspector.rb +3 -0
  1153. data/spec/support/aws_utils/orchestrator.rb +3 -0
  1154. data/spec/support/aws_utils/provisioner.rb +3 -0
  1155. data/spec/support/aws_utils.rb +3 -0
  1156. data/spec/support/background_thread_registry.rb +4 -1
  1157. data/spec/support/certificates/README.md +3 -2
  1158. data/spec/support/certificates/atlas-ocsp-ca.crt +107 -25
  1159. data/spec/support/certificates/atlas-ocsp.crt +156 -40
  1160. data/spec/support/client_registry.rb +12 -5
  1161. data/spec/support/client_registry_macros.rb +7 -4
  1162. data/spec/support/cluster_tools.rb +4 -1
  1163. data/spec/support/common_shortcuts.rb +24 -6
  1164. data/spec/support/constraints.rb +3 -0
  1165. data/spec/support/crypt.rb +3 -0
  1166. data/spec/support/dns.rb +3 -0
  1167. data/spec/support/json_ext_formatter.rb +3 -0
  1168. data/spec/support/keyword_struct.rb +3 -0
  1169. data/spec/support/local_resource_registry.rb +3 -0
  1170. data/spec/support/matchers.rb +17 -1
  1171. data/spec/support/monitoring_ext.rb +3 -0
  1172. data/spec/support/primary_socket.rb +3 -0
  1173. data/spec/support/sdam_formatter_integration.rb +3 -0
  1174. data/spec/support/session_registry.rb +3 -0
  1175. data/spec/{mongo/server/app_metadata_shared.rb → support/shared/app_metadata.rb} +38 -7
  1176. data/spec/support/shared/auth_context.rb +16 -0
  1177. data/spec/support/shared/protocol.rb +3 -0
  1178. data/spec/support/shared/scram_conversation.rb +3 -0
  1179. data/spec/support/shared/server_selector.rb +6 -3
  1180. data/spec/support/shared/session.rb +5 -2
  1181. data/spec/support/spec_config.rb +53 -20
  1182. data/spec/support/spec_setup.rb +3 -0
  1183. data/spec/support/using_hash.rb +31 -0
  1184. data/spec/support/utils.rb +5 -2
  1185. data.tar.gz.sig +0 -0
  1186. metadata +1189 -1089
  1187. metadata.gz.sig +0 -0
  1188. data/lib/mongo/collection/view/builder/find_command.rb +0 -170
  1189. data/lib/mongo/collection/view/builder/op_query.rb +0 -91
  1190. data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
  1191. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
  1192. data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
  1193. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
  1194. data/lib/mongo/server/context.rb +0 -69
  1195. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -61
  1196. data/spec/runners/unified/using_hash.rb +0 -31
  1197. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -76
  1198. data/spec/support/event_subscriber.rb +0 -212
data/lib/mongo/cluster.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -104,7 +107,7 @@ module Mongo
104
107
  # to not start the periodic executor. If :monitoring_io is false,
105
108
  # :cleanup automatically defaults to false as well.
106
109
  # @option options [ Float ] :heartbeat_frequency The interval, in seconds,
107
- # for the server monitor to refresh its description via ismaster.
110
+ # for the server monitor to refresh its description via hello.
108
111
  # @option options [ Hash ] :resolv_options For internal driver use only.
109
112
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
110
113
  # @option options [ Hash ] :server_api The requested server API version.
@@ -156,6 +159,10 @@ module Mongo
156
159
  @sdam_flow_lock = Mutex.new
157
160
  Session::SessionPool.create(self)
158
161
 
162
+ if seeds.empty? && load_balanced?
163
+ raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited'
164
+ end
165
+
159
166
  # The opening topology is always unknown with no servers.
160
167
  # https://github.com/mongodb/specifications/pull/388
161
168
  opening_topology = Topology::Unknown.new(options, monitoring, self)
@@ -168,7 +175,7 @@ module Mongo
168
175
  @seeds = seeds = seeds.uniq
169
176
  servers = seeds.map do |seed|
170
177
  # Server opening events must be sent after topology change events.
171
- # Therefore separate server addition, done here before topoolgy change
178
+ # Therefore separate server addition, done here before topology change
172
179
  # event is published, from starting to monitor the server which is
173
180
  # done later.
174
181
  add(seed, monitor: false)
@@ -176,11 +183,20 @@ module Mongo
176
183
 
177
184
  if seeds.size >= 1
178
185
  # Recreate the topology to get the current server list into it
179
- @topology = topology.class.new(topology.options, topology.monitoring, self)
180
- publish_sdam_event(
181
- Monitoring::TOPOLOGY_CHANGED,
182
- Monitoring::Event::TopologyChanged.new(opening_topology, @topology)
183
- )
186
+ recreate_topology(topology, opening_topology)
187
+ end
188
+
189
+ if load_balanced?
190
+ # We are required by the specifications to produce certain SDAM events
191
+ # when in load-balanced topology.
192
+ # These events don't make a lot of sense from the standpoint of the
193
+ # driver's SDAM implementation, nor from the standpoint of the
194
+ # driver's load balancer implementation.
195
+ # They are just required boilerplate.
196
+ #
197
+ # Note that this call must be done above the monitoring_io check
198
+ # because that short-circuits the rest of the constructor.
199
+ fabricate_lb_sdam_events_and_set_server_type
184
200
  end
185
201
 
186
202
  if options[:monitoring_io] == false
@@ -200,7 +216,7 @@ module Mongo
200
216
  @connected = true
201
217
 
202
218
  if options[:cleanup] != false
203
- @cursor_reaper = CursorReaper.new
219
+ @cursor_reaper = CursorReaper.new(self)
204
220
  @socket_reaper = SocketReaper.new(self)
205
221
  @periodic_executor = PeriodicExecutor.new([
206
222
  @cursor_reaper, @socket_reaper,
@@ -209,54 +225,56 @@ module Mongo
209
225
  @periodic_executor.run!
210
226
  end
211
227
 
212
- # Need to record start time prior to starting monitoring
213
- start_time = Time.now
214
-
215
- servers.each do |server|
216
- server.start_monitoring
217
- end
228
+ unless load_balanced?
229
+ # Need to record start time prior to starting monitoring
230
+ start_monotime = Utils.monotonic_time
218
231
 
219
- if options[:scan] != false
220
- server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
221
- # The server selection timeout can be very short especially in
222
- # tests, when the client waits for a synchronous scan before
223
- # starting server selection. Limiting the scan to server selection time
224
- # then aborts the scan before it can process even local servers.
225
- # Therefore, allow at least 3 seconds for the scan here.
226
- if server_selection_timeout < 3
227
- server_selection_timeout = 3
232
+ servers.each do |server|
233
+ server.start_monitoring
228
234
  end
229
- deadline = start_time + server_selection_timeout
230
- # Wait for the first scan of each server to complete, for
231
- # backwards compatibility.
232
- # If any servers are discovered during this SDAM round we are going to
233
- # wait for these servers to also be queried, and so on, up to the
234
- # server selection timeout or the 3 second minimum.
235
- loop do
236
- # Ensure we do not try to read the servers list while SDAM is running
237
- servers = @sdam_flow_lock.synchronize do
238
- servers_list.dup
239
- end
240
- if servers.all? { |server| server.last_scan && server.last_scan >= start_time }
241
- break
242
- end
243
- if (time_remaining = deadline - Time.now) <= 0
244
- break
235
+
236
+ if options[:scan] != false
237
+ server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
238
+ # The server selection timeout can be very short especially in
239
+ # tests, when the client waits for a synchronous scan before
240
+ # starting server selection. Limiting the scan to server selection time
241
+ # then aborts the scan before it can process even local servers.
242
+ # Therefore, allow at least 3 seconds for the scan here.
243
+ if server_selection_timeout < 3
244
+ server_selection_timeout = 3
245
245
  end
246
- log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
247
- # Since the semaphore may have been signaled between us checking
248
- # the servers list above and the wait call below, we should not
249
- # wait for the full remaining time - wait for up to 1 second, then
250
- # recheck the state.
251
- begin
252
- server_selection_semaphore.wait([time_remaining, 1].min)
253
- rescue ::Timeout::Error
254
- # nothing
246
+ deadline = start_monotime + server_selection_timeout
247
+ # Wait for the first scan of each server to complete, for
248
+ # backwards compatibility.
249
+ # If any servers are discovered during this SDAM round we are going to
250
+ # wait for these servers to also be queried, and so on, up to the
251
+ # server selection timeout or the 3 second minimum.
252
+ loop do
253
+ # Ensure we do not try to read the servers list while SDAM is running
254
+ servers = @sdam_flow_lock.synchronize do
255
+ servers_list.dup
256
+ end
257
+ if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
258
+ break
259
+ end
260
+ if (time_remaining = deadline - Utils.monotonic_time) <= 0
261
+ break
262
+ end
263
+ log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
264
+ # Since the semaphore may have been signaled between us checking
265
+ # the servers list above and the wait call below, we should not
266
+ # wait for the full remaining time - wait for up to 1 second, then
267
+ # recheck the state.
268
+ begin
269
+ server_selection_semaphore.wait([time_remaining, 1].min)
270
+ rescue ::Timeout::Error
271
+ # nothing
272
+ end
255
273
  end
256
274
  end
257
- end
258
275
 
259
- start_stop_srv_monitor
276
+ start_stop_srv_monitor
277
+ end
260
278
  end
261
279
 
262
280
  # Create a cluster for the provided client, for use when we don't want the
@@ -318,6 +336,14 @@ module Mongo
318
336
  def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
319
337
  :single?, :unknown?
320
338
 
339
+ # Returns whether the cluster is configured to be in the load-balanced
340
+ # topology.
341
+ #
342
+ # @return [ true | false ] Whether the topology is load-balanced.
343
+ def load_balanced?
344
+ topology.is_a?(Topology::LoadBalanced)
345
+ end
346
+
321
347
  [:register_cursor, :schedule_kill_cursor, :unregister_cursor].each do |m|
322
348
  define_method(m) do |*args|
323
349
  if options[:cleanup] != false
@@ -595,10 +621,26 @@ module Mongo
595
621
  # existing connection pool (required when handling not master errors
596
622
  # on 4.2+ servers).
597
623
  # @option aptions [ true | false ] :awaited Whether the updated description
598
- # was a result of processing an awaited ismaster.
624
+ # was a result of processing an awaited hello.
625
+ # @option options [ Object ] :service_id Change state for the specified
626
+ # service id only.
599
627
  #
600
628
  # @api private
601
629
  def run_sdam_flow(previous_desc, updated_desc, options = {})
630
+ if load_balanced?
631
+ if updated_desc.config.empty?
632
+ unless options[:keep_connection_pool]
633
+ servers_list.each do |server|
634
+ # TODO should service id be taken out of updated_desc?
635
+ # We could also assert that
636
+ # options[:service_id] == updated_desc.service_id
637
+ server.clear_connection_pool(service_id: options[:service_id])
638
+ end
639
+ end
640
+ end
641
+ return
642
+ end
643
+
602
644
  @sdam_flow_lock.synchronize do
603
645
  flow = SdamFlow.new(self, previous_desc, updated_desc,
604
646
  awaited: options[:awaited])
@@ -762,7 +804,7 @@ module Mongo
762
804
  end
763
805
 
764
806
  # Add a server to the cluster with the provided address. Useful in
765
- # auto-discovery of new servers when an existing server executes an ismaster
807
+ # auto-discovery of new servers when an existing server executes a hello
766
808
  # and potentially non-configured servers were included.
767
809
  #
768
810
  # @example Add the server for the address to the cluster.
@@ -779,8 +821,15 @@ module Mongo
779
821
  def add(host, add_options=nil)
780
822
  address = Address.new(host, options)
781
823
  if !addresses.include?(address)
782
- server = Server.new(address, self, @monitoring, event_listeners, options.merge(
783
- monitor: false))
824
+ opts = options.merge(monitor: false)
825
+ # Note that in a load-balanced topology, every server must be a
826
+ # load balancer (load_balancer: true is specified in the options)
827
+ # but this option isn't set here because we are required by the
828
+ # specifications to pretent the server started out as an unknown one
829
+ # and publish server description change event into the load balancer
830
+ # one. The actual correct description for this server will be set
831
+ # by the fabricate_lb_sdam_events_and_set_server_type method.
832
+ server = Server.new(address, self, @monitoring, event_listeners, opts)
784
833
  @update_lock.synchronize do
785
834
  # Need to recheck whether server is present in @servers, because
786
835
  # the previous check was not under a lock.
@@ -896,6 +945,10 @@ module Mongo
896
945
  #
897
946
  # @api private
898
947
  def validate_session_support!
948
+ if topology.is_a?(Topology::LoadBalanced)
949
+ return
950
+ end
951
+
899
952
  @state_change_lock.synchronize do
900
953
  @sdam_flow_lock.synchronize do
901
954
  if topology.data_bearing_servers?
@@ -979,6 +1032,41 @@ module Mongo
979
1032
  msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
980
1033
  raise Error::SessionsNotSupported, msg
981
1034
  end
1035
+
1036
+ def fabricate_lb_sdam_events_and_set_server_type
1037
+ # Although there is no monitoring connection in load balanced mode,
1038
+ # we must emit the following series of SDAM events.
1039
+ server = @servers.first
1040
+ # We are guaranteed to have the server here.
1041
+ server.publish_opening_event
1042
+ server_desc = server.description
1043
+ # This is where a load balancer actually gets its correct server
1044
+ # description.
1045
+ server.update_description(
1046
+ Server::Description.new(server.address, {},
1047
+ load_balancer: true,
1048
+ force_load_balancer: options[:connect] == :load_balanced,
1049
+ )
1050
+ )
1051
+ publish_sdam_event(
1052
+ Monitoring::SERVER_DESCRIPTION_CHANGED,
1053
+ Monitoring::Event::ServerDescriptionChanged.new(
1054
+ server.address,
1055
+ topology,
1056
+ server_desc,
1057
+ server.description
1058
+ )
1059
+ )
1060
+ recreate_topology(topology, topology)
1061
+ end
1062
+
1063
+ def recreate_topology(new_topology_template, previous_topology)
1064
+ @topology = topology.class.new(new_topology_template.options, new_topology_template.monitoring, self)
1065
+ publish_sdam_event(
1066
+ Monitoring::TOPOLOGY_CHANGED,
1067
+ Monitoring::Event::TopologyChanged.new(previous_topology, @topology)
1068
+ )
1069
+ end
982
1070
  end
983
1071
  end
984
1072
 
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2019-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -118,10 +121,12 @@ module Mongo
118
121
  end
119
122
 
120
123
  def valid_server?(server)
121
- description = server.with_connection do |connection|
122
- connection.description
124
+ if secondary_ok?
125
+ true
126
+ else
127
+ description = server.description
128
+ description.standalone? || description.mongos? || description.primary? || description.load_balancer?
123
129
  end
124
- description.standalone? || description.mongos? || description.primary? || secondary_ok?
125
130
  end
126
131
 
127
132
  def secondary_ok?
@@ -133,16 +138,9 @@ module Mongo
133
138
  log_warn("Rerouting the Aggregation operation to the primary server - #{server.summary} is not suitable")
134
139
  server = cluster.next_primary(nil, session)
135
140
  end
136
- validate_collation!(server)
137
141
  initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
138
142
  end
139
143
 
140
- def validate_collation!(server)
141
- if options[:collation] && !server.with_connection { |connection| connection.features }.collation_enabled?
142
- raise Error::UnsupportedCollation.new
143
- end
144
- end
145
-
146
144
  # Skip, sort, limit, projection are specified as pipeline stages
147
145
  # rather than as options.
148
146
  def cache_options
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2015-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -76,11 +79,12 @@ module Mongo
76
79
  # @since 2.2.0
77
80
  def specification
78
81
  spec = {
79
- selector: aggregation_command,
80
- db_name: database.name,
81
- read: view.read_preference,
82
- session: @options[:session]
83
- }
82
+ selector: aggregation_command,
83
+ db_name: database.name,
84
+ read: view.read_preference,
85
+ session: @options[:session],
86
+ collation: @options[:collation],
87
+ }
84
88
  if write?
85
89
  spec.update(write_concern: write_concern)
86
90
  end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2015-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -33,7 +36,7 @@ module Mongo
33
36
  scope: 'scope',
34
37
  verbose: 'verbose',
35
38
  bypass_document_validation: 'bypassDocumentValidation',
36
- collation: 'collation'
39
+ collation: 'collation',
37
40
  ).freeze
38
41
 
39
42
  def_delegators :@view, :collection, :database, :filter, :read, :write_concern
@@ -68,36 +71,6 @@ module Mongo
68
71
  @options = options
69
72
  end
70
73
 
71
- # Get the specification for issuing a find command on the map/reduce
72
- # results.
73
- #
74
- # @example Get the command specification.
75
- # builder.command_specification
76
- #
77
- # @return [ Hash ] The specification.
78
- #
79
- # @since 2.2.0
80
- def command_specification
81
- {
82
- selector: find_command,
83
- db_name: query_database,
84
- read: read,
85
- session: options[:session]
86
- }
87
- end
88
-
89
- # Get the specification for the document query after a map/reduce.
90
- #
91
- # @example Get the query specification.
92
- # builder.query_specification
93
- #
94
- # @return [ Hash ] The specification.
95
- #
96
- # @since 2.2.0
97
- def query_specification
98
- { selector: {}, options: {}, db_name: query_database, coll_name: query_collection }
99
- end
100
-
101
74
  # Get the specification to pass to the map/reduce operation.
102
75
  #
103
76
  # @example Get the specification.
@@ -110,6 +83,8 @@ module Mongo
110
83
  spec = {
111
84
  selector: map_reduce_command,
112
85
  db_name: database.name,
86
+ # Note that selector just above may also have a read preference
87
+ # specified, per the #map_reduce_command method below.
113
88
  read: read,
114
89
  session: options[:session]
115
90
  }
@@ -118,8 +93,6 @@ module Mongo
118
93
 
119
94
  private
120
95
 
121
- OUT_ACTIONS = [ :replace, :merge, :reduce ].freeze
122
-
123
96
  def write?(spec)
124
97
  if out = spec[:selector][:out]
125
98
  out.is_a?(String) ||
@@ -127,37 +100,30 @@ module Mongo
127
100
  end
128
101
  end
129
102
 
130
- def find_command
131
- BSON::Document.new('find' => query_collection, 'filter' => {})
132
- end
133
-
134
103
  def map_reduce_command
135
104
  command = BSON::Document.new(
136
105
  :mapReduce => collection.name,
137
106
  :map => map,
138
107
  :reduce => reduce,
139
108
  :query => filter,
140
- :out => { inline: 1 }
109
+ :out => { inline: 1 },
141
110
  )
111
+ # Shouldn't this use self.read ?
142
112
  if collection.read_concern
143
113
  command[:readConcern] = Options::Mapper.transform_values_to_strings(
144
114
  collection.read_concern)
145
115
  end
146
- command.merge!(view_options)
116
+ command.update(view_options)
117
+ command.update(Utils.slice_hash(options, :collation))
118
+ # Read preference isn't simply passed in the command payload
119
+ # (it may need to be converted to wire protocol flags)
120
+ # so remove it here and hopefully it's handled elsewhere.
121
+ # If not, RUBY-2706.
122
+ command.delete(:read)
147
123
  command.merge!(Options::Mapper.transform_documents(options, MAPPINGS))
148
124
  command
149
125
  end
150
126
 
151
- def query_database
152
- options[:out].respond_to?(:keys) && options[:out][:db] ? options[:out][:db] : database.name
153
- end
154
-
155
- def query_collection
156
- if options[:out].respond_to?(:keys)
157
- options[:out][OUT_ACTIONS.find { |action| options[:out][action] }]
158
- end || options[:out]
159
- end
160
-
161
127
  def view_options
162
128
  @view_options ||= (opts = view.options.dup
163
129
  opts.delete(:session)
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2015-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +17,3 @@
14
17
 
15
18
  require 'mongo/collection/view/builder/aggregation'
16
19
  require 'mongo/collection/view/builder/map_reduce'
17
- require 'mongo/collection/view/builder/op_query'
18
- require 'mongo/collection/view/builder/find_command'
19
- require 'mongo/collection/view/builder/flags'
20
- require 'mongo/collection/view/builder/modifiers'
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2017-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2017-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -203,7 +206,7 @@ module Mongo
203
206
  unless closed?
204
207
  begin
205
208
  @cursor.close
206
- rescue Error::OperationFailure
209
+ rescue Error::OperationFailure, Error::SocketError, Error::SocketTimeoutError
207
210
  # ignore
208
211
  end
209
212
  @cursor = nil
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,6 +25,13 @@ module Mongo
22
25
  # @since 2.0.0
23
26
  module Iterable
24
27
 
28
+ # Returns the cursor associated with this view, if any.
29
+ #
30
+ # @return [ nil | Cursor ] The cursor, if any.
31
+ #
32
+ # @api private
33
+ attr_reader :cursor
34
+
25
35
  # Iterate through documents returned by a query with this +View+.
26
36
  #
27
37
  # @example Iterate through the result of the view.
@@ -35,18 +45,28 @@ module Mongo
35
45
  #
36
46
  # @yieldparam [ Hash ] Each matching document.
37
47
  def each
38
- @cursor = if use_query_cache? && cached_cursor
48
+ # If the caching cursor is closed and was not fully iterated,
49
+ # the documents we have in it are not the complete result set and
50
+ # we have no way of completing that iteration.
51
+ # Therefore, discard that cursor and start iteration again.
52
+ # The case of the caching cursor not being closed and not having
53
+ # been fully iterated isn't tested - see RUBY-2773.
54
+ @cursor = if use_query_cache? && cached_cursor && (
55
+ cached_cursor.fully_iterated? || !cached_cursor.closed?
56
+ )
39
57
  cached_cursor
40
58
  else
41
59
  session = client.send(:get_session, @options)
42
- select_cursor(session)
60
+ select_cursor(session).tap do |cursor|
61
+ if use_query_cache?
62
+ # No need to store the cursor in the query cache if there is
63
+ # already a cached cursor stored at this key.
64
+ QueryCache.set(cursor, **cache_options)
65
+ end
66
+ end
43
67
  end
44
68
 
45
69
  if use_query_cache?
46
- # No need to store the cursor in the query cache if there is
47
- # already a cached cursor stored at this key.
48
- QueryCache.set(@cursor, **cache_options) unless cached_cursor
49
-
50
70
  # If a query with a limit is performed, the query cache will
51
71
  # re-use results from an earlier query with the same or larger
52
72
  # limit, and then impose the lower limit during iteration.
@@ -127,36 +147,53 @@ module Mongo
127
147
  projection: projection,
128
148
  collation: collation,
129
149
  read_concern: read_concern,
130
- read_preference: read_preference
131
-
150
+ read_preference: read_preference,
132
151
  }
133
152
  end
134
153
 
135
154
  def initial_query_op(server, session)
136
- if server.with_connection { |connection| connection.features }.find_command_enabled?
137
- initial_command_op(session)
138
- else
139
- # Server versions that do not have the find command feature
140
- # (versions older than 3.2) do not support the allow_disk_use option
141
- # but perform no validation and will not raise an error if it is
142
- # specified. If the allow_disk_use option is specified, raise an error
143
- # to alert the user.
144
- raise Error::UnsupportedOption.allow_disk_use_error if options.key?(:allow_disk_use)
145
- Operation::Find.new(Builder::OpQuery.new(self).specification)
155
+ spec = {
156
+ coll_name: collection.name,
157
+ filter: filter,
158
+ projection: projection,
159
+ db_name: database.name,
160
+ session: session,
161
+ collation: collation,
162
+ sort: sort,
163
+ skip: skip,
164
+ limit: limit,
165
+ allow_disk_use: options[:allow_disk_use],
166
+ read: read,
167
+ read_concern: options[:read_concern] || read_concern,
168
+ batch_size: batch_size,
169
+ hint: options[:hint],
170
+ max_scan: options[:max_scan],
171
+ max_time_ms: options[:max_time_ms],
172
+ max_value: options[:max_value],
173
+ min_value: options[:min_value],
174
+ return_key: options[:return_key],
175
+ show_disk_loc: options[:show_disk_loc],
176
+ comment: options[:comment],
177
+ oplog_replay: if (v = options[:oplog_replay]).nil?
178
+ collection.options[:oplog_replay]
179
+ else
180
+ v
181
+ end,
182
+ }
183
+
184
+ if spec[:oplog_replay]
185
+ collection.client.log_warn("The :oplog_replay option is deprecated and ignored by MongoDB 4.4 and later")
146
186
  end
147
- end
148
187
 
149
- def initial_command_op(session)
150
- builder = Builder::FindCommand.new(self, session)
151
188
  if explained?
152
- Operation::Explain.new(builder.explain_specification)
189
+ spec[:explain] = options[:explain]
190
+ Operation::Explain.new(spec)
153
191
  else
154
- Operation::Find.new(builder.specification)
192
+ Operation::Find.new(spec)
155
193
  end
156
194
  end
157
195
 
158
196
  def send_initial_query(server, session = nil)
159
- validate_collation!(server, collation)
160
197
  initial_query_op(server, session).execute(server, context: Operation::Context.new(client: client, session: session))
161
198
  end
162
199