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
@@ -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");
@@ -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) 2017-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -40,11 +43,11 @@ module Mongo
40
43
  # Creates a new OP_MSG protocol message
41
44
  #
42
45
  # @example Create a OP_MSG wire protocol message
43
- # Msg.new([:more_to_come], {}, { ismaster: 1 },
46
+ # Msg.new([:more_to_come], {}, { hello: 1 },
44
47
  # { type: 1, payload: { identifier: 'documents', sequence: [..] } })
45
48
  #
46
- # @param [ Array<Symbol> ] flags The flag bits. Current supported values
47
- # are :more_to_come and :checksum_present.
49
+ # @param [ Array<Symbol> ] flags The flag bits. Currently supported
50
+ # values are :more_to_come and :checksum_present.
48
51
  # @param [ Hash ] options The options.
49
52
  # @param [ BSON::Document, Hash ] main_document The document that will
50
53
  # become the payload type 0 section. Can contain global args as they
@@ -196,7 +199,7 @@ module Mongo
196
199
  # auto-encryption options, the client has not been instructed to bypass
197
200
  # auto-encryption, and mongocryptd determines that this message is
198
201
  # eligible for encryption. A message is eligible for encryption if it
199
- # represents one of the command types whitelisted by libmongocrypt and it
202
+ # represents one of the command types allow-listed by libmongocrypt and it
200
203
  # contains data that is required to be encrypted by a local or remote json schema.
201
204
  #
202
205
  # @param [ Mongo::Server::Connection ] connection The connection on which
@@ -235,7 +238,7 @@ module Mongo
235
238
  # decrypted if the specified client exists, that client has been given
236
239
  # auto-encryption options, and this message is eligible for decryption.
237
240
  # A message is eligible for decryption if it represents one of the command
238
- # types whitelisted by libmongocrypt and it contains data that is required
241
+ # types allow-listed by libmongocrypt and it contains data that is required
239
242
  # to be encrypted by a local or remote json schema.
240
243
  #
241
244
  # @param [ Mongo::Operation::Context ] context The operation context.
@@ -276,11 +279,6 @@ module Mongo
276
279
  end
277
280
 
278
281
  def maybe_add_server_api(server_api)
279
- if @main_document[:getMore]
280
- # getMore does not allow API parameters.
281
- return self
282
- end
283
-
284
282
  conflicts = {}
285
283
  %i(apiVersion apiStrict apiDeprecationErrors).each do |key|
286
284
  if @main_document.key?(key)
@@ -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");
@@ -40,34 +43,42 @@ module Mongo
40
43
  # Query.new('xgen', 'users', {:name => 'Tyler'}, :skip => 5,
41
44
  # :limit => 10)
42
45
  #
43
- # @example Find all users with slave ok bit set
44
- # Query.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:slave_ok])
46
+ # @example Find all users with secondaryOk bit set
47
+ # Query.new('xgen', 'users', {:name => 'Tyler'}, :flags => [:secondary_ok])
45
48
  #
46
49
  # @example Find all user ids.
47
50
  # Query.new('xgen', 'users', {}, :fields => {:id => 1})
48
51
  #
49
- # @param database [String, Symbol] The database to query.
50
- # @param collection [String, Symbol] The collection to query.
51
- # @param selector [Hash] The query selector.
52
- # @param options [Hash] The additional query options.
53
- #
54
- # @option options :project [Hash] The projection.
55
- # @option options :skip [Integer] The number of documents to skip.
56
- # @option options :limit [Integer] The number of documents to return.
57
- # @option options :flags [Array] The flags for the query message.
52
+ # @param [ String, Symbol ] database The database to query.
53
+ # @param [ String, Symbol ] collection The collection to query.
54
+ # @param [ Hash ] selector The query selector.
55
+ # @param [ Hash ] options The additional query options.
58
56
  #
