mongo 2.12.4 → 2.13.2

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 (860) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +8 -36
  5. data/LICENSE +1 -1
  6. data/README.md +54 -54
  7. data/Rakefile +16 -10
  8. data/lib/mongo.rb +8 -3
  9. data/lib/mongo/active_support.rb +1 -1
  10. data/lib/mongo/address.rb +41 -14
  11. data/lib/mongo/address/ipv4.rb +32 -5
  12. data/lib/mongo/address/ipv6.rb +32 -5
  13. data/lib/mongo/address/unix.rb +3 -3
  14. data/lib/mongo/address/validator.rb +1 -1
  15. data/lib/mongo/auth.rb +36 -13
  16. data/lib/mongo/auth/aws.rb +37 -0
  17. data/lib/mongo/auth/aws/conversation.rb +128 -0
  18. data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
  19. data/lib/mongo/auth/aws/request.rb +283 -0
  20. data/lib/mongo/auth/base.rb +129 -0
  21. data/lib/mongo/auth/conversation_base.rb +52 -0
  22. data/lib/mongo/auth/cr.rb +9 -36
  23. data/lib/mongo/auth/cr/conversation.rb +24 -69
  24. data/lib/mongo/auth/credential_cache.rb +1 -1
  25. data/lib/mongo/auth/gssapi.rb +38 -0
  26. data/lib/mongo/auth/gssapi/conversation.rb +108 -0
  27. data/lib/mongo/auth/ldap.rb +9 -34
  28. data/lib/mongo/auth/ldap/conversation.rb +3 -43
  29. data/lib/mongo/auth/roles.rb +1 -1
  30. data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
  31. data/lib/mongo/auth/scram.rb +39 -51
  32. data/lib/mongo/auth/scram/conversation.rb +12 -506
  33. data/lib/mongo/auth/scram256.rb +31 -0
  34. data/lib/mongo/auth/scram256/conversation.rb +63 -0
  35. data/lib/mongo/auth/scram_conversation_base.rb +402 -0
  36. data/lib/mongo/auth/stringprep.rb +5 -4
  37. data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
  38. data/lib/mongo/auth/stringprep/tables.rb +2 -1
  39. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
  40. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
  41. data/lib/mongo/auth/user.rb +2 -2
  42. data/lib/mongo/auth/user/view.rb +1 -1
  43. data/lib/mongo/auth/x509.rb +14 -32
  44. data/lib/mongo/auth/x509/conversation.rb +15 -42
  45. data/lib/mongo/background_thread.rb +11 -2
  46. data/lib/mongo/bson.rb +1 -1
  47. data/lib/mongo/bulk_write.rb +62 -26
  48. data/lib/mongo/bulk_write/combineable.rb +20 -8
  49. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  50. data/lib/mongo/bulk_write/result.rb +1 -1
  51. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  52. data/lib/mongo/bulk_write/transformable.rb +9 -10
  53. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  54. data/lib/mongo/bulk_write/validatable.rb +5 -1
  55. data/lib/mongo/client.rb +214 -31
  56. data/lib/mongo/client_encryption.rb +1 -1
  57. data/lib/mongo/cluster.rb +177 -69
  58. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  59. data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
  60. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  61. data/lib/mongo/cluster/sdam_flow.rb +36 -17
  62. data/lib/mongo/cluster/topology.rb +19 -2
  63. data/lib/mongo/cluster/topology/base.rb +1 -1
  64. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  65. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +4 -3
  66. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  67. data/lib/mongo/cluster/topology/sharded.rb +2 -2
  68. data/lib/mongo/cluster/topology/single.rb +2 -2
  69. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  70. data/lib/mongo/cluster_time.rb +1 -1
  71. data/lib/mongo/collection.rb +51 -24
  72. data/lib/mongo/collection/view.rb +6 -2
  73. data/lib/mongo/collection/view/aggregation.rb +6 -3
  74. data/lib/mongo/collection/view/builder.rb +1 -1
  75. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  76. data/lib/mongo/collection/view/builder/find_command.rb +9 -1
  77. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  78. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  79. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  80. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  81. data/lib/mongo/collection/view/change_stream.rb +3 -6
  82. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  83. data/lib/mongo/collection/view/explainable.rb +1 -1
  84. data/lib/mongo/collection/view/immutable.rb +1 -1
  85. data/lib/mongo/collection/view/iterable.rb +8 -2
  86. data/lib/mongo/collection/view/map_reduce.rb +7 -4
  87. data/lib/mongo/collection/view/readable.rb +10 -2
  88. data/lib/mongo/collection/view/writable.rb +93 -13
  89. data/lib/mongo/crypt.rb +1 -1
  90. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  91. data/lib/mongo/crypt/auto_encrypter.rb +1 -1
  92. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  93. data/lib/mongo/crypt/binary.rb +1 -1
  94. data/lib/mongo/crypt/binding.rb +1 -1
  95. data/lib/mongo/crypt/context.rb +1 -1
  96. data/lib/mongo/crypt/data_key_context.rb +1 -1
  97. data/lib/mongo/crypt/encryption_io.rb +41 -24
  98. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  100. data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
  101. data/lib/mongo/crypt/handle.rb +1 -1
  102. data/lib/mongo/crypt/hooks.rb +1 -1
  103. data/lib/mongo/crypt/kms_context.rb +1 -1
  104. data/lib/mongo/crypt/status.rb +1 -1
  105. data/lib/mongo/cursor.rb +3 -3
  106. data/lib/mongo/cursor/builder.rb +1 -1
  107. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  108. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  109. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  110. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  111. data/lib/mongo/database.rb +35 -5
  112. data/lib/mongo/database/view.rb +20 -5
  113. data/lib/mongo/dbref.rb +1 -1
  114. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  115. data/lib/mongo/error.rb +28 -2
  116. data/lib/mongo/error/auth_error.rb +1 -1
  117. data/lib/mongo/error/bulk_write_error.rb +1 -1
  118. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  119. data/lib/mongo/error/closed_stream.rb +1 -1
  120. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  121. data/lib/mongo/error/connection_perished.rb +23 -0
  122. data/lib/mongo/error/credential_check_error.rb +26 -0
  123. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  124. data/lib/mongo/error/file_not_found.rb +1 -1
  125. data/lib/mongo/error/handshake_error.rb +1 -1
  126. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  127. data/lib/mongo/error/invalid_address.rb +1 -1
  128. data/lib/mongo/error/invalid_application_name.rb +1 -1
  129. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  130. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  131. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  132. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  133. data/lib/mongo/error/invalid_database_name.rb +1 -1
  134. data/lib/mongo/error/invalid_document.rb +1 -1
  135. data/lib/mongo/error/invalid_file.rb +1 -1
  136. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  137. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  138. data/lib/mongo/error/invalid_nonce.rb +2 -2
  139. data/lib/mongo/error/invalid_read_option.rb +1 -1
  140. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  141. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  142. data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
  143. data/lib/mongo/error/invalid_server_preference.rb +6 -1
  144. data/lib/mongo/error/invalid_session.rb +3 -2
  145. data/lib/mongo/error/invalid_signature.rb +1 -1
  146. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  147. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  148. data/lib/mongo/error/invalid_update_document.rb +1 -1
  149. data/lib/mongo/error/invalid_uri.rb +1 -1
  150. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  151. data/lib/mongo/error/lint_error.rb +1 -1
  152. data/lib/mongo/error/max_bson_size.rb +1 -1
  153. data/lib/mongo/error/max_message_size.rb +1 -1
  154. data/lib/mongo/error/mismatched_domain.rb +1 -1
  155. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  156. data/lib/mongo/error/missing_password.rb +1 -1
  157. data/lib/mongo/error/missing_resume_token.rb +1 -1
  158. data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
  159. data/lib/mongo/error/multi_index_drop.rb +1 -1
  160. data/lib/mongo/error/need_primary_server.rb +1 -1
  161. data/lib/mongo/error/no_server_available.rb +1 -1
  162. data/lib/mongo/error/no_srv_records.rb +1 -1
  163. data/lib/mongo/error/notable.rb +18 -3
  164. data/lib/mongo/error/operation_failure.rb +63 -44
  165. data/lib/mongo/error/parser.rb +16 -5
  166. data/lib/mongo/error/pool_closed_error.rb +1 -1
  167. data/lib/mongo/error/raise_original_error.rb +29 -0
  168. data/lib/mongo/error/session_ended.rb +1 -1
  169. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  170. data/lib/mongo/error/socket_error.rb +1 -1
  171. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  172. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  173. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  174. data/lib/mongo/error/unexpected_response.rb +1 -1
  175. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  176. data/lib/mongo/error/unsupported_array_filters.rb +7 -2
  177. data/lib/mongo/error/unsupported_collation.rb +7 -2
  178. data/lib/mongo/error/unsupported_features.rb +1 -1
  179. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  180. data/lib/mongo/error/unsupported_option.rb +99 -0
  181. data/lib/mongo/error/write_retryable.rb +1 -1
  182. data/lib/mongo/event.rb +1 -1
  183. data/lib/mongo/event/base.rb +7 -1
  184. data/lib/mongo/event/listeners.rb +1 -1
  185. data/lib/mongo/event/publisher.rb +1 -1
  186. data/lib/mongo/event/subscriber.rb +1 -1
  187. data/lib/mongo/grid.rb +1 -1
  188. data/lib/mongo/grid/file.rb +1 -1
  189. data/lib/mongo/grid/file/chunk.rb +1 -1
  190. data/lib/mongo/grid/file/info.rb +1 -1
  191. data/lib/mongo/grid/fs_bucket.rb +9 -4
  192. data/lib/mongo/grid/stream.rb +1 -1
  193. data/lib/mongo/grid/stream/read.rb +1 -1
  194. data/lib/mongo/grid/stream/write.rb +1 -1
  195. data/lib/mongo/id.rb +1 -1
  196. data/lib/mongo/index.rb +2 -1
  197. data/lib/mongo/index/view.rb +61 -11
  198. data/lib/mongo/lint.rb +10 -0
  199. data/lib/mongo/loggable.rb +1 -1
  200. data/lib/mongo/logger.rb +1 -1
  201. data/lib/mongo/monitoring.rb +39 -1
  202. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  203. data/lib/mongo/monitoring/command_log_subscriber.rb +20 -5
  204. data/lib/mongo/monitoring/event.rb +1 -1
  205. data/lib/mongo/monitoring/event/cmap.rb +1 -1
  206. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  207. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  208. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  209. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  210. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  211. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  212. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  213. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  214. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
  215. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  216. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  217. data/lib/mongo/monitoring/event/command_failed.rb +12 -1
  218. data/lib/mongo/monitoring/event/command_started.rb +44 -3
  219. data/lib/mongo/monitoring/event/command_succeeded.rb +12 -1
  220. data/lib/mongo/monitoring/event/secure.rb +8 -2
  221. data/lib/mongo/monitoring/event/server_closed.rb +2 -2
  222. data/lib/mongo/monitoring/event/server_description_changed.rb +28 -5
  223. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +10 -3
  224. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +10 -3
  225. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +10 -3
  226. data/lib/mongo/monitoring/event/server_opening.rb +2 -2
  227. data/lib/mongo/monitoring/event/topology_changed.rb +2 -2
  228. data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
  229. data/lib/mongo/monitoring/event/topology_opening.rb +2 -2
  230. data/lib/mongo/monitoring/publishable.rb +9 -9
  231. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  232. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  233. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +10 -2
  234. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  235. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +2 -2
  236. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  237. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  238. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  239. data/lib/mongo/operation.rb +1 -0
  240. data/lib/mongo/operation/aggregate.rb +1 -1
  241. data/lib/mongo/operation/aggregate/command.rb +5 -5
  242. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  243. data/lib/mongo/operation/aggregate/result.rb +1 -1
  244. data/lib/mongo/operation/collections_info.rb +3 -36
  245. data/lib/mongo/operation/collections_info/command.rb +45 -0
  246. data/lib/mongo/operation/collections_info/result.rb +17 -2
  247. data/lib/mongo/operation/command.rb +1 -1
  248. data/lib/mongo/operation/command/command.rb +3 -3
  249. data/lib/mongo/operation/command/op_msg.rb +1 -1
  250. data/lib/mongo/operation/count.rb +1 -1
  251. data/lib/mongo/operation/count/command.rb +3 -3
  252. data/lib/mongo/operation/count/op_msg.rb +1 -1
  253. data/lib/mongo/operation/create.rb +1 -1
  254. data/lib/mongo/operation/create/command.rb +3 -3
  255. data/lib/mongo/operation/create/op_msg.rb +1 -1
  256. data/lib/mongo/operation/create_index.rb +1 -1
  257. data/lib/mongo/operation/create_index/command.rb +4 -4
  258. data/lib/mongo/operation/create_index/op_msg.rb +6 -3
  259. data/lib/mongo/operation/create_user.rb +1 -1
  260. data/lib/mongo/operation/create_user/command.rb +4 -4
  261. data/lib/mongo/operation/create_user/op_msg.rb +2 -2
  262. data/lib/mongo/operation/delete.rb +1 -1
  263. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  264. data/lib/mongo/operation/delete/command.rb +4 -4
  265. data/lib/mongo/operation/delete/legacy.rb +2 -2
  266. data/lib/mongo/operation/delete/op_msg.rb +4 -4
  267. data/lib/mongo/operation/delete/result.rb +2 -2
  268. data/lib/mongo/operation/distinct.rb +1 -1
  269. data/lib/mongo/operation/distinct/command.rb +3 -3
  270. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  271. data/lib/mongo/operation/drop.rb +1 -1
  272. data/lib/mongo/operation/drop/command.rb +3 -3
  273. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  274. data/lib/mongo/operation/drop_database.rb +1 -1
  275. data/lib/mongo/operation/drop_database/command.rb +3 -3
  276. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  277. data/lib/mongo/operation/drop_index.rb +1 -1
  278. data/lib/mongo/operation/drop_index/command.rb +4 -4
  279. data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
  280. data/lib/mongo/operation/explain.rb +1 -1
  281. data/lib/mongo/operation/explain/command.rb +3 -3
  282. data/lib/mongo/operation/explain/legacy.rb +3 -3
  283. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  284. data/lib/mongo/operation/explain/result.rb +1 -1
  285. data/lib/mongo/operation/find.rb +1 -1
  286. data/lib/mongo/operation/find/command.rb +3 -3
  287. data/lib/mongo/operation/find/legacy.rb +3 -3
  288. data/lib/mongo/operation/find/legacy/result.rb +1 -1
  289. data/lib/mongo/operation/find/op_msg.rb +2 -12
  290. data/lib/mongo/operation/find/result.rb +1 -1
  291. data/lib/mongo/operation/get_more.rb +1 -1
  292. data/lib/mongo/operation/get_more/command.rb +3 -3
  293. data/lib/mongo/operation/get_more/legacy.rb +2 -2
  294. data/lib/mongo/operation/get_more/op_msg.rb +2 -12
  295. data/lib/mongo/operation/get_more/result.rb +1 -1
  296. data/lib/mongo/operation/indexes.rb +1 -1
  297. data/lib/mongo/operation/indexes/command.rb +3 -3
  298. data/lib/mongo/operation/indexes/legacy.rb +4 -4
  299. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  300. data/lib/mongo/operation/indexes/result.rb +1 -1
  301. data/lib/mongo/operation/insert.rb +3 -2
  302. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  303. data/lib/mongo/operation/insert/command.rb +7 -7
  304. data/lib/mongo/operation/insert/legacy.rb +9 -5
  305. data/lib/mongo/operation/insert/op_msg.rb +6 -6
  306. data/lib/mongo/operation/insert/result.rb +7 -4
  307. data/lib/mongo/operation/kill_cursors.rb +1 -1
  308. data/lib/mongo/operation/kill_cursors/command.rb +3 -3
  309. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
  310. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  311. data/lib/mongo/operation/list_collections.rb +1 -1
  312. data/lib/mongo/operation/list_collections/command.rb +4 -4
  313. data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
  314. data/lib/mongo/operation/list_collections/result.rb +1 -1
  315. data/lib/mongo/operation/map_reduce.rb +1 -1
  316. data/lib/mongo/operation/map_reduce/command.rb +3 -3
  317. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  318. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  319. data/lib/mongo/operation/op_msg_base.rb +3 -3
  320. data/lib/mongo/operation/parallel_scan.rb +1 -1
  321. data/lib/mongo/operation/parallel_scan/command.rb +5 -5
  322. data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
  323. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  324. data/lib/mongo/operation/remove_user.rb +1 -1
  325. data/lib/mongo/operation/remove_user/command.rb +4 -4
  326. data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
  327. data/lib/mongo/operation/result.rb +28 -4
  328. data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
  329. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
  330. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
  331. data/lib/mongo/operation/shared/executable.rb +46 -28
  332. data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
  333. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  334. data/lib/mongo/operation/shared/idable.rb +1 -1
  335. data/lib/mongo/operation/shared/limited.rb +10 -2
  336. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  337. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
  338. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
  339. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
  340. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  341. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  342. data/lib/mongo/operation/shared/read_preference_supported.rb +19 -16
  343. data/lib/mongo/operation/shared/response_handling.rb +83 -8
  344. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  345. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  346. data/lib/mongo/operation/shared/sessions_supported.rb +50 -27
  347. data/lib/mongo/operation/shared/specifiable.rb +32 -20
  348. data/lib/mongo/operation/shared/write.rb +25 -19
  349. data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
  350. data/lib/mongo/operation/update.rb +1 -1
  351. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  352. data/lib/mongo/operation/update/command.rb +4 -4
  353. data/lib/mongo/operation/update/legacy.rb +2 -2
  354. data/lib/mongo/operation/update/legacy/result.rb +1 -1
  355. data/lib/mongo/operation/update/op_msg.rb +4 -4
  356. data/lib/mongo/operation/update/result.rb +2 -2
  357. data/lib/mongo/operation/update_user.rb +1 -1
  358. data/lib/mongo/operation/update_user/command.rb +4 -4
  359. data/lib/mongo/operation/update_user/op_msg.rb +2 -2
  360. data/lib/mongo/operation/users_info.rb +1 -1
  361. data/lib/mongo/operation/users_info/command.rb +4 -4
  362. data/lib/mongo/operation/users_info/op_msg.rb +2 -2
  363. data/lib/mongo/operation/users_info/result.rb +1 -1
  364. data/lib/mongo/options.rb +1 -1
  365. data/lib/mongo/options/mapper.rb +1 -1
  366. data/lib/mongo/options/redacted.rb +1 -1
  367. data/lib/mongo/protocol/bit_vector.rb +1 -1
  368. data/lib/mongo/protocol/compressed.rb +1 -1
  369. data/lib/mongo/protocol/delete.rb +1 -1
  370. data/lib/mongo/protocol/get_more.rb +1 -1
  371. data/lib/mongo/protocol/insert.rb +1 -1
  372. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  373. data/lib/mongo/protocol/message.rb +35 -7
  374. data/lib/mongo/protocol/msg.rb +18 -4
  375. data/lib/mongo/protocol/query.rb +1 -1
  376. data/lib/mongo/protocol/registry.rb +1 -1
  377. data/lib/mongo/protocol/reply.rb +1 -1
  378. data/lib/mongo/protocol/serializers.rb +1 -1
  379. data/lib/mongo/protocol/update.rb +1 -1
  380. data/lib/mongo/retryable.rb +23 -10
  381. data/lib/mongo/semaphore.rb +1 -1
  382. data/lib/mongo/server.rb +40 -8
  383. data/lib/mongo/server/app_metadata.rb +44 -7
  384. data/lib/mongo/server/connection.rb +37 -133
  385. data/lib/mongo/server/connection_base.rb +22 -7
  386. data/lib/mongo/server/connection_common.rb +75 -1
  387. data/lib/mongo/server/connection_pool.rb +20 -1
  388. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  389. data/lib/mongo/server/context.rb +1 -1
  390. data/lib/mongo/server/description.rb +49 -2
  391. data/lib/mongo/server/description/features.rb +12 -3
  392. data/lib/mongo/server/monitor.rb +145 -69
  393. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  394. data/lib/mongo/server/monitor/connection.rb +110 -80
  395. data/lib/mongo/server/pending_connection.rb +215 -3
  396. data/lib/mongo/server/push_monitor.rb +173 -0
  397. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  398. data/lib/mongo/server/round_trip_time_averager.rb +12 -3
  399. data/lib/mongo/server_selector.rb +2 -2
  400. data/lib/mongo/server_selector/{selectable.rb → base.rb} +159 -86
  401. data/lib/mongo/server_selector/nearest.rb +26 -21
  402. data/lib/mongo/server_selector/primary.rb +24 -28
  403. data/lib/mongo/server_selector/primary_preferred.rb +32 -25
  404. data/lib/mongo/server_selector/secondary.rb +26 -21
  405. data/lib/mongo/server_selector/secondary_preferred.rb +29 -34
  406. data/lib/mongo/session.rb +14 -1
  407. data/lib/mongo/session/server_session.rb +1 -1
  408. data/lib/mongo/session/session_pool.rb +1 -1
  409. data/lib/mongo/socket.rb +121 -41
  410. data/lib/mongo/socket/ssl.rb +98 -35
  411. data/lib/mongo/socket/tcp.rb +39 -31
  412. data/lib/mongo/socket/unix.rb +14 -6
  413. data/lib/mongo/srv.rb +1 -1
  414. data/lib/mongo/srv/monitor.rb +1 -1
  415. data/lib/mongo/srv/resolver.rb +1 -1
  416. data/lib/mongo/srv/result.rb +1 -1
  417. data/lib/mongo/timeout.rb +9 -9
  418. data/lib/mongo/topology_version.rb +89 -0
  419. data/lib/mongo/uri.rb +61 -47
  420. data/lib/mongo/uri/srv_protocol.rb +9 -1
  421. data/lib/mongo/utils.rb +62 -0
  422. data/lib/mongo/version.rb +2 -2
  423. data/lib/mongo/write_concern.rb +1 -1
  424. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  425. data/lib/mongo/write_concern/base.rb +1 -1
  426. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  427. data/mongo.gemspec +1 -1
  428. data/spec/NOTES.aws-auth.md +291 -0
  429. data/spec/README.aws-auth.md +318 -0
  430. data/spec/README.md +64 -17
  431. data/spec/integration/auth_spec.rb +29 -9
  432. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  433. data/spec/integration/aws_auth_request_spec.rb +74 -0
  434. data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
  435. data/spec/integration/bson_symbol_spec.rb +4 -2
  436. data/spec/integration/change_stream_examples_spec.rb +6 -2
  437. data/spec/integration/change_stream_spec.rb +123 -51
  438. data/spec/integration/check_clean_slate_spec.rb +16 -0
  439. data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
  440. data/spec/integration/client_construction_spec.rb +2 -1
  441. data/spec/integration/collection_indexes_prose_spec.rb +55 -0
  442. data/spec/integration/command_monitoring_spec.rb +30 -6
  443. data/spec/integration/command_spec.rb +11 -9
  444. data/spec/integration/connect_single_rs_name_spec.rb +10 -5
  445. data/spec/integration/connection_spec.rb +7 -3
  446. data/spec/integration/crud_spec.rb +32 -4
  447. data/spec/integration/cursor_reaping_spec.rb +14 -10
  448. data/spec/integration/docs_examples_spec.rb +6 -0
  449. data/spec/integration/fork_reconnect_spec.rb +143 -0
  450. data/spec/integration/get_more_spec.rb +10 -3
  451. data/spec/integration/heartbeat_events_spec.rb +5 -24
  452. data/spec/integration/read_concern_spec.rb +1 -1
  453. data/spec/integration/read_preference_spec.rb +41 -11
  454. data/spec/integration/reconnect_spec.rb +2 -3
  455. data/spec/integration/retryable_errors_spec.rb +33 -14
  456. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
  457. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
  458. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
  459. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
  460. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
  461. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
  462. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
  463. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
  464. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
  465. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
  466. data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
  467. data/spec/integration/sdam_error_handling_spec.rb +159 -22
  468. data/spec/integration/sdam_events_spec.rb +80 -5
  469. data/spec/integration/sdam_prose_spec.rb +64 -0
  470. data/spec/integration/server_monitor_spec.rb +25 -1
  471. data/spec/integration/server_spec.rb +42 -26
  472. data/spec/integration/size_limit_spec.rb +3 -3
  473. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  474. data/spec/integration/step_down_spec.rb +15 -15
  475. data/spec/integration/transactions_api_examples_spec.rb +59 -0
  476. data/spec/integration/transactions_examples_spec.rb +5 -2
  477. data/spec/integration/x509_auth_spec.rb +109 -0
  478. data/spec/kerberos/kerberos_spec.rb +10 -6
  479. data/spec/lite_spec_helper.rb +32 -23
  480. data/spec/mongo/address/ipv4_spec.rb +1 -1
  481. data/spec/mongo/address_spec.rb +2 -2
  482. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  483. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  484. data/spec/mongo/auth/cr_spec.rb +7 -7
  485. data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
  486. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  487. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  488. data/spec/mongo/auth/ldap_spec.rb +3 -3
  489. data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
  490. data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
  491. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
  492. data/spec/mongo/auth/scram_spec.rb +29 -69
  493. data/spec/mongo/auth/user_spec.rb +1 -1
  494. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  495. data/spec/mongo/auth/x509_spec.rb +8 -8
  496. data/spec/mongo/auth_spec.rb +4 -4
  497. data/spec/mongo/bulk_write_spec.rb +206 -2
  498. data/spec/mongo/client_construction_spec.rb +620 -86
  499. data/spec/mongo/client_encryption_spec.rb +16 -10
  500. data/spec/mongo/client_spec.rb +59 -5
  501. data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
  502. data/spec/mongo/cluster/topology/single_spec.rb +4 -2
  503. data/spec/mongo/cluster_spec.rb +37 -36
  504. data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
  505. data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
  506. data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
  507. data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
  508. data/spec/mongo/collection/view/iterable_spec.rb +38 -0
  509. data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
  510. data/spec/mongo/collection/view/readable_spec.rb +15 -1
  511. data/spec/mongo/collection/view/writable_spec.rb +208 -1
  512. data/spec/mongo/collection_spec.rb +507 -43
  513. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  514. data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
  515. data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
  516. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
  517. data/spec/mongo/cursor_spec.rb +9 -1
  518. data/spec/mongo/database_spec.rb +315 -10
  519. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  520. data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
  521. data/spec/mongo/error/operation_failure_spec.rb +167 -69
  522. data/spec/mongo/error/unsupported_option_spec.rb +54 -0
  523. data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
  524. data/spec/mongo/grid/stream/write_spec.rb +32 -0
  525. data/spec/mongo/index/view_spec.rb +312 -0
  526. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  527. data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
  528. data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
  529. data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
  530. data/spec/mongo/operation/find/legacy_spec.rb +27 -7
  531. data/spec/mongo/operation/get_more_spec.rb +6 -1
  532. data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
  533. data/spec/mongo/operation/insert/command_spec.rb +4 -0
  534. data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
  535. data/spec/mongo/operation/limited_spec.rb +5 -3
  536. data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
  537. data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
  538. data/spec/mongo/operation/result_spec.rb +6 -1
  539. data/spec/mongo/operation/update/bulk_spec.rb +18 -6
  540. data/spec/mongo/operation/update/command_spec.rb +4 -0
  541. data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
  542. data/spec/mongo/protocol/msg_spec.rb +10 -0
  543. data/spec/mongo/retryable_spec.rb +71 -70
  544. data/spec/mongo/semaphore_spec.rb +51 -0
  545. data/spec/mongo/server/app_metadata_shared.rb +136 -0
  546. data/spec/mongo/server/app_metadata_spec.rb +8 -1
  547. data/spec/mongo/server/connection_auth_spec.rb +33 -14
  548. data/spec/mongo/server/connection_pool_spec.rb +0 -31
  549. data/spec/mongo/server/connection_spec.rb +118 -71
  550. data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
  551. data/spec/mongo/server/monitor/connection_spec.rb +1 -82
  552. data/spec/mongo/server/monitor_spec.rb +76 -17
  553. data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
  554. data/spec/mongo/server_selector/nearest_spec.rb +24 -23
  555. data/spec/mongo/server_selector/primary_preferred_spec.rb +27 -26
  556. data/spec/mongo/server_selector/primary_spec.rb +27 -9
  557. data/spec/mongo/server_selector/secondary_preferred_spec.rb +40 -23
  558. data/spec/mongo/server_selector/secondary_spec.rb +19 -18
  559. data/spec/mongo/server_selector_spec.rb +4 -5
  560. data/spec/mongo/session/session_pool_spec.rb +7 -3
  561. data/spec/mongo/session_spec.rb +35 -0
  562. data/spec/mongo/socket/ssl_spec.rb +2 -2
  563. data/spec/mongo/socket/tcp_spec.rb +2 -2
  564. data/spec/mongo/socket/unix_spec.rb +2 -2
  565. data/spec/mongo/socket_spec.rb +9 -9
  566. data/spec/mongo/timeout_spec.rb +22 -68
  567. data/spec/mongo/uri_spec.rb +21 -6
  568. data/spec/runners/auth.rb +5 -6
  569. data/spec/runners/change_streams/outcome.rb +42 -0
  570. data/spec/runners/change_streams/spec.rb +57 -0
  571. data/spec/runners/change_streams/test.rb +229 -0
  572. data/spec/runners/cmap.rb +1 -1
  573. data/spec/runners/cmap/verifier.rb +1 -1
  574. data/spec/runners/command_monitoring.rb +4 -35
  575. data/spec/runners/connection_string.rb +3 -2
  576. data/spec/runners/crud.rb +2 -2
  577. data/spec/runners/crud/context.rb +10 -6
  578. data/spec/runners/crud/operation.rb +177 -55
  579. data/spec/runners/crud/outcome.rb +1 -1
  580. data/spec/runners/crud/spec.rb +0 -7
  581. data/spec/runners/crud/test.rb +8 -26
  582. data/spec/runners/crud/test_base.rb +47 -0
  583. data/spec/runners/crud/verifier.rb +21 -3
  584. data/spec/runners/gridfs.rb +1 -1
  585. data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
  586. data/spec/runners/sdam/verifier.rb +26 -8
  587. data/spec/runners/server_selection.rb +242 -28
  588. data/spec/runners/transactions.rb +13 -14
  589. data/spec/runners/transactions/operation.rb +155 -25
  590. data/spec/runners/transactions/spec.rb +1 -1
  591. data/spec/runners/transactions/test.rb +103 -65
  592. data/spec/shared/LICENSE +20 -0
  593. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  594. data/spec/shared/lib/mrss/constraints.rb +303 -0
  595. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  596. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  597. data/spec/spec_tests/auth_spec.rb +2 -0
  598. data/spec/spec_tests/change_streams_spec.rb +39 -4
  599. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  600. data/spec/spec_tests/cmap_spec.rb +5 -0
  601. data/spec/spec_tests/command_monitoring_spec.rb +25 -12
  602. data/spec/spec_tests/connection_string_spec.rb +2 -0
  603. data/spec/spec_tests/crud_spec.rb +3 -1
  604. data/spec/spec_tests/data/auth/connection-string.yml +57 -1
  605. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +27 -1
  606. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  607. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1173 -0
  608. data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
  609. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
  610. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
  611. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  612. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  613. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  614. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  615. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  616. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  617. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  618. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  619. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  620. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  621. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  622. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  623. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  624. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  625. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  626. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  627. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  628. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  629. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  630. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  631. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  632. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  633. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  634. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  635. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  636. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  637. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  638. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  639. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  640. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  641. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  642. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  643. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  644. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  645. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  646. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  647. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  648. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  649. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  650. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  651. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  652. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
  653. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  654. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  655. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  656. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  657. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  658. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  659. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  660. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  661. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  662. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  663. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
  664. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  665. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
  666. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  667. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
  668. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  669. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
  670. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  671. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
  672. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  673. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
  674. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  675. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
  676. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  677. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
  678. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  679. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
  680. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
  681. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
  682. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
  683. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
  684. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
  685. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
  686. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
  687. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
  688. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
  689. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
  690. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
  691. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
  692. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
  693. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
  694. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
  695. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
  696. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
  697. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
  698. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
  699. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
  700. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
  701. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
  702. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
  703. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
  704. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
  705. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
  706. data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
  707. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
  708. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
  709. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
  710. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
  711. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
  712. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
  713. data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
  714. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
  715. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
  716. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
  717. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
  718. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
  719. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
  720. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
  721. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
  722. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
  723. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
  724. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
  725. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  726. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  727. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
  728. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  729. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  730. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  731. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
  732. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
  733. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
  734. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  735. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  736. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
  737. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  738. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  739. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  740. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
  741. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
  742. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
  743. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
  744. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
  745. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
  746. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
  747. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
  748. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
  749. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
  750. data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
  751. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
  752. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
  753. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
  754. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
  755. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
  756. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
  757. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
  758. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
  759. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
  760. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
  761. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
  762. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
  763. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
  764. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
  765. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
  766. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
  767. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
  768. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
  769. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
  770. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
  771. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
  772. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
  773. data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
  774. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
  775. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
  776. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
  777. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
  778. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
  779. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
  780. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
  781. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
  782. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
  783. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
  784. data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
  785. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
  786. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  787. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
  788. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
  789. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  790. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
  791. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  792. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  793. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  794. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  795. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  796. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  797. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  798. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  799. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  800. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  801. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  802. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  803. data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
  804. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
  805. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  806. data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
  807. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  808. data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
  809. data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
  810. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  811. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
  812. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
  813. data/spec/spec_tests/gridfs_spec.rb +2 -0
  814. data/spec/spec_tests/max_staleness_spec.rb +5 -141
  815. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
  816. data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
  817. data/spec/spec_tests/retryable_reads_spec.rb +4 -2
  818. data/spec/spec_tests/retryable_writes_spec.rb +8 -1
  819. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  820. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -2
  821. data/spec/spec_tests/sdam_spec.rb +70 -1
  822. data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
  823. data/spec/spec_tests/server_selection_spec.rb +5 -115
  824. data/spec/spec_tests/transactions_api_spec.rb +5 -0
  825. data/spec/spec_tests/transactions_spec.rb +5 -0
  826. data/spec/spec_tests/uri_options_spec.rb +2 -0
  827. data/spec/stress/cleanup_spec.rb +58 -0
  828. data/spec/stress/connection_pool_stress_spec.rb +11 -13
  829. data/spec/stress/connection_pool_timing_spec.rb +3 -6
  830. data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
  831. data/spec/support/authorization.rb +1 -11
  832. data/spec/support/aws_utils.rb +62 -0
  833. data/spec/support/aws_utils/base.rb +134 -0
  834. data/spec/support/aws_utils/inspector.rb +224 -0
  835. data/spec/support/aws_utils/orchestrator.rb +370 -0
  836. data/spec/support/aws_utils/provisioner.rb +360 -0
  837. data/spec/support/background_thread_registry.rb +6 -2
  838. data/spec/support/child_process_helper.rb +78 -0
  839. data/spec/support/client_registry.rb +6 -24
  840. data/spec/support/cluster_config.rb +5 -0
  841. data/spec/support/common_shortcuts.rb +43 -0
  842. data/spec/support/constraints.rb +27 -7
  843. data/spec/support/crypt.rb +1 -1
  844. data/spec/support/event_subscriber.rb +184 -84
  845. data/spec/support/keyword_struct.rb +26 -0
  846. data/spec/support/lite_constraints.rb +47 -0
  847. data/spec/support/shared/scram_conversation.rb +100 -0
  848. data/spec/support/shared/server_selector.rb +93 -1
  849. data/spec/support/shared/session.rb +29 -21
  850. data/spec/support/spec_config.rb +76 -21
  851. data/spec/support/spec_organizer.rb +129 -0
  852. data/spec/support/spec_setup.rb +9 -5
  853. data/spec/support/utils.rb +161 -24
  854. metadata +1246 -795
  855. metadata.gz.sig +0 -0
  856. data/lib/mongo/server/connectable.rb +0 -107
  857. data/spec/runners/change_streams.rb +0 -262
  858. data/spec/runners/change_streams/operation.rb +0 -89
  859. data/spec/runners/sdam_monitoring.rb +0 -89
  860. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -62,12 +62,29 @@ module Mongo
