mongo 2.13.2 → 2.15.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 (1150) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -2
  3. data.tar.gz.sig +0 -0
  4. data/README.md +5 -2
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +35 -0
  7. data/lib/mongo/active_support.rb +3 -0
  8. data/lib/mongo/address.rb +3 -0
  9. data/lib/mongo/address/ipv4.rb +4 -1
  10. data/lib/mongo/address/ipv6.rb +4 -1
  11. data/lib/mongo/address/unix.rb +3 -0
  12. data/lib/mongo/address/validator.rb +3 -0
  13. data/lib/mongo/auth.rb +4 -1
  14. data/lib/mongo/auth/aws.rb +3 -0
  15. data/lib/mongo/auth/aws/conversation.rb +4 -4
  16. data/lib/mongo/auth/aws/credentials_retriever.rb +3 -0
  17. data/lib/mongo/auth/aws/request.rb +3 -0
  18. data/lib/mongo/auth/base.rb +17 -8
  19. data/lib/mongo/auth/conversation_base.rb +35 -0
  20. data/lib/mongo/auth/cr.rb +3 -0
  21. data/lib/mongo/auth/cr/conversation.rb +9 -29
  22. data/lib/mongo/auth/credential_cache.rb +3 -0
  23. data/lib/mongo/auth/gssapi.rb +3 -0
  24. data/lib/mongo/auth/gssapi/conversation.rb +7 -15
  25. data/lib/mongo/auth/ldap.rb +3 -0
  26. data/lib/mongo/auth/ldap/conversation.rb +6 -14
  27. data/lib/mongo/auth/roles.rb +3 -0
  28. data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
  29. data/lib/mongo/auth/scram.rb +5 -2
  30. data/lib/mongo/auth/scram/conversation.rb +3 -0
  31. data/lib/mongo/auth/scram256.rb +3 -0
  32. data/lib/mongo/auth/scram256/conversation.rb +3 -0
  33. data/lib/mongo/auth/scram_conversation_base.rb +10 -34
  34. data/lib/mongo/auth/stringprep.rb +4 -1
  35. data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
  36. data/lib/mongo/auth/stringprep/tables.rb +3 -0
  37. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
  38. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -1
  39. data/lib/mongo/auth/user.rb +3 -0
  40. data/lib/mongo/auth/user/view.rb +19 -9
  41. data/lib/mongo/auth/x509.rb +3 -0
  42. data/lib/mongo/auth/x509/conversation.rb +7 -25
  43. data/lib/mongo/background_thread.rb +16 -2
  44. data/lib/mongo/bson.rb +3 -0
  45. data/lib/mongo/bulk_write.rb +41 -18
  46. data/lib/mongo/bulk_write/combineable.rb +3 -0
  47. data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
  48. data/lib/mongo/bulk_write/result.rb +3 -0
  49. data/lib/mongo/bulk_write/result_combiner.rb +3 -0
  50. data/lib/mongo/bulk_write/transformable.rb +3 -0
  51. data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
  52. data/lib/mongo/bulk_write/validatable.rb +3 -0
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +133 -15
  55. data/lib/mongo/client_encryption.rb +3 -0
  56. data/lib/mongo/cluster.rb +32 -38
  57. data/lib/mongo/cluster/periodic_executor.rb +3 -0
  58. data/lib/mongo/cluster/reapers/cursor_reaper.rb +9 -2
  59. data/lib/mongo/cluster/reapers/socket_reaper.rb +3 -0
  60. data/lib/mongo/cluster/sdam_flow.rb +17 -0
  61. data/lib/mongo/cluster/topology.rb +3 -0
  62. data/lib/mongo/cluster/topology/base.rb +3 -0
  63. data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
  64. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
  65. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
  66. data/lib/mongo/cluster/topology/sharded.rb +3 -0
  67. data/lib/mongo/cluster/topology/single.rb +4 -1
  68. data/lib/mongo/cluster/topology/unknown.rb +3 -0
  69. data/lib/mongo/cluster_time.rb +3 -0
  70. data/lib/mongo/collection.rb +74 -17
  71. data/lib/mongo/collection/view.rb +27 -20
  72. data/lib/mongo/collection/view/aggregation.rb +29 -5
  73. data/lib/mongo/collection/view/builder.rb +3 -0
  74. data/lib/mongo/collection/view/builder/aggregation.rb +3 -0
  75. data/lib/mongo/collection/view/builder/find_command.rb +41 -18
  76. data/lib/mongo/collection/view/builder/flags.rb +3 -0
  77. data/lib/mongo/collection/view/builder/map_reduce.rb +3 -0
  78. data/lib/mongo/collection/view/builder/modifiers.rb +3 -0
  79. data/lib/mongo/collection/view/builder/op_query.rb +3 -0
  80. data/lib/mongo/collection/view/change_stream.rb +5 -2
  81. data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
  82. data/lib/mongo/collection/view/explainable.rb +30 -8
  83. data/lib/mongo/collection/view/immutable.rb +3 -0
  84. data/lib/mongo/collection/view/iterable.rb +76 -13
  85. data/lib/mongo/collection/view/map_reduce.rb +5 -2
  86. data/lib/mongo/collection/view/readable.rb +68 -23
  87. data/lib/mongo/collection/view/writable.rb +32 -15
  88. data/lib/mongo/crypt.rb +3 -0
  89. data/lib/mongo/crypt/auto_decryption_context.rb +3 -0
  90. data/lib/mongo/crypt/auto_encrypter.rb +4 -1
  91. data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
  92. data/lib/mongo/crypt/binary.rb +3 -0
  93. data/lib/mongo/crypt/binding.rb +4 -1
  94. data/lib/mongo/crypt/context.rb +3 -0
  95. data/lib/mongo/crypt/data_key_context.rb +3 -0
  96. data/lib/mongo/crypt/encryption_io.rb +9 -6
  97. data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
  98. data/lib/mongo/crypt/explicit_encrypter.rb +3 -0
  99. data/lib/mongo/crypt/explicit_encryption_context.rb +3 -0
  100. data/lib/mongo/crypt/handle.rb +3 -0
  101. data/lib/mongo/crypt/hooks.rb +3 -0
  102. data/lib/mongo/crypt/kms_context.rb +3 -0
  103. data/lib/mongo/crypt/status.rb +3 -0
  104. data/lib/mongo/cursor.rb +22 -5
  105. data/lib/mongo/cursor/builder.rb +3 -0
  106. data/lib/mongo/cursor/builder/get_more_command.rb +3 -0
  107. data/lib/mongo/cursor/builder/kill_cursors_command.rb +3 -0
  108. data/lib/mongo/cursor/builder/op_get_more.rb +3 -0
  109. data/lib/mongo/cursor/builder/op_kill_cursors.rb +3 -0
  110. data/lib/mongo/database.rb +32 -6
  111. data/lib/mongo/database/view.rb +4 -1
  112. data/lib/mongo/dbref.rb +3 -0
  113. data/lib/mongo/distinguishing_semaphore.rb +3 -0
  114. data/lib/mongo/error.rb +14 -1
  115. data/lib/mongo/error/auth_error.rb +3 -0
  116. data/lib/mongo/error/bulk_write_error.rb +20 -3
  117. data/lib/mongo/error/change_stream_resumable.rb +3 -0
  118. data/lib/mongo/error/closed_stream.rb +3 -0
  119. data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
  120. data/lib/mongo/error/connection_perished.rb +3 -0
  121. data/lib/mongo/error/credential_check_error.rb +3 -0
  122. data/lib/mongo/error/crypt_error.rb +3 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +3 -0
  124. data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
  125. data/lib/mongo/error/file_not_found.rb +3 -0
  126. data/lib/mongo/error/handshake_error.rb +3 -0
  127. data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
  128. data/lib/mongo/error/internal_driver_error.rb +25 -0
  129. data/lib/mongo/error/invalid_address.rb +3 -0
  130. data/lib/mongo/error/invalid_application_name.rb +3 -0
  131. data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
  132. data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
  133. data/lib/mongo/error/invalid_collection_name.rb +3 -0
  134. data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
  135. data/lib/mongo/error/invalid_database_name.rb +3 -0
  136. data/lib/mongo/error/invalid_document.rb +3 -0
  137. data/lib/mongo/error/invalid_file.rb +3 -0
  138. data/lib/mongo/error/invalid_file_revision.rb +3 -0
  139. data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
  140. data/lib/mongo/error/invalid_nonce.rb +3 -0
  141. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  142. data/lib/mongo/error/invalid_read_option.rb +3 -0
  143. data/lib/mongo/error/invalid_replacement_document.rb +3 -0
  144. data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
  145. data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
  146. data/lib/mongo/error/invalid_server_preference.rb +3 -0
  147. data/lib/mongo/error/invalid_session.rb +3 -0
  148. data/lib/mongo/error/invalid_signature.rb +3 -0
  149. data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
  150. data/lib/mongo/error/invalid_txt_record.rb +3 -0
  151. data/lib/mongo/error/invalid_update_document.rb +3 -0
  152. data/lib/mongo/error/invalid_uri.rb +3 -0
  153. data/lib/mongo/error/invalid_write_concern.rb +3 -0
  154. data/lib/mongo/error/kms_error.rb +3 -0
  155. data/lib/mongo/error/lint_error.rb +3 -0
  156. data/lib/mongo/error/max_bson_size.rb +3 -0
  157. data/lib/mongo/error/max_message_size.rb +3 -0
  158. data/lib/mongo/error/mismatched_domain.rb +3 -0
  159. data/lib/mongo/error/missing_file_chunk.rb +3 -0
  160. data/lib/mongo/error/missing_password.rb +3 -0
  161. data/lib/mongo/error/missing_resume_token.rb +3 -0
  162. data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
  163. data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
  164. data/lib/mongo/error/multi_index_drop.rb +3 -0
  165. data/lib/mongo/error/need_primary_server.rb +3 -0
  166. data/lib/mongo/error/no_server_available.rb +3 -0
  167. data/lib/mongo/error/no_srv_records.rb +3 -0
  168. data/lib/mongo/error/notable.rb +3 -0
  169. data/lib/mongo/error/operation_failure.rb +26 -4
  170. data/lib/mongo/error/parser.rb +69 -13
  171. data/lib/mongo/error/pool_closed_error.rb +3 -0
  172. data/lib/mongo/error/raise_original_error.rb +3 -0
  173. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  174. data/lib/mongo/error/server_api_conflict.rb +26 -0
  175. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  176. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  177. data/lib/mongo/error/session_ended.rb +3 -0
  178. data/lib/mongo/error/sessions_not_supported.rb +3 -0
  179. data/lib/mongo/error/socket_error.rb +3 -0
  180. data/lib/mongo/error/socket_timeout_error.rb +3 -0
  181. data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
  182. data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
  183. data/lib/mongo/error/unexpected_response.rb +3 -0
  184. data/lib/mongo/error/unknown_payload_type.rb +3 -0
  185. data/lib/mongo/error/unmet_dependency.rb +24 -0
  186. data/lib/mongo/error/unsupported_array_filters.rb +3 -0
  187. data/lib/mongo/error/unsupported_collation.rb +3 -0
  188. data/lib/mongo/error/unsupported_features.rb +3 -0
  189. data/lib/mongo/error/unsupported_message_type.rb +3 -0
  190. data/lib/mongo/error/unsupported_option.rb +17 -12
  191. data/lib/mongo/error/write_retryable.rb +3 -0
  192. data/lib/mongo/event.rb +3 -0
  193. data/lib/mongo/event/base.rb +3 -0
  194. data/lib/mongo/event/listeners.rb +3 -0
  195. data/lib/mongo/event/publisher.rb +3 -0
  196. data/lib/mongo/event/subscriber.rb +3 -0
  197. data/lib/mongo/grid.rb +3 -0
  198. data/lib/mongo/grid/file.rb +3 -0
  199. data/lib/mongo/grid/file/chunk.rb +4 -1
  200. data/lib/mongo/grid/file/info.rb +3 -0
  201. data/lib/mongo/grid/fs_bucket.rb +65 -44
  202. data/lib/mongo/grid/stream.rb +3 -0
  203. data/lib/mongo/grid/stream/read.rb +22 -7
  204. data/lib/mongo/grid/stream/write.rb +3 -0
  205. data/lib/mongo/id.rb +3 -0
  206. data/lib/mongo/index.rb +3 -0
  207. data/lib/mongo/index/view.rb +24 -11
  208. data/lib/mongo/lint.rb +5 -1
  209. data/lib/mongo/loggable.rb +3 -0
  210. data/lib/mongo/logger.rb +6 -3
  211. data/lib/mongo/monitoring.rb +20 -8
  212. data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
  213. data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
  214. data/lib/mongo/monitoring/event.rb +3 -0
  215. data/lib/mongo/monitoring/event/cmap.rb +3 -0
  216. data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
  217. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
  218. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
  219. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
  220. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
  221. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
  222. data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
  223. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
  224. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +3 -0
  225. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
  226. data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
  227. data/lib/mongo/monitoring/event/command_failed.rb +32 -5
  228. data/lib/mongo/monitoring/event/command_started.rb +20 -2
  229. data/lib/mongo/monitoring/event/command_succeeded.rb +29 -3
  230. data/lib/mongo/monitoring/event/secure.rb +39 -5
  231. data/lib/mongo/monitoring/event/server_closed.rb +3 -0
  232. data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
  233. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
  234. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
  235. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
  236. data/lib/mongo/monitoring/event/server_opening.rb +3 -0
  237. data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
  238. data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
  239. data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
  240. data/lib/mongo/monitoring/publishable.rb +32 -10
  241. data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
  242. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
  243. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
  244. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
  245. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
  246. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
  247. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
  248. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
  249. data/lib/mongo/operation.rb +7 -2
  250. data/lib/mongo/operation/aggregate.rb +3 -0
  251. data/lib/mongo/operation/aggregate/command.rb +3 -0
  252. data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
  253. data/lib/mongo/operation/aggregate/result.rb +12 -8
  254. data/lib/mongo/operation/collections_info.rb +21 -1
  255. data/lib/mongo/operation/collections_info/command.rb +5 -2
  256. data/lib/mongo/operation/collections_info/result.rb +5 -0
  257. data/lib/mongo/operation/command.rb +3 -0
  258. data/lib/mongo/operation/command/command.rb +3 -0
  259. data/lib/mongo/operation/command/op_msg.rb +3 -0
  260. data/lib/mongo/operation/context.rb +102 -0
  261. data/lib/mongo/operation/count.rb +3 -0
  262. data/lib/mongo/operation/count/command.rb +3 -0
  263. data/lib/mongo/operation/count/op_msg.rb +3 -0
  264. data/lib/mongo/operation/create.rb +3 -0
  265. data/lib/mongo/operation/create/command.rb +3 -0
  266. data/lib/mongo/operation/create/op_msg.rb +3 -0
  267. data/lib/mongo/operation/create_index.rb +3 -0
  268. data/lib/mongo/operation/create_index/command.rb +3 -0
  269. data/lib/mongo/operation/create_index/op_msg.rb +3 -0
  270. data/lib/mongo/operation/create_user.rb +3 -0
  271. data/lib/mongo/operation/create_user/command.rb +3 -0
  272. data/lib/mongo/operation/create_user/op_msg.rb +3 -0
  273. data/lib/mongo/operation/delete.rb +3 -0
  274. data/lib/mongo/operation/delete/bulk_result.rb +5 -0
  275. data/lib/mongo/operation/delete/command.rb +3 -0
  276. data/lib/mongo/operation/delete/legacy.rb +3 -0
  277. data/lib/mongo/operation/delete/op_msg.rb +3 -0
  278. data/lib/mongo/operation/delete/result.rb +6 -0
  279. data/lib/mongo/operation/distinct.rb +3 -0
  280. data/lib/mongo/operation/distinct/command.rb +3 -0
  281. data/lib/mongo/operation/distinct/op_msg.rb +3 -0
  282. data/lib/mongo/operation/drop.rb +3 -0
  283. data/lib/mongo/operation/drop/command.rb +3 -0
  284. data/lib/mongo/operation/drop/op_msg.rb +3 -0
  285. data/lib/mongo/operation/drop_database.rb +3 -0
  286. data/lib/mongo/operation/drop_database/command.rb +3 -0
  287. data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
  288. data/lib/mongo/operation/drop_index.rb +3 -0
  289. data/lib/mongo/operation/drop_index/command.rb +3 -0
  290. data/lib/mongo/operation/drop_index/op_msg.rb +3 -0
  291. data/lib/mongo/operation/explain.rb +3 -0
  292. data/lib/mongo/operation/explain/command.rb +7 -0
  293. data/lib/mongo/operation/explain/legacy.rb +7 -0
  294. data/lib/mongo/operation/explain/op_msg.rb +9 -0
  295. data/lib/mongo/operation/explain/result.rb +6 -0
  296. data/lib/mongo/operation/find.rb +3 -0
  297. data/lib/mongo/operation/find/command.rb +3 -0
  298. data/lib/mongo/operation/find/legacy.rb +3 -0
  299. data/lib/mongo/operation/find/legacy/result.rb +5 -0
  300. data/lib/mongo/operation/find/op_msg.rb +3 -0
  301. data/lib/mongo/operation/find/result.rb +16 -0
  302. data/lib/mongo/operation/get_more.rb +3 -0
  303. data/lib/mongo/operation/get_more/command.rb +3 -0
  304. data/lib/mongo/operation/get_more/legacy.rb +3 -0
  305. data/lib/mongo/operation/get_more/op_msg.rb +3 -0
  306. data/lib/mongo/operation/get_more/result.rb +6 -0
  307. data/lib/mongo/operation/indexes.rb +18 -1
  308. data/lib/mongo/operation/indexes/command.rb +3 -0
  309. data/lib/mongo/operation/indexes/legacy.rb +3 -0
  310. data/lib/mongo/operation/indexes/op_msg.rb +3 -0
  311. data/lib/mongo/operation/indexes/result.rb +8 -0
  312. data/lib/mongo/operation/insert.rb +3 -0
  313. data/lib/mongo/operation/insert/bulk_result.rb +8 -0
  314. data/lib/mongo/operation/insert/command.rb +5 -2
  315. data/lib/mongo/operation/insert/legacy.rb +5 -2
  316. data/lib/mongo/operation/insert/op_msg.rb +5 -2
  317. data/lib/mongo/operation/insert/result.rb +8 -0
  318. data/lib/mongo/operation/kill_cursors.rb +3 -0
  319. data/lib/mongo/operation/kill_cursors/command.rb +3 -0
  320. data/lib/mongo/operation/kill_cursors/legacy.rb +3 -0
  321. data/lib/mongo/operation/kill_cursors/op_msg.rb +3 -0
  322. data/lib/mongo/operation/list_collections.rb +3 -0
  323. data/lib/mongo/operation/list_collections/command.rb +3 -0
  324. data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
  325. data/lib/mongo/operation/list_collections/result.rb +12 -1
  326. data/lib/mongo/operation/map_reduce.rb +3 -0
  327. data/lib/mongo/operation/map_reduce/command.rb +3 -0
  328. data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
  329. data/lib/mongo/operation/map_reduce/result.rb +13 -0
  330. data/lib/mongo/operation/op_msg_base.rb +3 -0
  331. data/lib/mongo/operation/parallel_scan.rb +3 -0
  332. data/lib/mongo/operation/parallel_scan/command.rb +4 -2
  333. data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
  334. data/lib/mongo/operation/parallel_scan/result.rb +7 -0
  335. data/lib/mongo/operation/remove_user.rb +3 -0
  336. data/lib/mongo/operation/remove_user/command.rb +3 -0
  337. data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
  338. data/lib/mongo/operation/result.rb +40 -6
  339. data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
  340. data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
  341. data/lib/mongo/operation/shared/executable.rb +25 -14
  342. data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
  343. data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
  344. data/lib/mongo/operation/shared/idable.rb +5 -1
  345. data/lib/mongo/operation/shared/limited.rb +4 -0
  346. data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
  347. data/lib/mongo/operation/shared/op_msg_or_command.rb +4 -7
  348. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +4 -7
  349. data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
  350. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  351. data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
  352. data/lib/mongo/operation/shared/read_preference_supported.rb +41 -36
  353. data/lib/mongo/operation/shared/response_handling.rb +26 -23
  354. data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
  355. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
  356. data/lib/mongo/operation/shared/sessions_supported.rb +20 -4
  357. data/lib/mongo/operation/shared/specifiable.rb +4 -0
  358. data/lib/mongo/operation/shared/write.rb +12 -18
  359. data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
  360. data/lib/mongo/operation/update.rb +3 -0
  361. data/lib/mongo/operation/update/bulk_result.rb +3 -0
  362. data/lib/mongo/operation/update/command.rb +3 -0
  363. data/lib/mongo/operation/update/legacy.rb +3 -0
  364. data/lib/mongo/operation/update/legacy/result.rb +10 -0
  365. data/lib/mongo/operation/update/op_msg.rb +3 -0
  366. data/lib/mongo/operation/update/result.rb +11 -0
  367. data/lib/mongo/operation/update_user.rb +3 -0
  368. data/lib/mongo/operation/update_user/command.rb +3 -0
  369. data/lib/mongo/operation/update_user/op_msg.rb +3 -0
  370. data/lib/mongo/operation/users_info.rb +3 -0
  371. data/lib/mongo/operation/users_info/command.rb +3 -0
  372. data/lib/mongo/operation/users_info/op_msg.rb +3 -0
  373. data/lib/mongo/operation/users_info/result.rb +6 -0
  374. data/lib/mongo/options.rb +3 -0
  375. data/lib/mongo/options/mapper.rb +3 -0
  376. data/lib/mongo/options/redacted.rb +3 -0
  377. data/lib/mongo/protocol.rb +3 -0
  378. data/lib/mongo/protocol/bit_vector.rb +3 -0
  379. data/lib/mongo/protocol/compressed.rb +54 -5
  380. data/lib/mongo/protocol/delete.rb +3 -0
  381. data/lib/mongo/protocol/get_more.rb +3 -0
  382. data/lib/mongo/protocol/insert.rb +3 -0
  383. data/lib/mongo/protocol/kill_cursors.rb +3 -0
  384. data/lib/mongo/protocol/message.rb +23 -2
  385. data/lib/mongo/protocol/msg.rb +39 -16
  386. data/lib/mongo/protocol/query.rb +18 -14
  387. data/lib/mongo/protocol/registry.rb +3 -0
  388. data/lib/mongo/protocol/reply.rb +3 -0
  389. data/lib/mongo/protocol/serializers.rb +3 -0
  390. data/lib/mongo/protocol/update.rb +3 -0
  391. data/lib/mongo/query_cache.rb +275 -0
  392. data/lib/mongo/retryable.rb +12 -2
  393. data/lib/mongo/semaphore.rb +3 -0
  394. data/lib/mongo/server.rb +29 -16
  395. data/lib/mongo/server/app_metadata.rb +89 -33
  396. data/lib/mongo/server/connection.rb +9 -1
  397. data/lib/mongo/server/connection_base.rb +35 -20
  398. data/lib/mongo/server/connection_common.rb +36 -3
  399. data/lib/mongo/server/connection_pool.rb +14 -6
  400. data/lib/mongo/server/connection_pool/populator.rb +3 -0
  401. data/lib/mongo/server/context.rb +3 -0
  402. data/lib/mongo/server/description.rb +35 -11
  403. data/lib/mongo/server/description/features.rb +13 -9
  404. data/lib/mongo/server/monitor.rb +27 -14
  405. data/lib/mongo/server/monitor/app_metadata.rb +4 -1
  406. data/lib/mongo/server/monitor/connection.rb +60 -50
  407. data/lib/mongo/server/pending_connection.rb +39 -22
  408. data/lib/mongo/server/push_monitor.rb +33 -18
  409. data/lib/mongo/server/push_monitor/connection.rb +3 -0
  410. data/lib/mongo/server/round_trip_time_averager.rb +6 -3
  411. data/lib/mongo/server_selector.rb +3 -0
  412. data/lib/mongo/server_selector/base.rb +11 -4
  413. data/lib/mongo/server_selector/nearest.rb +6 -4
  414. data/lib/mongo/server_selector/primary.rb +6 -4
  415. data/lib/mongo/server_selector/primary_preferred.rb +6 -4
  416. data/lib/mongo/server_selector/secondary.rb +6 -4
  417. data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
  418. data/lib/mongo/session.rb +23 -12
  419. data/lib/mongo/session/server_session.rb +3 -0
  420. data/lib/mongo/session/session_pool.rb +7 -2
  421. data/lib/mongo/socket.rb +42 -10
  422. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  423. data/lib/mongo/socket/ocsp_verifier.rb +376 -0
  424. data/lib/mongo/socket/ssl.rb +56 -24
  425. data/lib/mongo/socket/tcp.rb +3 -0
  426. data/lib/mongo/socket/unix.rb +3 -0
  427. data/lib/mongo/srv.rb +3 -0
  428. data/lib/mongo/srv/monitor.rb +10 -24
  429. data/lib/mongo/srv/resolver.rb +17 -10
  430. data/lib/mongo/srv/result.rb +3 -0
  431. data/lib/mongo/timeout.rb +5 -0
  432. data/lib/mongo/topology_version.rb +4 -1
  433. data/lib/mongo/uri.rb +24 -390
  434. data/lib/mongo/uri/options_mapper.rb +623 -0
  435. data/lib/mongo/uri/srv_protocol.rb +6 -2
  436. data/lib/mongo/utils.rb +57 -1
  437. data/lib/mongo/version.rb +4 -1
  438. data/lib/mongo/write_concern.rb +3 -0
  439. data/lib/mongo/write_concern/acknowledged.rb +3 -0
  440. data/lib/mongo/write_concern/base.rb +3 -0
  441. data/lib/mongo/write_concern/unacknowledged.rb +3 -0
  442. data/spec/NOTES.aws-auth.md +12 -7
  443. data/spec/README.md +87 -2
  444. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  445. data/spec/atlas/operations_spec.rb +3 -0
  446. data/spec/integration/auth_spec.rb +28 -15
  447. data/spec/integration/awaited_ismaster_spec.rb +8 -5
  448. data/spec/integration/aws_auth_request_spec.rb +3 -0
  449. data/spec/integration/aws_credentials_retriever_spec.rb +3 -0
  450. data/spec/integration/bson_symbol_spec.rb +4 -1
  451. data/spec/integration/bulk_insert_spec.rb +3 -0
  452. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  453. data/spec/integration/bulk_write_spec.rb +51 -0
  454. data/spec/integration/change_stream_examples_spec.rb +3 -0
  455. data/spec/integration/change_stream_spec.rb +8 -5
  456. data/spec/integration/check_clean_slate_spec.rb +3 -0
  457. data/spec/integration/client_authentication_options_spec.rb +76 -36
  458. data/spec/integration/client_connectivity_spec.rb +4 -1
  459. data/spec/integration/client_construction_aws_auth_spec.rb +3 -0
  460. data/spec/integration/client_construction_spec.rb +3 -0
  461. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -0
  462. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +3 -0
  463. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -0
  464. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
  465. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +3 -0
  466. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +3 -0
  467. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -0
  468. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +4 -1
  469. data/spec/integration/client_side_encryption/client_close_spec.rb +3 -0
  470. data/spec/integration/client_side_encryption/corpus_spec.rb +3 -0
  471. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +3 -0
  472. data/spec/integration/client_side_encryption/data_key_spec.rb +3 -0
  473. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +3 -0
  474. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +3 -0
  475. data/spec/integration/client_side_encryption/views_spec.rb +3 -0
  476. data/spec/integration/client_spec.rb +5 -2
  477. data/spec/integration/client_update_spec.rb +3 -0
  478. data/spec/integration/collection_indexes_prose_spec.rb +3 -0
  479. data/spec/integration/command_monitoring_spec.rb +63 -25
  480. data/spec/integration/command_spec.rb +3 -0
  481. data/spec/integration/connect_single_rs_name_spec.rb +6 -3
  482. data/spec/integration/connection_pool_populator_spec.rb +7 -2
  483. data/spec/integration/connection_spec.rb +12 -7
  484. data/spec/integration/crud_spec.rb +31 -0
  485. data/spec/integration/cursor_reaping_spec.rb +57 -18
  486. data/spec/integration/docs_examples_spec.rb +11 -1
  487. data/spec/integration/error_detection_spec.rb +3 -0
  488. data/spec/integration/fork_reconnect_spec.rb +64 -3
  489. data/spec/integration/get_more_spec.rb +3 -0
  490. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  491. data/spec/integration/heartbeat_events_spec.rb +7 -4
  492. data/spec/integration/mmapv1_spec.rb +3 -0
  493. data/spec/integration/mongos_pinning_spec.rb +3 -0
  494. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  495. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  496. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  497. data/spec/integration/operation_failure_code_spec.rb +4 -1
  498. data/spec/integration/operation_failure_message_spec.rb +90 -0
  499. data/spec/integration/query_cache_spec.rb +1048 -0
  500. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  501. data/spec/integration/read_concern_spec.rb +3 -0
  502. data/spec/integration/read_preference_spec.rb +3 -0
  503. data/spec/integration/reconnect_spec.rb +4 -1
  504. data/spec/integration/retryable_errors_spec.rb +3 -0
  505. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +3 -0
  506. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +4 -0
  507. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
  508. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
  509. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
  510. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
  511. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
  512. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
  513. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
  514. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
  515. data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
  516. data/spec/integration/retryable_writes_errors_spec.rb +3 -0
  517. data/spec/integration/sdam_error_handling_spec.rb +74 -3
  518. data/spec/integration/sdam_events_spec.rb +14 -10
  519. data/spec/integration/sdam_prose_spec.rb +4 -1
  520. data/spec/integration/secondary_reads_spec.rb +102 -0
  521. data/spec/integration/server_description_spec.rb +3 -0
  522. data/spec/integration/server_monitor_spec.rb +4 -1
  523. data/spec/integration/server_selection_spec.rb +39 -0
  524. data/spec/integration/server_selector_spec.rb +3 -0
  525. data/spec/integration/server_spec.rb +3 -0
  526. data/spec/integration/shell_examples_spec.rb +3 -0
  527. data/spec/integration/size_limit_spec.rb +3 -0
  528. data/spec/integration/snappy_compression_spec.rb +28 -0
  529. data/spec/integration/srv_monitoring_spec.rb +42 -4
  530. data/spec/integration/srv_spec.rb +59 -0
  531. data/spec/integration/ssl_uri_options_spec.rb +3 -0
  532. data/spec/integration/step_down_spec.rb +3 -0
  533. data/spec/integration/time_zone_querying_spec.rb +3 -0
  534. data/spec/integration/transactions_api_examples_spec.rb +3 -0
  535. data/spec/integration/transactions_examples_spec.rb +26 -7
  536. data/spec/integration/truncated_utf8_spec.rb +26 -0
  537. data/spec/integration/versioned_api_examples_spec.rb +69 -0
  538. data/spec/integration/x509_auth_spec.rb +4 -1
  539. data/spec/integration/zlib_compression_spec.rb +4 -1
  540. data/spec/integration/zstd_compression_spec.rb +29 -0
  541. data/spec/kerberos/kerberos_spec.rb +3 -0
  542. data/spec/lite_spec_helper.rb +18 -4
  543. data/spec/mongo/address/ipv4_spec.rb +3 -0
  544. data/spec/mongo/address/ipv6_spec.rb +3 -0
  545. data/spec/mongo/address/unix_spec.rb +3 -0
  546. data/spec/mongo/address/validator_spec.rb +3 -0
  547. data/spec/mongo/address_spec.rb +19 -12
  548. data/spec/mongo/auth/aws/request_region_spec.rb +3 -0
  549. data/spec/mongo/auth/aws/request_spec.rb +3 -0
  550. data/spec/mongo/auth/cr_spec.rb +3 -0
  551. data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
  552. data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
  553. data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
  554. data/spec/mongo/auth/ldap_spec.rb +8 -1
  555. data/spec/mongo/auth/scram/conversation_spec.rb +3 -0
  556. data/spec/mongo/auth/scram256/conversation_spec.rb +3 -0
  557. data/spec/mongo/auth/scram_negotiation_spec.rb +4 -1
  558. data/spec/mongo/auth/scram_spec.rb +4 -1
  559. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  560. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  561. data/spec/mongo/auth/user/view_spec.rb +3 -0
  562. data/spec/mongo/auth/user_spec.rb +4 -1
  563. data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
  564. data/spec/mongo/auth/x509_spec.rb +3 -0
  565. data/spec/mongo/auth_spec.rb +3 -0
  566. data/spec/mongo/bson_spec.rb +3 -0
  567. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  568. data/spec/mongo/bulk_write/result_spec.rb +3 -0
  569. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  570. data/spec/mongo/bulk_write_spec.rb +5 -2
  571. data/spec/mongo/caching_cursor_spec.rb +73 -0
  572. data/spec/mongo/client_construction_spec.rb +268 -36
  573. data/spec/mongo/client_encryption_spec.rb +3 -0
  574. data/spec/mongo/client_spec.rb +67 -0
  575. data/spec/mongo/cluster/cursor_reaper_spec.rb +3 -0
  576. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -0
  577. data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
  578. data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
  579. data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
  580. data/spec/mongo/cluster/topology/single_spec.rb +20 -8
  581. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  582. data/spec/mongo/cluster/topology_spec.rb +4 -1
  583. data/spec/mongo/cluster_spec.rb +10 -18
  584. data/spec/mongo/cluster_time_spec.rb +3 -0
  585. data/spec/mongo/collection/view/aggregation_spec.rb +3 -0
  586. data/spec/mongo/collection/view/builder/find_command_spec.rb +3 -0
  587. data/spec/mongo/collection/view/builder/flags_spec.rb +3 -0
  588. data/spec/mongo/collection/view/builder/modifiers_spec.rb +3 -0
  589. data/spec/mongo/collection/view/builder/op_query_spec.rb +3 -0
  590. data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
  591. data/spec/mongo/collection/view/change_stream_spec.rb +16 -0
  592. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  593. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  594. data/spec/mongo/collection/view/iterable_spec.rb +3 -0
  595. data/spec/mongo/collection/view/map_reduce_spec.rb +5 -0
  596. data/spec/mongo/collection/view/readable_spec.rb +69 -0
  597. data/spec/mongo/collection/view/writable_spec.rb +3 -0
  598. data/spec/mongo/collection/view_spec.rb +3 -0
  599. data/spec/mongo/collection_crud_spec.rb +4360 -0
  600. data/spec/mongo/collection_ddl_spec.rb +537 -0
  601. data/spec/mongo/collection_spec.rb +8 -4787
  602. data/spec/mongo/crypt/auto_decryption_context_spec.rb +4 -1
  603. data/spec/mongo/crypt/auto_encrypter_spec.rb +3 -0
  604. data/spec/mongo/crypt/auto_encryption_context_spec.rb +4 -1
  605. data/spec/mongo/crypt/binary_spec.rb +3 -5
  606. data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
  607. data/spec/mongo/crypt/binding/context_spec.rb +4 -6
  608. data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
  609. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +4 -6
  610. data/spec/mongo/crypt/binding/status_spec.rb +3 -5
  611. data/spec/mongo/crypt/binding/version_spec.rb +3 -5
  612. data/spec/mongo/crypt/binding_unloaded_spec.rb +3 -0
  613. data/spec/mongo/crypt/data_key_context_spec.rb +3 -0
  614. data/spec/mongo/crypt/encryption_io_spec.rb +3 -0
  615. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +4 -1
  616. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +4 -1
  617. data/spec/mongo/crypt/handle_spec.rb +3 -0
  618. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
  619. data/spec/mongo/crypt/status_spec.rb +3 -5
  620. data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -2
  621. data/spec/mongo/cursor/builder/op_get_more_spec.rb +7 -2
  622. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +7 -2
  623. data/spec/mongo/cursor_spec.rb +74 -7
  624. data/spec/mongo/database_spec.rb +119 -10
  625. data/spec/mongo/dbref_spec.rb +3 -0
  626. data/spec/mongo/distinguishing_semaphore_spec.rb +3 -0
  627. data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
  628. data/spec/mongo/error/crypt_error_spec.rb +3 -0
  629. data/spec/mongo/error/max_bson_size_spec.rb +3 -0
  630. data/spec/mongo/error/no_server_available_spec.rb +4 -1
  631. data/spec/mongo/error/notable_spec.rb +3 -0
  632. data/spec/mongo/error/operation_failure_heavy_spec.rb +3 -0
  633. data/spec/mongo/error/operation_failure_spec.rb +94 -31
  634. data/spec/mongo/error/parser_spec.rb +40 -6
  635. data/spec/mongo/error/unsupported_option_spec.rb +3 -0
  636. data/spec/mongo/event/publisher_spec.rb +3 -0
  637. data/spec/mongo/event/subscriber_spec.rb +3 -0
  638. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  639. data/spec/mongo/grid/file/info_spec.rb +3 -0
  640. data/spec/mongo/grid/file_spec.rb +4 -1
  641. data/spec/mongo/grid/fs_bucket_spec.rb +22 -5
  642. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  643. data/spec/mongo/grid/stream/write_spec.rb +3 -0
  644. data/spec/mongo/grid/stream_spec.rb +3 -0
  645. data/spec/mongo/id_spec.rb +3 -0
  646. data/spec/mongo/index/view_spec.rb +11 -2
  647. data/spec/mongo/lint_spec.rb +3 -0
  648. data/spec/mongo/logger_spec.rb +16 -11
  649. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  650. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  651. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  652. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
  653. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
  654. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  657. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  658. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  661. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  663. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  664. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  665. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
  666. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  667. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  668. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  669. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  670. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  671. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  672. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  673. data/spec/mongo/monitoring_spec.rb +3 -0
  674. data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
  675. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  676. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  677. data/spec/mongo/operation/command_spec.rb +11 -5
  678. data/spec/mongo/operation/create_index_spec.rb +9 -3
  679. data/spec/mongo/operation/create_user_spec.rb +9 -3
  680. data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
  681. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  682. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -3
  683. data/spec/mongo/operation/delete_spec.rb +14 -7
  684. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  685. data/spec/mongo/operation/find/legacy_spec.rb +7 -2
  686. data/spec/mongo/operation/get_more_spec.rb +6 -1
  687. data/spec/mongo/operation/indexes_spec.rb +8 -1
  688. data/spec/mongo/operation/insert/bulk_spec.rb +13 -7
  689. data/spec/mongo/operation/insert/command_spec.rb +5 -2
  690. data/spec/mongo/operation/insert/op_msg_spec.rb +6 -3
  691. data/spec/mongo/operation/insert_spec.rb +18 -12
  692. data/spec/mongo/operation/kill_cursors_spec.rb +3 -0
  693. data/spec/mongo/operation/limited_spec.rb +3 -0
  694. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  695. data/spec/mongo/operation/read_preference_legacy_spec.rb +35 -42
  696. data/spec/mongo/operation/read_preference_op_msg_spec.rb +7 -4
  697. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  698. data/spec/mongo/operation/result_spec.rb +10 -5
  699. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  700. data/spec/mongo/operation/update/bulk_spec.rb +12 -6
  701. data/spec/mongo/operation/update/command_spec.rb +5 -2
  702. data/spec/mongo/operation/update/op_msg_spec.rb +6 -3
  703. data/spec/mongo/operation/update_spec.rb +13 -7
  704. data/spec/mongo/operation/update_user_spec.rb +7 -1
  705. data/spec/mongo/options/redacted_spec.rb +3 -0
  706. data/spec/mongo/protocol/compressed_spec.rb +29 -12
  707. data/spec/mongo/protocol/delete_spec.rb +3 -0
  708. data/spec/mongo/protocol/get_more_spec.rb +3 -0
  709. data/spec/mongo/protocol/insert_spec.rb +3 -0
  710. data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
  711. data/spec/mongo/protocol/msg_spec.rb +4 -1
  712. data/spec/mongo/protocol/query_spec.rb +6 -3
  713. data/spec/mongo/protocol/registry_spec.rb +3 -0
  714. data/spec/mongo/protocol/reply_spec.rb +3 -0
  715. data/spec/mongo/protocol/update_spec.rb +3 -0
  716. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  717. data/spec/mongo/query_cache_spec.rb +283 -0
  718. data/spec/mongo/retryable_spec.rb +6 -2
  719. data/spec/mongo/semaphore_spec.rb +3 -0
  720. data/spec/mongo/server/app_metadata_spec.rb +46 -21
  721. data/spec/mongo/server/connection_auth_spec.rb +6 -9
  722. data/spec/mongo/server/connection_common_spec.rb +24 -0
  723. data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
  724. data/spec/mongo/server/connection_pool_spec.rb +11 -4
  725. data/spec/mongo/server/connection_spec.rb +48 -25
  726. data/spec/mongo/server/description/features_spec.rb +3 -0
  727. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  728. data/spec/mongo/server/description_spec.rb +625 -594
  729. data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
  730. data/spec/mongo/server/monitor/connection_spec.rb +57 -7
  731. data/spec/mongo/server/monitor_spec.rb +22 -11
  732. data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
  733. data/spec/mongo/server_selector/nearest_spec.rb +8 -2
  734. data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
  735. data/spec/mongo/server_selector/primary_spec.rb +8 -2
  736. data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
  737. data/spec/mongo/server_selector/secondary_spec.rb +8 -2
  738. data/spec/mongo/server_selector_spec.rb +7 -3
  739. data/spec/mongo/server_spec.rb +18 -2
  740. data/spec/mongo/session/server_session_spec.rb +3 -0
  741. data/spec/mongo/session/session_pool_spec.rb +3 -0
  742. data/spec/mongo/session_spec.rb +3 -0
  743. data/spec/mongo/session_transaction_spec.rb +7 -12
  744. data/spec/mongo/socket/ssl_spec.rb +47 -4
  745. data/spec/mongo/socket/tcp_spec.rb +3 -0
  746. data/spec/mongo/socket/unix_spec.rb +3 -0
  747. data/spec/mongo/socket_spec.rb +5 -2
  748. data/spec/mongo/srv/monitor_spec.rb +3 -0
  749. data/spec/mongo/srv/result_spec.rb +3 -0
  750. data/spec/mongo/timeout_spec.rb +3 -0
  751. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  752. data/spec/mongo/uri/srv_protocol_spec.rb +68 -33
  753. data/spec/mongo/uri_option_parsing_spec.rb +14 -11
  754. data/spec/mongo/uri_spec.rb +71 -41
  755. data/spec/mongo/utils_spec.rb +56 -0
  756. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  757. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  758. data/spec/mongo/write_concern_spec.rb +3 -0
  759. data/spec/runners/auth.rb +25 -1
  760. data/spec/runners/change_streams/outcome.rb +3 -0
  761. data/spec/runners/change_streams/spec.rb +3 -0
  762. data/spec/runners/change_streams/test.rb +4 -1
  763. data/spec/runners/cmap.rb +3 -0
  764. data/spec/runners/cmap/verifier.rb +3 -0
  765. data/spec/runners/command_monitoring.rb +3 -0
  766. data/spec/runners/connection_string.rb +34 -124
  767. data/spec/runners/crud.rb +22 -0
  768. data/spec/runners/crud/context.rb +3 -0
  769. data/spec/runners/crud/operation.rb +3 -0
  770. data/spec/runners/crud/outcome.rb +3 -0
  771. data/spec/runners/crud/requirement.rb +67 -3
  772. data/spec/runners/crud/spec.rb +3 -0
  773. data/spec/runners/crud/test.rb +3 -0
  774. data/spec/runners/crud/test_base.rb +3 -19
  775. data/spec/runners/crud/verifier.rb +11 -0
  776. data/spec/runners/gridfs.rb +3 -0
  777. data/spec/runners/read_write_concern_document.rb +3 -0
  778. data/spec/runners/sdam.rb +6 -3
  779. data/spec/runners/sdam/verifier.rb +3 -0
  780. data/spec/runners/server_selection.rb +4 -1
  781. data/spec/runners/server_selection_rtt.rb +4 -1
  782. data/spec/runners/transactions.rb +3 -0
  783. data/spec/runners/transactions/operation.rb +16 -2
  784. data/spec/runners/transactions/spec.rb +3 -0
  785. data/spec/runners/transactions/test.rb +6 -2
  786. data/spec/runners/unified.rb +99 -0
  787. data/spec/runners/unified/assertions.rb +282 -0
  788. data/spec/runners/unified/change_stream_operations.rb +29 -0
  789. data/spec/runners/unified/crud_operations.rb +206 -0
  790. data/spec/runners/unified/ddl_operations.rb +106 -0
  791. data/spec/runners/unified/entity_map.rb +42 -0
  792. data/spec/runners/unified/error.rb +28 -0
  793. data/spec/runners/unified/event_subscriber.rb +104 -0
  794. data/spec/runners/unified/exceptions.rb +24 -0
  795. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  796. data/spec/runners/unified/support_operations.rb +253 -0
  797. data/spec/runners/unified/test.rb +423 -0
  798. data/spec/runners/unified/test_group.rb +31 -0
  799. data/spec/runners/unified/using_hash.rb +34 -0
  800. data/spec/shared/bin/get-mongodb-download-url +17 -0
  801. data/spec/shared/bin/s3-copy +45 -0
  802. data/spec/shared/bin/s3-upload +69 -0
  803. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  804. data/spec/shared/lib/mrss/constraints.rb +82 -6
  805. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  806. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  807. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  808. data/spec/shared/lib/mrss/spec_organizer.rb +32 -2
  809. data/spec/shared/lib/mrss/utils.rb +15 -0
  810. data/spec/shared/share/Dockerfile.erb +322 -0
  811. data/spec/shared/share/haproxy-1.conf +16 -0
  812. data/spec/shared/share/haproxy-2.conf +17 -0
  813. data/spec/shared/shlib/distro.sh +73 -0
  814. data/spec/shared/shlib/server.sh +317 -0
  815. data/spec/shared/shlib/set_env.sh +131 -0
  816. data/spec/solo/clean_exit_spec.rb +24 -0
  817. data/spec/spec_helper.rb +11 -4
  818. data/spec/spec_tests/auth_spec.rb +30 -13
  819. data/spec/spec_tests/change_streams_spec.rb +3 -0
  820. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  821. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  822. data/spec/spec_tests/cmap_spec.rb +10 -3
  823. data/spec/spec_tests/collection_management_spec.rb +13 -0
  824. data/spec/spec_tests/command_monitoring_spec.rb +31 -26
  825. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  826. data/spec/spec_tests/connection_string_spec.rb +3 -0
  827. data/spec/spec_tests/crud_spec.rb +3 -0
  828. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  829. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +5 -6
  830. data/spec/spec_tests/data/change_streams/{change-streams-resume-whitelist.yml → change-streams-resume-allowlist.yml} +58 -58
  831. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +46 -46
  832. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  833. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  834. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  835. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  836. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  837. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  838. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  839. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  840. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  841. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  842. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  843. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  844. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  845. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
  846. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +6 -5
  847. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -0
  848. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +6 -5
  849. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -0
  850. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +6 -5
  851. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -0
  852. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
  853. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
  854. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
  855. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  856. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  857. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  858. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +3 -1
  859. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
  860. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
  861. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
  862. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
  863. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
  864. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
  865. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
  866. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
  867. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
  868. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
  869. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
  870. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  871. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
  872. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  873. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +5 -4
  874. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
  875. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
  876. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
  877. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
  878. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
  879. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  880. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml} +5 -4
  881. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMasterOrSecondary.yml → non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml} +5 -4
  882. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-greater-NotMaster.yml → non-stale-topologyVersion-greater-NotWritablePrimary.yml} +5 -4
  883. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
  884. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
  885. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
  886. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
  887. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  888. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml} +5 -4
  889. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMasterOrSecondary.yml → non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml} +5 -4
  890. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-missing-NotMaster.yml → non-stale-topologyVersion-missing-NotWritablePrimary.yml} +5 -4
  891. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
  892. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
  893. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
  894. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
  895. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  896. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml} +5 -4
  897. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml → non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml} +5 -4
  898. data/spec/spec_tests/data/sdam/errors/{non-stale-topologyVersion-proccessId-changed-NotMaster.yml → non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml} +5 -4
  899. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
  900. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
  901. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
  902. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
  903. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  904. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterNoSlaveOk.yml → post-42-NotPrimaryNoSecondaryOk.yml} +5 -4
  905. data/spec/spec_tests/data/sdam/errors/{post-42-NotMasterOrSecondary.yml → post-42-NotPrimaryOrSecondary.yml} +5 -4
  906. data/spec/spec_tests/data/sdam/errors/{post-42-NotMaster.yml → post-42-NotWritablePrimary.yml} +5 -4
  907. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
  908. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
  909. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
  910. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
  911. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMaster.yml → pre-42-LegacyNotPrimary.yml} +6 -5
  912. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  913. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterOrSecondary.yml → pre-42-NotPrimaryOrSecondary.yml} +5 -4
  914. data/spec/spec_tests/data/sdam/errors/{pre-42-NotMasterNoSlaveOk.yml → pre-42-NotWritablePrimary.yml} +6 -5
  915. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
  916. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
  917. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  918. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
  919. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
  920. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterNoSlaveOk.yml → stale-generation-NotPrimaryNoSecondaryOk.yml} +7 -5
  921. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMasterOrSecondary.yml → stale-generation-NotPrimaryOrSecondary.yml} +7 -5
  922. data/spec/spec_tests/data/sdam/errors/{stale-generation-NotMaster.yml → stale-generation-NotWritablePrimary.yml} +7 -5
  923. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
  924. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
  925. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  926. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  927. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMaster.yml → stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  928. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  929. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  930. data/spec/spec_tests/data/sdam/errors/{stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  931. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  932. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
  933. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
  934. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
  935. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
  936. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
  937. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMaster.yml → stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml} +8 -6
  938. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  939. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml → stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml} +7 -5
  940. data/spec/spec_tests/data/sdam/errors/{stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml → stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml} +8 -6
  941. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
  942. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
  943. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
  944. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
  945. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
  946. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
  947. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  948. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterNoSlaveOk.yml → stale-topologyVersion-NotPrimaryNoSecondaryOk.yml} +7 -6
  949. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMasterOrSecondary.yml → stale-topologyVersion-NotPrimaryOrSecondary.yml} +7 -6
  950. data/spec/spec_tests/data/sdam/errors/{stale-topologyVersion-NotMaster.yml → stale-topologyVersion-NotWritablePrimary.yml} +7 -6
  951. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
  952. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
  953. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  954. data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
  955. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
  956. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
  957. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
  958. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
  959. data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
  960. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
  961. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
  962. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
  963. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
  964. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
  965. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
  966. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
  967. data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
  968. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
  969. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
  970. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  971. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  972. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  973. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
  974. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
  975. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
  976. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  977. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  978. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  979. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  980. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  981. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  982. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  983. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  984. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  985. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  986. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  987. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  988. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  989. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  990. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  991. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  992. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  993. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  994. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  995. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  996. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
  997. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  998. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  999. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1000. data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
  1001. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
  1002. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1003. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1004. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1005. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
  1006. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1007. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1008. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1009. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1010. data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
  1011. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1012. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
  1013. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
  1014. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
  1015. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1016. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1017. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1018. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1019. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
  1020. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1021. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1022. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1023. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1024. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1025. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1026. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1027. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
  1028. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
  1029. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
  1030. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
  1031. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
  1032. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
  1033. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
  1034. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
  1035. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
  1036. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1037. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1038. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1039. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +3 -3
  1040. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1041. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1042. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
  1043. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +1 -1
  1044. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +2 -2
  1045. data/spec/spec_tests/data/sdam_integration/{isMaster-command-error.yml → hello-command-error.yml} +19 -29
  1046. data/spec/spec_tests/data/sdam_integration/{isMaster-network-error.yml → hello-network-error.yml} +9 -15
  1047. data/spec/spec_tests/data/sdam_integration/{isMaster-timeout.yml → hello-timeout.yml} +7 -13
  1048. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +14 -3
  1049. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1050. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1051. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1052. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +3 -2
  1053. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1054. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1055. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1056. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
  1057. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  1058. data/spec/spec_tests/data/transactions/error-labels.yml +3 -0
  1059. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1060. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +2 -0
  1061. data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
  1062. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1063. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1064. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1065. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1066. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1067. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1068. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1069. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1070. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1071. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1072. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1073. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1074. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  1075. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1076. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1077. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  1078. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  1079. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1080. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1081. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1082. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1083. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1084. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1085. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +12 -1
  1086. data/spec/spec_tests/gridfs_spec.rb +3 -0
  1087. data/spec/spec_tests/max_staleness_spec.rb +3 -0
  1088. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
  1089. data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
  1090. data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
  1091. data/spec/spec_tests/retryable_reads_spec.rb +3 -0
  1092. data/spec/spec_tests/retryable_writes_spec.rb +9 -6
  1093. data/spec/spec_tests/sdam_integration_spec.rb +3 -0
  1094. data/spec/spec_tests/sdam_monitoring_spec.rb +4 -1
  1095. data/spec/spec_tests/sdam_spec.rb +4 -1
  1096. data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
  1097. data/spec/spec_tests/server_selection_spec.rb +3 -0
  1098. data/spec/spec_tests/transactions_api_spec.rb +3 -0
  1099. data/spec/spec_tests/transactions_spec.rb +3 -0
  1100. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1101. data/spec/spec_tests/unified_spec.rb +18 -0
  1102. data/spec/spec_tests/uri_options_spec.rb +50 -33
  1103. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1104. data/spec/stress/cleanup_spec.rb +3 -0
  1105. data/spec/stress/connection_pool_stress_spec.rb +3 -0
  1106. data/spec/stress/connection_pool_timing_spec.rb +3 -0
  1107. data/spec/stress/fork_reconnect_stress_spec.rb +7 -4
  1108. data/spec/support/authorization.rb +3 -0
  1109. data/spec/support/aws_utils.rb +3 -0
  1110. data/spec/support/aws_utils/base.rb +3 -0
  1111. data/spec/support/aws_utils/inspector.rb +3 -0
  1112. data/spec/support/aws_utils/orchestrator.rb +3 -0
  1113. data/spec/support/aws_utils/provisioner.rb +3 -0
  1114. data/spec/support/background_thread_registry.rb +4 -1
  1115. data/spec/support/certificates/README.md +3 -2
  1116. data/spec/support/certificates/atlas-ocsp-ca.crt +118 -0
  1117. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1118. data/spec/support/client_registry.rb +12 -5
  1119. data/spec/support/client_registry_macros.rb +17 -5
  1120. data/spec/support/cluster_tools.rb +4 -1
  1121. data/spec/support/common_shortcuts.rb +84 -6
  1122. data/spec/support/constraints.rb +9 -253
  1123. data/spec/support/crypt.rb +3 -0
  1124. data/spec/support/dns.rb +3 -0
  1125. data/spec/support/event_subscriber.rb +9 -0
  1126. data/spec/support/json_ext_formatter.rb +3 -0
  1127. data/spec/support/keyword_struct.rb +3 -0
  1128. data/spec/support/local_resource_registry.rb +3 -0
  1129. data/spec/support/matchers.rb +20 -1
  1130. data/spec/support/monitoring_ext.rb +3 -0
  1131. data/spec/support/ocsp +1 -0
  1132. data/spec/support/primary_socket.rb +3 -0
  1133. data/spec/support/sdam_formatter_integration.rb +3 -0
  1134. data/spec/support/session_registry.rb +55 -0
  1135. data/spec/{mongo/server/app_metadata_shared.rb → support/shared/app_metadata.rb} +39 -8
  1136. data/spec/support/shared/protocol.rb +3 -0
  1137. data/spec/support/shared/scram_conversation.rb +3 -0
  1138. data/spec/support/shared/server_selector.rb +6 -3
  1139. data/spec/support/shared/session.rb +5 -2
  1140. data/spec/support/spec_config.rb +111 -12
  1141. data/spec/support/spec_setup.rb +51 -38
  1142. data/spec/support/utils.rb +106 -5
  1143. metadata +1177 -982
  1144. metadata.gz.sig +3 -2
  1145. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  1146. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  1147. data/spec/support/child_process_helper.rb +0 -78
  1148. data/spec/support/cluster_config.rb +0 -207
  1149. data/spec/support/lite_constraints.rb +0 -141
  1150. data/spec/support/spec_organizer.rb +0 -129