59
- # Supported flags: +:tailable_cursor+, +:slave_ok+, +:oplog_replay+,
60
- # +:no_cursor_timeout+, +:await_data+, +:exhaust+, +:partial+
57
+ # @option options [ Array<Symbol> ] :flags The flag bits.
58
+ # Currently supported values are :await_data, :exhaust,
59
+ # :no_cursor_timeout, :oplog_replay, :partial, :secondary_ok,
60
+ # :tailable_cursor.
61
+ # @option options [ Integer ] :limit The number of documents to return.
62
+ # @option options [ Hash ] :project The projection.
63
+ # @option options [ Integer ] :skip The number of documents to skip.
61
64
  def initialize(database, collection, selector, options = {})
62
65
  @database = database
63
66
  @namespace = "#{database}.#{collection}"
67
+ if selector.nil?
68
+ raise ArgumentError, 'Selector cannot be nil'
69
+ end
64
70
  @selector = selector
65
71
  @options = options
66
72
  @project = options[:project]
67
73
  @limit = determine_limit
68
74
  @skip = options[:skip] || 0
69
75
  @flags = options[:flags] || []
70
- @upconverter = Upconverter.new(collection, selector, options, flags)
76
+ @upconverter = Upconverter.new(
77
+ collection,
78
+ BSON::Document.new(selector),
79
+ BSON::Document.new(options),
80
+ flags,
81
+ )
71
82
  super
72
83
  end
73
84
 
@@ -168,10 +179,11 @@ module Mongo
168
179
  end
169
180
 
170
181
  # Available flags for a Query message.
182
+ # @api private
171
183
  FLAGS = [
172
184
  :reserved,
173
185
  :tailable_cursor,
174
- :slave_ok,
186
+ :secondary_ok,
175
187
  :oplog_replay,
176
188
  :no_cursor_timeout,
177
189
  :await_data,
@@ -220,7 +232,7 @@ module Mongo
220
232
  }.freeze
221
233
 
222
234
  SPECIAL_FIELD_MAPPINGS = {
223
- :$readPreference => 'readPreference',
235
+ :$readPreference => '$readPreference',
224
236
  :$orderby => 'sort',
225
237
  :$hint => 'hint',
226
238
  :$comment => 'comment',
@@ -245,16 +257,6 @@ module Mongo
245
257
  :partial => 'allowPartialResults'
246
258
  }.freeze
247
259
 
248
- # Find command constant.
249
- #
250
- # @since 2.1.0
251
- FIND = 'find'.freeze
252
-
253
- # Filter attribute constant.
254
- #
255
- # @since 2.1.0
256
- FILTER = 'filter'.freeze
257
-
258
260
  # @return [ String ] collection The name of the collection.
259
261
  attr_reader :collection
260
262
 
@@ -279,6 +281,15 @@ module Mongo
279
281
  #
280
282
  # @since 2.1.0
281
283
  def initialize(collection, filter, options, flags)
284
+ # Although the docstring claims both hashes and BSON::Documents
285
+ # are acceptable, this class expects the filter and options to
286
+ # contain symbol keys which isn't what the operation layer produces.
287
+ unless BSON::Document === filter
288
+ raise ArgumentError, 'Filter must provide indifferent access'
289
+ end
290
+ unless BSON::Document === options
291
+ raise ArgumentError, 'Options must provide indifferent access'
292
+ end
282
293
  @collection = collection
283
294
  @filter = filter
284
295
  @options = options
@@ -307,7 +318,7 @@ module Mongo
307
318
  #
308
319
  # @since 2.1.0
309
320
  def command_name
310
- ((filter[:$query] || !command?) ? FIND : filter.keys.first).to_s
321
+ ((filter[:$query] || !command?) ? :find : filter.keys.first).to_s
311
322
  end
312
323
 
313
324
  private
@@ -329,15 +340,25 @@ module Mongo
329
340
  end
330
341
 
331
342
  def find_command
332
- document = BSON::Document.new
333
- document.store(FIND, collection)
334
- document.store(FILTER, query_filter)
343
+ document = BSON::Document.new(
344
+ find: collection,
345
+ filter: query_filter,
346
+ )
335
347
  OPTION_MAPPINGS.each do |legacy, option|
336
348
  document.store(option, options[legacy]) unless options[legacy].nil?
337
349
  end