62
62
  # @param [ Monitoring ] monitoring The monitoring.
63
63
  # @param [ Hash ] options The cluster options.
64
64
  #
65
+ # @option options [ true | false ] :direct_connection Whether to connect
66
+ # directly to the specified seed, bypassing topology discovery. Exactly
67
+ # one seed must be provided.
68
+ # @option options [ Symbol ] :connect Deprecated - use :direct_connection
69
+ # option instead of this option. The connection method to use. This
70
+ # forces the cluster to behave in the specified way instead of
71
+ # auto-discovering. One of :direct, :replica_set, :sharded
72
+ # @option options [ Symbol ] :replica_set The name of the replica set to
73
+ # connect to. Servers not in this replica set will be ignored.
74
+ #
65
75
  # @return [ ReplicaSet, Sharded, Single ] The topology.
66
76
  #
67
77
  # @since 2.0.0
68
78
  # @api private
69
79
  def initial(cluster, monitoring, options)
70
- cls = if options.key?(:connect)
80
+ cls = if options[:direct_connection]
81
+ if options[:connect] && options[:connect] && options[:connect].to_sym != :direct
82
+ raise ArgumentError, "Conflicting topology options: direct_connection=true and connect=#{options[:connect]}"
83
+ end
84
+ Single
85
+ elsif options[:direct_connection] == false && options[:connect] && options[:connect].to_sym == :direct
86
+ raise ArgumentError, "Conflicting topology options: direct_connection=false and connect=#{options[:connect]}"
87
+ elsif options.key?(:connect)
71
88
  OPTIONS.fetch(options[:connect].to_sym)