@@ -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");
@@ -63,6 +66,11 @@ module Mongo
63
66
  end
64
67
 
65
68
  result = handshake!(speculative_auth_doc: speculative_auth_doc)
69
+
70
+ if description.unknown?
71
+ raise Error::InternalDriverError, "Connection description cannot be unknown after successful handshake: #{description.inspect}"
72
+ end
73
+
66
74
  if speculative_auth_doc && (speculative_auth_result = result['speculativeAuthenticate'])
67
75
  unless description.features.scram_sha_1_enabled?
68
76
  raise Error::InvalidServerAuthResponse, "Speculative auth succeeded on a pre-3.0 server"
@@ -80,45 +88,54 @@ module Mongo
80
88
  speculative_auth_result: speculative_auth_result,
81
89
  )
82
90
  else
83
- raise NotImplementedError, "Speculative auth unexpectedly succeeded for mechanism #{speculative_auth_user.mechanism.inspect}"
91
+ raise Error::InternalDriverError, "Speculative auth unexpectedly succeeded for mechanism #{speculative_auth_user.mechanism.inspect}"
84
92
  end
85
93
  elsif !description.arbiter?
86
94
  authenticate!
87
95
  end
96
+
97
+ if description.unknown?
98
+ raise Error::InternalDriverError, "Connection description cannot be unknown after successful authentication: #{description.inspect}"
99
+ end
88
100
  end