338
- Mongo::Lint.validate_camel_case_read_preference(filter['readPreference'])
350
+ if Lint.enabled?
351
+ filter.each do |k, v|
352
+ unless String === k
353
+ raise Error::LintError, "All keys in filter must be strings: #{filter.inspect}"
354
+ end
355
+ end
356
+ end
357
+ Lint.validate_camel_case_read_preference(filter['readPreference'])
339
358
  SPECIAL_FIELD_MAPPINGS.each do |special, normal|
340
- document.store(normal, filter[special]) unless filter[special].nil?
359
+ unless (v = filter[special]).nil?
360
+ document.store(normal, v)
361
+ end
341
362
  end
342
363
  FLAG_MAPPINGS.each do |legacy, flag|
343
364
  document.store(flag, true) if flags.include?(legacy)
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 2009-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");
@@ -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
  # Wire Protocol Base
2
5
  require 'mongo/protocol/serializers'
3
6
  require 'mongo/protocol/registry'
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  # Copyright (C) 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) 2015-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) 2018-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) 2016-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +17,7 @@
14
17
 
15
18
  module Mongo
16
19
  class Server
17
- # Application metadata that is sent to the server in an ismaster command,
20
+ # Application metadata that is sent to the server during a handshake,
18
21
  # when a new connection is established.
19
22
  #
20
23
  # @api private
@@ -106,25 +109,31 @@ module Mongo
106
109
  # @api private
107
110
  attr_reader :purpose
108
111
 
112
+ # @return [ Hash | nil ] The requested server API version.
113
+ #
114
+ # Thes hash can have the following items:
115
+ # - *:version* -- string
116
+ # - *:strict* -- boolean
117
+ # - *:deprecation_errors* -- boolean
118
+ #
119
+ # @api private
120
+ attr_reader :server_api
121
+
109
122
  # @return [ Array<Hash> | nil ] Information about libraries wrapping
110
123
  # the driver.
111
124
  attr_reader :wrapping_libraries
112
125
 
113
- # Get the bytes of the ismaster message including this metadata.
126
+ # Get the metadata as BSON::Document to be sent to
127
+ # as part of the handshake. The document should
128
+ # be appended to a suitable handshake command.
114
129
  #
115
- # @api private
130
+ # This method ensures that the metadata are valid.
116
131
  #
117
- # @example Get the ismaster message bytes.
118
- # metadata.ismaster_bytes
132
+ # @return [BSON::Document] Valid document for connection's handshake.
119
133
  #
120
- # @return [ String ] The raw bytes.
134
+ # @raise [ Error::InvalidApplicationName ] When the metadata are invalid.
121
135
  #
122
- # @since 2.4.0
123
- # @deprecated
124
- def ismaster_bytes
125
- @ismaster_bytes ||= validate! && serialize.to_s
126
- end
127
-
136
+ # @api private
128
137
  def validated_document
129
138
  validate!
130
139
  document
@@ -132,6 +141,10 @@ module Mongo
132
141
 
133
142
  private
134
143
 
144
+ # Check whether it is possible to build a valid app metadata document
145
+ # with params provided on intialization.
146
+ #
147
+ # @raise [ Error::InvalidApplicationName ] When the metadata are invalid.
135
148
  def validate!
136
149
  if @app_name && @app_name.bytesize > MAX_APP_NAME_SIZE
137
150
  raise Error::InvalidApplicationName.new(@app_name, MAX_APP_NAME_SIZE)
@@ -139,6 +152,10 @@ module Mongo
139
152
  true
140
153
  end
141
154
 
155
+ # Get BSON::Document to be used as value for `client` key in
156
+ # handshake document.
157
+ #
158
+ # @return [BSON::Document] Document describing client for handshake.
142
159
  def full_client_document
143
160
  BSON::Document.new.tap do |doc|
144
161
  doc[:application] = { name: @app_name } if @app_name
@@ -148,10 +165,12 @@ module Mongo
148
165
  end
149
166
  end
150
167
 
151
- def serialize
152
- Protocol::Query.new(Database::ADMIN, Database::COMMAND, document, :limit => -1).serialize
153
- end
154
168
 
169
+ # Get the metadata as BSON::Document to be sent to
170
+ # as part of the handshake. The document should
171
+ # be appended to a suitable handshake command.
172
+ #
173
+ # @return [BSON::Document] Document for connection's handshake.
155
174
  def document