72
89
  elsif options.key?(:replica_set) || options.key?(:replica_set_name)
73
90
  ReplicaSetNoPrimary
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018-2019 MongoDB, Inc.
1
+ # Copyright (C) 2018-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018-2019 MongoDB, Inc.
1
+ # Copyright (C) 2018-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -73,8 +73,9 @@ module Mongo
73
73
  # @return [ true, false ] If a readable server is present.
74
74
  #
75
75
  # @since 2.4.0
76
+ # @deprecated
76
77
  def has_readable_server?(cluster, server_selector = nil)
77
- (server_selector || ServerSelector.primary).candidates(cluster).any?
78
+ !(server_selector || ServerSelector.primary).try_select_server(cluster).nil?
78
79
  end
79
80
 
80
81
  # Determine if the topology would select a writable server for the
@@ -89,7 +90,7 @@ module Mongo
89
90
  #
90
91
  # @since 2.4.0
91
92
  def has_writable_server?(cluster)
92
- cluster.servers.any?{ |server| server.primary? }
93
+ !ServerSelector.primary.try_select_server(cluster).nil?
93
94
  end
94
95
 
95
96
  # A replica set topology is a replica set.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2018-2019 MongoDB, Inc.
1
+ # Copyright (C) 2018-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -97,7 +97,7 @@ module Mongo
97
97
  #