89
101
 
90
102
  private
91
103
 
92
104
  # @param [ BSON::Document | nil ] speculative_auth_doc The document to
93
- # provide in speculativeAuthenticate field of ismaster command.
105
+ # provide in speculativeAuthenticate field of handshake command.
94
106
  #
95
- # @return [ BSON::Document ] The document of the ismaster response for
107
+ # @return [ BSON::Document ] The document of the handshake response for
96
108
  # this particular connection.
97
109
  def handshake!(speculative_auth_doc: nil)
98
110
  unless socket
99
- raise Error::HandshakeError, "Cannot handshake because there is no usable socket (for #{address})"
111
+ raise Error::InternalDriverError, "Cannot handshake because there is no usable socket (for #{address})"
100
112
  end
101
113
 
102
- ismaster_doc = app_metadata.validated_document
103
- if speculative_auth_doc
104
- ismaster_doc = ismaster_doc.merge(speculativeAuthenticate: speculative_auth_doc)
105
- end
114
+ hello_doc = handshake_document(
115
+ app_metadata,
116
+ speculative_auth_doc: speculative_auth_doc,
117
+ server_api: options[:server_api],
118
+ )
106
119
 
107
- ismaster_command = Protocol::Query.new(Database::ADMIN, Database::COMMAND,
108
- ismaster_doc, :limit => -1)
120
+ # TODO (DR): OP_MSG should be used if api version is declared.
121
+ # See https://github.com/mongodb/specifications/blob/master/source/message/OP_MSG.rst#id5
122
+ hello_command = Protocol::Query.new(Database::ADMIN, Database::COMMAND, hello_doc, :limit => -1)
109
123
 