156
175
  @document ||= begin
157
176
  client_document = full_client_document
@@ -165,9 +184,12 @@ module Mongo
165
184
  client_document = nil
166
185
  end
167
186
  end
168
- document = Server::Monitor::Connection::ISMASTER
169
- document = document.merge(compression: @compressors)
170
- document[:client] = client_document
187
+ document = BSON::Document.new(
188
+ {
189
+ compression: @compressors,
190
+ client: client_document,
191
+ }
192
+ )
171
193
  document[:saslSupportedMechs] = @request_auth_mech if @request_auth_mech
172
194
  if @server_api
173
195
  document.update(
@@ -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");
@@ -83,8 +86,12 @@ module Mongo
83
86
  # @param [ Mongo::Server ] server The server the connection is for.
84
87
  # @param [ Hash ] options The connection options.
85
88
  #
86
- # @option options [ Integer ] :generation Connection pool's generation
87
- # for this connection.
89
+ # @option options [ Integer ] :generation The generation of this
90
+ # connection. The generation should only be specified in this option
91
+ # when not in load-balancing mode, and it should be the generation
92
+ # of the connection pool when the connection is created. In
93
+ # load-balancing mode, the generation is set on the connection
94
+ # after the handshake completes.
88
95
  # @option options [ Hash ] :server_api The requested server API version.
89
96
  # This hash can have the following items:
90
97
  # - *:version* -- string
@@ -93,6 +100,10 @@ module Mongo
93
100
  #
94
101
  # @since 2.0.0
95
102
  def initialize(server, options = {})
103
+ if server.load_balancer? && options[:generation]
104
+ raise ArgumentError, "Generation cannot be set when server is a load balancer"
105
+ end
106
+
96
107
  @id = server.next_connection_id
97
108
  @monitoring = server.monitoring
98
109
  @options = options.freeze
@@ -170,6 +181,15 @@ module Mongo
170
181
  # authenticated and be usable.
171
182
  @socket, @description, @compressor = do_connect
172
183
 
184
+ if server.load_balancer?
185
+ if Lint.enabled?
186
+ unless service_id
187
+ raise Error::InternalDriverError, "The connection is to a load balancer and it must have service_id set here, but does not"
188
+ end
189
+ end
190
+ @generation = connection_pool.generation_manager.generation(service_id: service_id)
191
+ end
192
+
173
193
  publish_cmap_event(
174
194
  Monitoring::Event::Cmap::ConnectionReady.new(address, id)
175
195
  )
@@ -182,7 +202,7 @@ module Mongo
182
202
  # Separate method to permit easier mocking in the test suite.
183
203
  #
184
204
  # @return [ Array<Socket, Server::Description> ] Connected socket and
185
- # a server description instance from the ismaster response of the
205
+ # a server description instance from the hello response of the
186
206
  # returned socket.
187
207
  private def do_connect
188
208
  socket = add_server_diagnostics do
@@ -311,7 +331,12 @@ module Mongo
311
331
  yield
312
332
  rescue Error::SocketError => e
313
333
  @error = e
314
- @server.unknown!(generation: e.generation, stop_push_monitor: true)
334
+ @server.unknown!(
335
+ generation: e.generation,
336
+ # or description.service_id?
337
+ service_id: e.service_id,
338
+ stop_push_monitor: true,
339
+ )
315
340
  raise
316
341
  rescue Error::SocketTimeoutError => e
317
342
  @error = e
@@ -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");
@@ -27,7 +30,7 @@ module Mongo
27
30
  include Monitoring::Publishable
28
31
 
29
32
  # The maximum allowed size in bytes that a user-supplied document may
30
- # take up when serialized, if the server's ismaster response does not
33
+ # take up when serialized, if the server's hello response does not
31
34
  # include maxBsonObjectSize field.
32
35
  #
33
36
  # The commands that are sent to the server may exceed this size by
@@ -63,7 +66,7 @@ module Mongo
63
66
  :update_cluster_time
64
67
 
65
68
  # Returns the server description for this connection, derived from
66
- # the isMaster response for the handshake performed on this connection.
69
+ # the hello response for the handshake performed on this connection.
67
70
  #
68
71
  # @note A connection object that hasn't yet connected (handshaken and
69
72
  # authenticated, if authentication is required) does not have a
@@ -85,12 +88,20 @@ module Mongo
85
88
  :max_message_size,
86
89
  :mongos?
87
90
 
91
+ # @return [ nil | Object ] The service id, if any.
92
+ def service_id
93
+ description&.service_id
94
+ end
95
+
88
96
  # Connection pool generation from which this connection was created.
89
97
  # May be nil.
90
98
  #
91
99
  # @return [ Integer | nil ] Connection pool generation.
92
100
  def generation
93
- options[:generation]
101
+ # If the connection is to a load balancer, @generation is set
102
+ # after handshake completes. If the connection is to another server
103
+ # type, generation is specified during connection creation.
104
+ @generation || options[:generation]
94
105
  end
95
106
 
96
107
  def app_metadata
@@ -133,6 +144,8 @@ module Mongo
133
144
  #
134
145
  # @return [ Protocol::Message | nil ] The reply if needed.
135
146
  #
147
+ # @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error.
148
+ #
136
149
  # @since 2.0.0
137
150
  def dispatch(messages, context, options = {})
138
151
  # The monitoring code does not correctly handle multiple messages,
@@ -150,6 +163,7 @@ module Mongo
150
163
 
151
164
  private
152
165
 
166
+ # @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error.
153
167
  def deliver(message, context, options = {})
154
168
  if Lint.enabled? && !@socket
155
169
  raise Error::LintError, "Trying to deliver a message over a disconnected connection (to #{address})"
@@ -157,12 +171,13 @@ module Mongo
157
171
  buffer = serialize(message, context)
158
172
  ensure_connected do |socket|
159
173
  operation_id = Monitoring.next_operation_id
160
- command_started(address, operation_id, message.payload,
174
+ started_event = command_started(address, operation_id, message.payload,
161
175
  socket_object_id: socket.object_id, connection_id: id,
162
176
  connection_generation: generation,
163
177
  server_connection_id: description.server_connection_id,
178
+ service_id: description.service_id,
164
179
  )
165
- start = Time.now
180
+ start = Utils.monotonic_time
166
181
  result = nil
167
182
  begin
168
183
  result = add_server_diagnostics do
@@ -174,12 +189,20 @@ module Mongo
174
189
  end
175
190
  end
176
191
  rescue Exception => e
177
- total_duration = Time.now - start
178
- command_failed(nil, address, operation_id, message.payload, e.message, total_duration)
192
+ total_duration = Utils.monotonic_time - start
193
+ command_failed(nil, address, operation_id, message.payload,
194
+ e.message, total_duration,
195
+ started_event: started_event,
196
+ service_id: description.service_id,
197
+ )
179
198
  raise
180
199
  else
181
- total_duration = Time.now - start
182
- command_completed(result, address, operation_id, message.payload, total_duration)
200
+ total_duration = Utils.monotonic_time - start
201
+ command_completed(result, address, operation_id, message.payload,
202
+ total_duration,
203
+ started_event: started_event,
204
+ service_id: description.service_id,
205
+ )
183
206
  end
184
207
  if result && context.decrypt?
185
208
  result = result.maybe_decrypt(context)
@@ -191,10 +214,10 @@ module Mongo
191
214
  def serialize(message, context, buffer = BSON::ByteBuffer.new)
192
215
  # Driver specifications only mandate the fixed 16MiB limit for
193
216
  # serialized BSON documents. However, the server returns its
194
- # active serialized BSON document size limit in the ismaster response,
217
+ # active serialized BSON document size limit in the hello response,
195
218
  # which is +max_bson_object_size+ below. The +DEFAULT_MAX_BSON_OBJECT_SIZE+
196
219
  # is the 16MiB value mandated by the specifications which we use
197
- # only as the default if the server's ismaster did not contain
220
+ # only as the default if the server's hello did not contain
198
221
  # maxBsonObjectSize.
199
222
  max_bson_size = max_bson_object_size || DEFAULT_MAX_BSON_OBJECT_SIZE
200
223
  if context.encrypt?