98
98
  # @since 2.0.0
99
99
  def servers(servers)
100
- servers.select{ |server| server.mongos? }
100
+ servers.select { |server| server.mongos? }
101
101
  end
102
102
 
103
103
  # A sharded topology is sharded.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -96,7 +96,7 @@ module Mongo
96
96
  #
97
97
  # @since 2.0.0
98
98
  def servers(servers, name = nil)
99
- [ servers.detect { |server| !server.unknown? } ]
99
+ servers.reject { |server| server.unknown? }
100
100
  end
101
101
 
102
102
  # A single topology is not sharded.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 MongoDB, Inc.
1
+ # Copyright (C) 2019-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -240,7 +240,7 @@ module Mongo
240
240
  operation.delete(:write_concern)
241
241
  client.send(:with_session, opts) do |session|
242
242
  server = next_primary(nil, session)
243
- if (options[:collation] || options[Operation::COLLATION]) && !server.features.collation_enabled?
243
+ if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
244
244
  raise Error::UnsupportedCollation
245
245
  end
246
246
 
@@ -297,6 +297,10 @@ module Mongo
297
297
  # @param [ Hash ] filter The filter to use in the find.
298
298
  # @param [ Hash ] options The options for the find.
299
299
  #
300
+ # @option options [ true, false ] :allow_disk_use When set to true, the
301
+ # server can write temporary data to disk while executing the find
302
+ # operation. This option is only available on MongoDB server versions
303
+ # 4.4 and newer.
300
304
  # @option options [ true, false ] :allow_partial_results Allows the query to get partial