110
- response = nil
124
+ doc = nil
111
125
  @server.handle_handshake_failure! do
112
126
  begin
113
127
  response = @server.round_trip_time_averager.measure do
114
128
  add_server_diagnostics do
115
- socket.write(ismaster_command.serialize.to_s)
116
- Protocol::Message.deserialize(socket, Protocol::Message::MAX_MESSAGE_SIZE).documents.first
129
+ socket.write(hello_command.serialize.to_s)
130
+ Protocol::Message.deserialize(socket, Protocol::Message::MAX_MESSAGE_SIZE)
117
131
  end
118
132
  end
133
+ result = Operation::Result.new([response])
134
+ result.validate!
135
+ doc = result.documents.first
119
136
  rescue => exc
120
137
  msg = "Failed to handshake with #{address}"
121
- Utils.warn_monitor_exception(msg, exc,
138
+ Utils.warn_bg_exception(msg, exc,
122
139
  logger: options[:logger],
123
140
  log_prefix: options[:log_prefix],
124
141
  bg_error_backtrace: options[:bg_error_backtrace],
@@ -127,9 +144,9 @@ module Mongo
127
144
  end
128
145
  end
129
146
 
130
- post_handshake(response, @server.round_trip_time_averager.average_round_trip_time)
147
+ post_handshake(doc, @server.round_trip_time_averager.average_round_trip_time)
131
148
 
132
- response
149
+ doc
133
150
  end
134
151
 
135
152
  # @param [ String | nil ] speculative_auth_client_nonce The client
@@ -139,7 +156,7 @@ module Mongo
139
156
  # for speculative auth, if speculative auth succeeded. If speculative
140
157
  # auth was not performed or it failed, this must be nil.
141
158
  # @param [ BSON::Document | nil ] speculative_auth_result The
142
- # value of speculativeAuthenticate field of ismaster response of
159
+ # value of speculativeAuthenticate field of hello response of
143
160
  # the handshake on this connection.
144
161
  def authenticate!(
145
162
  speculative_auth_client_nonce: nil,
@@ -158,7 +175,7 @@ module Mongo
158
175
  auth.login
159
176
  rescue => exc
160
177
  msg = "Failed to authenticate to #{address}"
161
- Utils.warn_monitor_exception(msg, exc,
178
+ Utils.warn_bg_exception(msg, exc,
162
179
  logger: options[:logger],
163
180
  log_prefix: options[:log_prefix],
164
181
  bg_error_backtrace: options[:bg_error_backtrace],
@@ -176,12 +193,12 @@ module Mongo
176
193
  # This is a separate method to keep the nesting level down.
177
194
  #
178
195
  # @return [ Server::Description ] The server description calculated from
179
- # ismaster response for this particular connection.
196
+ # hello response for this particular connection.
180
197
  def post_handshake(response, average_rtt)
181
198
  if response["ok"] == 1
182
199
  # Auth mechanism is entirely dependent on the contents of
183
- # ismaster response *for this connection*.
184
- # Ismaster received by the monitoring connection should advertise
200
+ # hello response *for this connection*.
201
+ # Hello received by the monitoring connection should advertise
185
202
  # the same wire protocol, but if it doesn't, we use whatever
186
203
  # the monitoring connection advertised for filling out the
187
204
  # server description and whatever the non-monitoring connection
@@ -215,7 +232,7 @@ module Mongo
215
232
  user_options = Options::Redacted.new(
216
233
  # When speculative auth is performed, we always use SCRAM-SHA-256.
217
234
  # At the same time we perform SCRAM mechanism negotiation in the
218
- # ismaster request.
235
+ # hello request.
219
236
  # If the credentials we are trying to authenticate with do not
220
237
  # map to an existing user, SCRAM mechanism negotiation will not
221
238
  # return anything which would cause the driver to use
@@ -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");
@@ -15,11 +18,11 @@
15
18
  module Mongo
16
19
  class Server
17
20
 
18
- # A monitor utilizing server-pushed ismaster requests.
21
+ # A monitor utilizing server-pushed hello requests.
19
22
  #
20
23
  # When a Monitor handshakes with a 4.4+ server, it creates an instance
21
- # of PushMonitor. PushMonitor subsequently executes server-pushed ismaster
22
- # (i.e. awaited & exhausted ismaster) to receive topology changes from the
24
+ # of PushMonitor. PushMonitor subsequently executes server-pushed hello
25
+ # (i.e. awaited & exhausted hello) to receive topology changes from the
23
26
  # server as quickly as possible. The Monitor still monitors the server
24
27
  # for round-trip time calculations and to perform immediate checks as
25
28
  # requested by the application.
@@ -33,6 +36,14 @@ module Mongo
33
36
  if topology_version.nil?
34
37
  raise ArgumentError, 'Topology version must be provided but it was nil'
35
38
  end
39
+ unless options[:app_metadata]
40
+ raise ArgumentError, 'App metadata is required'
41
+ end
42
+ unless options[:check_document]
43
+ raise ArgumentError, 'Check document is required'
44
+ end
45
+ @app_metadata = options[:app_metadata]
46
+ @check_document = options[:check_document]
36
47
  @monitor = monitor
37
48
  @topology_version = topology_version
38
49
  @monitoring = monitoring
@@ -65,7 +76,7 @@ module Mongo
65
76
  @lock.synchronize do
66
77
  @stop_requested = true
67
78
  if @connection
68
- # Interrupt any in-progress exhausted ismaster reads by
79
+ # Interrupt any in-progress exhausted hello reads by
69
80
  # disconnecting the connection.
70
81
  @connection.send(:socket).close
71
82
  end
@@ -86,29 +97,29 @@ module Mongo
86
97
  end
87
98
 
88
99
  result = monitoring.publish_heartbeat(server, awaited: true) do
89
- ismaster
100
+ check
90
101
  end
91
102
  new_description = monitor.run_sdam_flow(result, awaited: true)
92
- # When ismaster fails due to a fail point, the response does not
103
+ # When hello fails due to a fail point, the response does not
93
104
  # include topology version. In this case we need to keep our existing
94
105
  # topology version so that we can resume monitoring.
95
106
  # The spec does not appear to directly address this case but
96
107
  # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-monitoring.rst#streaming-ismaster
97
108
  # says that topologyVersion should only be updated from successful
98
- # ismaster responses.
109
+ # hello responses.
99
110
  if new_description.topology_version
100
111
  @topology_version = new_description.topology_version
101
112
  end
102
113
  rescue Mongo::Error => exc
103
- msg = "Error running awaited ismaster on #{server.address}"
104
- Utils.warn_monitor_exception(msg, exc,
114
+ msg = "Error running awaited hello on #{server.address}"
115
+ Utils.warn_bg_exception(msg, exc,
105
116
  logger: options[:logger],
106
117
  log_prefix: options[:log_prefix],
107
118
  bg_error_backtrace: options[:bg_error_backtrace],
108
119
  )
109
120
  end
110
121
 
111
- def ismaster
122
+ def check
112
123
  @lock.synchronize do
113
124
  if @connection && @connection.pid != Process.pid
114
125
  log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{@connection.pid}, new pid #{Process.pid}")
@@ -128,7 +139,7 @@ module Mongo
128
139
 
129
140
  resp_msg = begin
130
141
  unless @server_pushing
131
- write_ismaster
142
+ write_check_command
132
143
  end
133
144
  read_response
134
145
  rescue Mongo::Error
@@ -139,17 +150,20 @@ module Mongo
139
150
  raise
140
151
  end
141
152
  @server_pushing = resp_msg.flags.include?(:more_to_come)
142
- result = resp_msg.documents.first
153
+ result = Operation::Result.new(resp_msg)
154
+ result.validate!
155
+ result.documents.first
143
156
  end
144
157
 
145
- def write_ismaster
146
- payload = Monitor::Connection::ISMASTER_OP_MSG.merge(
158
+ def write_check_command
159
+ document = @check_document.merge(
147
160
  topologyVersion: topology_version.to_doc,
148
161
  maxAwaitTimeMS: monitor.heartbeat_interval * 1000,
149
162
  )
150
-
151
- req_msg = Protocol::Msg.new([:exhaust_allowed], {}, payload)
152
- @lock.synchronize { @connection }.write_bytes(req_msg.serialize.to_s)
163
+ command = Protocol::Msg.new(
164
+ [:exhaust_allowed], {}, document.merge({'$db' => Database::ADMIN})
165
+ )
166
+ @lock.synchronize { @connection }.write_bytes(command.serialize.to_s)
153
167
  end
154
168
 
155
169
  def read_response
@@ -162,10 +176,11 @@ module Mongo
162
176
  end
163
177
  # We set the timeout twice: once passed into read_socket which applies
164
178
  # to each individual read operation, and again around the entire read.
165
- Timeout.timeout(timeout, Error::SocketTimeoutError, "Failed to read an awaited ismaster response in #{timeout} seconds") do
179
+ Timeout.timeout(timeout, Error::SocketTimeoutError, "Failed to read an awaited hello response in #{timeout} seconds") do
166
180
  @lock.synchronize { @connection }.read_response(socket_timeout: timeout)
167
181
  end
168
182
  end
183
+
169
184
  end
170
185
  end
171
186
  end
@@ -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) 2018-2020 MongoDB Inc.
2
5
 
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,7 +34,7 @@ module Mongo
31
34
  attr_reader :average_round_trip_time
32
35
 
33
36
  def measure
34
- start = Time.now
37
+ start = Utils.monotonic_time
35
38
  begin
36
39
  rv = yield
37
40
  rescue Error::SocketError, Error::SocketTimeoutError
@@ -41,9 +44,9 @@ module Mongo
41
44
  rescue Error, Error::AuthError => exc
42
45
  # For other errors, RTT is valid.
43
46
  end
44
- last_round_trip_time = Time.now - start
47
+ last_round_trip_time = Utils.monotonic_time - start
45
48
 
46
- # If ismaster fails, we need to return the last round trip time
49
+ # If hello fails, we need to return the last round trip time
47
50
  # because it is used in the heartbeat failed SDAM event,
48
51
  # but we must not update the round trip time recorded in the server.
49
52
  unless exc
@@ -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) 2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -181,7 +184,7 @@ module Mongo
181
184
  raise Error::NoServerAvailable.new(self, cluster, msg)
182
185
  end
183
186
 
184
- deadline = Time.now + server_selection_timeout
187
+ deadline = Utils.monotonic_time + server_selection_timeout
185
188
 
186
189
  if session && session.pinned_server
187
190
  if Mongo::Lint.enabled?
@@ -199,7 +202,7 @@ module Mongo
199
202
  # This will no longer be the case once SRV polling is implemented.
200
203
 
201
204
  unless server.mongos?
202
- while (time_remaining = deadline - Time.now) > 0
205
+ while (time_remaining = deadline - Utils.monotonic_time) > 0
203
206
  wait_for_server_selection(cluster, time_remaining)
204
207
  end
205
208
 
@@ -252,7 +255,7 @@ module Mongo
252
255
 
253
256
  cluster.scan!(false)
254
257
 
255
- time_remaining = deadline - Time.now
258
+ time_remaining = deadline - Utils.monotonic_time
256
259
  if time_remaining > 0
257
260
  wait_for_server_selection(cluster, time_remaining)
258
261
 
@@ -265,7 +268,11 @@ module Mongo
265
268
  end
266
269
  end
267
270
 
268
- msg = "No #{name} server is available in cluster: #{cluster.summary} " +
271
+ msg = "No #{name} server"
272
+ if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
273
+ msg += " with tag sets: #{tag_sets}"
274
+ end
275
+ msg += " is available in cluster: #{cluster.summary} " +
269
276
  "with timeout=#{server_selection_timeout}, " +
270
277
  "LT=#{local_threshold_with_cluster(cluster)}"
271
278
  msg += server_selection_diagnostic_message(cluster)
@@ -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");
@@ -38,13 +41,12 @@ module Mongo
38
41
  :nearest
39
42
  end
40
43
 
41
- # Whether the slaveOk bit should be set on wire protocol messages.
44
+ # Whether the secondaryOk bit should be set on wire protocol messages.
42
45
  # I.e. whether the operation can be performed on a secondary server.
43
46
  #
44
47
  # @return [ true ] true
45
- #
46
- # @since 2.0.0
47
- def slave_ok?
48
+ # @api private
49
+ def secondary_ok?
48
50
  true
49
51
  end
50
52
 
@@ -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");
@@ -39,13 +42,12 @@ module Mongo
39
42
  :primary
40
43
  end
41
44
 
42
- # Whether the slaveOk bit should be set on wire protocol messages.
45
+ # Whether the secondaryOk bit should be set on wire protocol messages.
43
46
  # I.e. whether the operation can be performed on a secondary server.
44
47
  #
45
48
  # @return [ false ] false
46
- #
47
- # @since 2.0.0
48
- def slave_ok?
49
+ # @api private
50
+ def secondary_ok?
49
51
  false
50
52
  end
51
53
 
@@ -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");
@@ -39,13 +42,12 @@ module Mongo
39
42
  :primary_preferred
40
43
  end
41
44
 
42
- # Whether the slaveOk bit should be set on wire protocol messages.
45
+ # Whether the secondaryOk bit should be set on wire protocol messages.
43
46
  # I.e. whether the operation can be performed on a secondary server.
44
47
  #
45
48
  # @return [ true ] true
46
- #
47
- # @since 2.0.0
48
- def slave_ok?
49
+ # @api private
50
+ def secondary_ok?
49
51
  true
50
52
  end
51
53
 
@@ -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");
@@ -39,13 +42,12 @@ module Mongo
39
42
  :secondary
40
43
  end
41
44
 
42
- # Whether the slaveOk bit should be set on wire protocol messages.
45
+ # Whether the secondaryOk bit should be set on wire protocol messages.
43
46
  # I.e. whether the operation can be performed on a secondary server.
44
47
  #
45
48
  # @return [ true ] true
46
- #
47
- # @since 2.0.0
48
- def slave_ok?
49
+ # @api private
50
+ def secondary_ok?
49
51
  true
50
52
  end
51
53