301
305
  # results if some shards are down.
302
306
  # @option options [ Integer ] :batch_size The number of documents returned in each batch
@@ -400,7 +404,7 @@ module Mongo
400
404
  View::ChangeStream.new(View.new(self, {}, options), pipeline, nil, options)
401
405
  end
402
406
 
403
- # Gets the number of matching documents in the collection.
407
+ # Gets an estimated number of matching documents in the collection.
404
408
  #
405
409
  # @example Get the count.
406
410
  # collection.count(name: 1)
@@ -429,11 +433,13 @@ module Mongo
429
433
  View.new(self, filter || {}, options).count(options)
430
434
  end
431
435
 
432
- # Gets the number of of matching documents in the collection. Unlike the deprecated #count
433
- # method, this will return the exact number of documents matching the filter rather than the estimate.
436
+ # Gets the number of documents matching the query. Unlike the deprecated
437
+ # #count method, this will return the exact number of documents matching
438
+ # the filter (or exact number of documents in the collection, if no filter
439
+ # is provided) rather than an estimate.
434
440
  #
435
- # @example Get the number of documents in the collection.
436
- # collection_view.count_documents
441
+ # Use #estimated_document_count to retrieve an estimate of the number
442
+ # of documents in the collection using the collection metadata.
437
443
  #
438
444
  # @param [ Hash ] filter A filter for matching documents.
439
445
  # @param [ Hash ] options Options for the operation.
@@ -450,19 +456,20 @@ module Mongo
450
456
  # @return [ Integer ] The document count.
451
457
  #
452
458
  # @since 2.6.0
453
- def count_documents(filter, options = {})
459
+ def count_documents(filter = {}, options = {})
454
460
  View.new(self, filter, options).count_documents(options)
455
461
  end
456
462
 
457
- # Gets an estimate of the count of documents in a collection using collection metadata.
463
+ # Gets an estimate of the number of documents in the collection using the
464
+ # collection metadata.
458
465
  #
459
- # @example Get the number of documents in the collection.
460
- # collection_view.estimated_document_count
466
+ # Use #count_documents to retrieve the exact number of documents in the
467
+ # collection, or to count documents matching a filter.
461
468
  #
462
469
  # @param [ Hash ] options Options for the operation.
463
470
  #
464
- # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the command to
465
- # run.
471
+ # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
472
+ # the command to run for on the server.
466
473
  # @option opts [ Hash ] :read The read preference options.
467
474
  #
468
475
  # @return [ Integer ] The document count.
@@ -537,19 +544,23 @@ module Mongo
537
544
  # @since 2.0.0
538
545
  def insert_one(document, opts = {})
539
546
  client.send(:with_session, opts) do |session|
540
- write_concern = write_concern_with_session(session)
547
+ write_concern = if opts[:write_concern]
548
+ WriteConcern.get(opts[:write_concern])
549
+ else
550
+ write_concern_with_session(session)
551
+ end
541
552
  write_with_retry(session, write_concern) do |server, txn_num|
542
553
  Operation::Insert.new(
543
- :documents => [ document ],
544
- :db_name => database.name,
545
- :coll_name => name,
546
- :write_concern => write_concern,
547
- :bypass_document_validation => !!opts[:bypass_document_validation],
548
- :options => opts,
549
- :id_generator => client.options[:id_generator],
550
- :session => session,
551
- :txn_num => txn_num
552
- ).execute(server, client: client)
554
+ :documents => [ document ],
555
+ :db_name => database.name,
556
+ :coll_name => name,
557
+ :write_concern => write_concern,
558
+ :bypass_document_validation => !!opts[:bypass_document_validation],
559
+ :options => opts,
560
+ :id_generator => client.options[:id_generator],
561
+ :session => session,
562
+ :txn_num => txn_num
563
+ ).execute(server, client: client)
553
564
  end
554
565
  end
555
566
  end
@@ -605,6 +616,8 @@ module Mongo
605
616
  #
606
617
  # @option options [ Hash ] :collation The collation to use.
607
618
  # @option options [ Session ] :session The session to use.
619
+ # @option options [ Hash | String ] :hint The index to use for this operation.
620
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
608
621
  #
609
622
  # @return [ Result ] The response from the database.
610
623
  #
@@ -623,6 +636,8 @@ module Mongo
623
636
  #
624
637
  # @option options [ Hash ] :collation The collation to use.
625
638
  # @option options [ Session ] :session The session to use.
639
+ # @option options [ Hash | String ] :hint The index to use for this operation.
640
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
626
641
  #
627
642
  # @return [ Result ] The response from the database.
628
643
  #
@@ -669,6 +684,8 @@ module Mongo
669
684
  # not to skip document level validation.
670
685
  # @option options [ Hash ] :collation The collation to use.
671
686
  # @option options [ Session ] :session The session to use.
687
+ # @option options [ Hash | String ] :hint The index to use for this operation.
688
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
672
689
  #
673
690
  # @return [ Result ] The response from the database.
674
691
  #
@@ -694,6 +711,8 @@ module Mongo
694
711
  # @option options [ Array ] :array_filters A set of filters specifying to which array elements
695
712
  # an update should apply.
696
713
  # @option options [ Session ] :session The session to use.
714
+ # @option options [ Hash | String ] :hint The index to use for this operation.
715
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
697
716
  #
698
717
  # @return [ Result ] The response from the database.
699
718
  #
@@ -719,6 +738,8 @@ module Mongo
719
738
  # @option options [ Array ] :array_filters A set of filters specifying to which array elements
720
739
  # an update should apply.
721
740
  # @option options [ Session ] :session The session to use.
741
+ # @option options [ Hash | String ] :hint The index to use for this operation.
742
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
722
743
  #
723
744
  # @return [ Result ] The response from the database.
724
745
  #
@@ -745,6 +766,8 @@ module Mongo
745
766
  # Defaults to the collection's write concern.
746
767
  # @option options [ Hash ] :collation The collation to use.
747
768
  # @option options [ Session ] :session The session to use.
769
+ # @option options [ Hash | String ] :hint The index to use for this operation.
770
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
748
771
  #
749
772
  # @return [ BSON::Document, nil ] The document, if found.
750
773
  #
@@ -781,6 +804,8 @@ module Mongo
781
804
  # @option options [ Array ] :array_filters A set of filters specifying to which array elements
782
805
  # an update should apply.
783
806
  # @option options [ Session ] :session The session to use.
807
+ # @option options [ Hash | String ] :hint The index to use for this operation.
808
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
784
809
  #
785
810
  # @return [ BSON::Document ] The document.
786
811
  #
@@ -815,6 +840,8 @@ module Mongo
815
840
  # Defaults to the collection's write concern.
816
841
  # @option options [ Hash ] :collation The collation to use.
817
842
  # @option options [ Session ] :session The session to use.
843
+ # @option options [ Hash | String ] :hint The index to use for this operation.
844
+ # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
818
845
  #
819
846
  # @return [ BSON::Document ] The document.
820
847
  #
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -116,6 +116,10 @@ module Mongo
116
116
  # @param [ Hash ] filter The query filter.
117
117
  # @param [ Hash ] options The additional query options.
118
118
  #
119
+ # @option options [ true, false ] :allow_disk_use When set to true, the
120
+ # server can write temporary data to disk while executing the find
121
+ # operation. This option is only available on MongoDB server versions
122
+ # 4.4 and newer.
119
123
  # @option options :comment [ String ] Associate a comment with the query.
120
124
  # @option options :batch_size [ Integer ] The number of docs to return in
121
125
  # each response from MongoDB.
@@ -197,7 +201,7 @@ module Mongo
197
201
  end
198
202
 
199
203
  def validate_collation!(server, coll)
200
- if coll &&!server.features.collation_enabled?
204
+ if coll && !server.with_connection { |connection| connection.features }.collation_enabled?
201
205
  raise Error::UnsupportedCollation.new
202
206
  end
203
207
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -108,7 +108,10 @@ module Mongo
108
108
  end
109
109
 
110
110
  def valid_server?(server)
111
- server.standalone? || server.mongos? || server.primary? || secondary_ok?
111
+ description = server.with_connection do |connection|
112
+ connection.description
113
+ end
114
+ description.standalone? || description.mongos? || description.primary? || secondary_ok?
112
115
  end
113
116
 
114
117
  def write?
@@ -129,7 +132,7 @@ module Mongo
129
132
  end
130
133
 
131
134
  def validate_collation!(server)
132
- if options[:collation] && !server.features.collation_enabled?
135
+ if options[:collation] && !server.with_connection { |connection| connection.features }.collation_enabled?
133
136
  raise Error::UnsupportedCollation.new
134
137
  end
135
138
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -48,6 +48,7 @@ module Mongo
48
48
  no_cursor_timeout: 'noCursorTimeout',
49
49
  await_data: 'awaitData',
50
50
  allow_partial_results: 'allowPartialResults',
51
+ allow_disk_use: 'allowDiskUse',
51
52
  collation: 'collation'
52
53
  ).freeze
53
54
 
@@ -101,6 +102,9 @@ module Mongo
101
102
  collection.read_concern)
102
103
  end
103
104
  command = Options::Mapper.transform_documents(convert_flags(options), MAPPINGS, document)
105
+ if command['oplogReplay']
106
+ log_warn("oplogReplay is deprecated and ignored by MongoDB 4.4 and later")
107
+ end
104
108
  convert_limit_and_batch_size(command)
105
109
  command
106
110
  end
@@ -135,6 +139,10 @@ module Mongo
135
139
  o.merge!(key => true)
136
140
  end
137
141
  end
142
+
143
+ def log_warn(*args)
144
+ database.client.log_warn(*args)
145
+ end
138
146
  end
139
147
  end
140
148
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017-2019 MongoDB, Inc.
1
+ # Copyright (C) 2017-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -147,19 +147,16 @@ module Mongo
147
147
  # @since 2.6.0
148
148
  def try_next
149
149
  raise StopIteration.new if closed?
150
- retried = false
151
-
152
150
  begin
153
151
  doc = @cursor.try_next
154
152
  rescue Mongo::Error => e
155
- if retried || !e.change_stream_resumable?
153
+ if !e.change_stream_resumable?
156
154
  raise
157
155
  end
158
156
 
159
- retried = true
160
157
  # Rerun initial aggregation.
161
158
  # Any errors here will stop iteration and break out of this
162
- # method
159
+ # method.
163
160
 
164
161
  # Save cursor's resume token so we can use it
165
162
  # to create a new cursor