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) 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.
@@ -22,12 +22,18 @@ module Mongo
22
22
 
23
23
  private
24
24
 
25
- def command(server)
25
+ def command(connection)
26
+ if Lint.enabled?
27
+ unless connection.is_a?(Server::Connection)
28
+ raise Error::LintError, "Connection is not a Connection instance: #{connection}"
29
+ end
30
+ end
31
+
26
32
  sel = super
27
- add_bypass_document_validation(sel, server)
33
+ add_bypass_document_validation(sel)
28
34
  end
29
35
 
30
- def add_bypass_document_validation(sel, server)
36
+ def add_bypass_document_validation(sel)
31
37
  return sel unless bypass_document_validation
32
38
  sel.merge(bypassDocumentValidation: true)
33
39
  end
@@ -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.
@@ -33,8 +33,8 @@ module Mongo
33
33
  # In order for the override to work correctly the
34
34
  # CausalConsistencySupported module must be included after
35
35
  # SessionsSupported module in target classes.
36
- def apply_causal_consistency!(selector, server)
37
- apply_causal_consistency_if_possible(selector, server)
36
+ def apply_causal_consistency!(selector, connection)
37
+ apply_causal_consistency_if_possible(selector, connection)
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,56 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+ module CollectionsInfoOrListCollections
18
+ include PolymorphicLookup
19
+
20
+ # Execute the operation.
21
+ #
22
+ # @example
23
+ # operation.execute(server, client: nil)
24
+ #
25
+ # @param [ Mongo::Server ] server The server to send the operation to.
26
+ # @param [ Mongo::Client ] client The client that will be used to
27
+ # perform auto-encryption if it is necessary to encrypt the command
28
+ # being executed (optional).
29
+ #
30
+ # @return [ Mongo::Operation::CollectionsInfo::Result,
31
+ # Mongo::Operation::ListCollections::Result ] The operation result.
32
+ def execute(server, client:)
33
+ server.with_connection do |connection|
34
+ operation = final_operation(connection)
35
+ operation.execute(connection, client: client)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def final_operation(connection)
42
+ op_class = if connection.features.list_collections_enabled?
43
+ if connection.features.op_msg_enabled?
44
+ ListCollections::OpMsg
45
+ else
46
+ ListCollections::Command
47
+ end
48
+ else
49
+ CollectionsInfo::Command
50
+ end
51
+
52
+ op_class.new(spec)
53
+ end
54
+ end
55
+ end
56
+ 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.
@@ -22,21 +22,27 @@ module Mongo
22
22
 
23
23
  include ResponseHandling
24
24
 
25
- def do_execute(server, client, options = {})
25
+ def do_execute(connection, client, options = {})
26
26
  unpin_maybe(session) do
27
- add_error_labels do
28
- add_server_diagnostics(server) do
29
- get_result(server, client, options).tap do |result|
30
- process_result(result, server)
27
+ add_error_labels(client, connection, session) do
28
+ add_server_diagnostics(connection) do
29
+ get_result(connection, client, options).tap do |result|
30
+ process_result(result, connection)
31
31
  end
32
32
  end
33
33
  end
34
34
  end
35
35
  end
36
36
 
37
- def execute(server, client:, options: {})
38
- do_execute(server, client, options).tap do |result|
39
- validate_result(result, server)
37
+ def execute(connection, client:, options: {})
38
+ if Lint.enabled?
39
+ unless connection.is_a?(Mongo::Server::Connection)
40
+ raise Error::LintError, "Connection argument is of wrong type: #{connection}"
41
+ end
42
+ end
43
+
44
+ do_execute(connection, client, options).tap do |result|
45
+ validate_result(result, client, connection)
40
46
  end
41
47
  end
42
48
 
@@ -46,41 +52,53 @@ module Mongo
46
52
  Result
47
53
  end
48
54
 
49
- def get_result(server, client, options = {})
50
- result_class.new(dispatch_message(server, client, options))
55
+ def get_result(connection, client, options = {})
56
+ result_class.new(*dispatch_message(connection, client, options))
51
57
  end
52
58
 
53
59
  # Returns a Protocol::Message or nil as reply.
54
- def dispatch_message(server, client, options = {})
55
- server.with_connection do |connection|
56
- message = build_message(server)
57
- message = message.maybe_encrypt(server, client)
58
- connection.dispatch([ message ], operation_id, client, options)
59
- end
60
+ def dispatch_message(connection, client, options = {})
61
+ message = build_message(connection)
62
+ message = message.maybe_encrypt(connection, client)
63
+ reply = connection.dispatch([ message ], operation_id, client, options)
64
+ [reply, connection.description]
60
65
  end
61
66
 
62
- def build_message(server)
63
- message(server)
67
+ def build_message(connection)
68
+ message(connection)
64
69
  end
65
70
 
66
- def process_result(result, server)
67
- server.update_cluster_time(result)
71
+ def process_result(result, connection)
72
+ connection.server.update_cluster_time(result)
73
+
74
+ process_result_for_sdam(result, connection)
75
+
76
+ if session
77
+ session.process(result)
78
+ end
79
+
80
+ result
81
+ end
68
82
 
69
- if result.not_master? || result.node_recovering?
83
+ def process_result_for_sdam(result, connection)
84
+ if (result.not_master? || result.node_recovering?) &&
85
+ connection.generation >= connection.server.pool.generation
86
+ then
70
87
  if result.node_shutting_down?
71
88
  keep_pool = false
72
89
  else
73
90
  # Max wire version needs to be examined while the server is known
74
- keep_pool = server.description.server_version_gte?('4.2')
91
+ keep_pool = connection.description.server_version_gte?('4.2')
75
92
  end
76
93
 
77
- server.unknown!(keep_connection_pool: keep_pool)
94
+ connection.server.unknown!(
95
+ keep_connection_pool: keep_pool,
96
+ generation: connection.generation,
97
+ topology_version: result.topology_version,
98
+ )
78
99
 
79
- server.scan_semaphore.signal
100
+ connection.server.scan_semaphore.signal
80
101
  end
81
-
82
- session.process(result) if session
83
- result
84
102
  end
85
103
  end
86
104
  end
@@ -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.
@@ -21,8 +21,8 @@ module Mongo
21
21
  # @api private
22
22
  module ExecutableNoValidate
23
23
 
24
- def execute(server, client:)
25
- do_execute(server, client)
24
+ def execute(connection, client:)
25
+ do_execute(connection, client)
26
26
  end
27
27
  end
28
28
  end
@@ -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) 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.
@@ -22,7 +22,15 @@ module Mongo
22
22
 
23
23
  private
24
24
 
25
- def options(server = nil)
25
+ # Get the options for executing the operation on a particular connection.
26
+ #
27
+ # @param [ Server::Connection ] connection The connection that the
28
+ # operation will be executed on.
29
+ #
30
+ # @return [ Hash ] The options.
31
+ #
32
+ # @since 2.0.0
33
+ def options(connection)
26
34
  super.merge(limit: -1)
27
35
  end
28
36
  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) 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.
@@ -23,14 +23,16 @@ module Mongo
23
23
  include PolymorphicLookup
24
24
 
25
25
  def execute(server, client:, options: {})
26
- operation = final_operation(server)
27
- operation.execute(server, client: client, options: options)
26
+ server.with_connection do |connection|
27
+ operation = final_operation(connection)
28
+ operation.execute(connection, client: client, options: options)
29
+ end
28
30
  end
29
31
 
30
32
  private
31
33
 
32
- def final_operation(server)
33
- cls = if server.features.op_msg_enabled?
34
+ def final_operation(connection)
35
+ cls = if connection.features.op_msg_enabled?
34
36
  polymorphic_class(self.class.name, :OpMsg)
35
37
  else
36
38
  polymorphic_class(self.class.name, :Command)
@@ -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.
@@ -24,16 +24,18 @@ module Mongo
24
24
  include PolymorphicLookup
25
25
 
26
26
  def execute(server, client:)
27
- operation = final_operation(server)
28
- operation.execute(server, client: client)
27
+ server.with_connection do |connection|
28
+ operation = final_operation(connection)
29
+ operation.execute(connection, client: client)
30
+ end
29
31
  end
30
32
 
31
33
  private
32
34
 
33
- def final_operation(server)
34
- cls = if server.features.op_msg_enabled?
35
+ def final_operation(connection)
36
+ cls = if connection.features.op_msg_enabled?
35
37
  polymorphic_class(self.class.name, :OpMsg)
36
- elsif server.features.find_command_enabled?
38
+ elsif connection.features.find_command_enabled?
37
39
  polymorphic_class(self.class.name, :Command)
38
40
  else
39
41
  polymorphic_class(self.class.name, :Legacy)
@@ -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.
@@ -24,16 +24,18 @@ module Mongo
24
24
  include PolymorphicLookup
25
25
 
26
26
  def execute(server, client:)
27
- operation = final_operation(server)
28
- operation.execute(server, client: client)
27
+ server.with_connection do |connection|
28
+ operation = final_operation(connection)
29
+ operation.execute(connection, client: client)
30
+ end
29
31
  end
30
32
 
31
33
  private
32
34
 
33
- def final_operation(server)
34
- cls = if server.features.op_msg_enabled?
35
+ def final_operation(connection)
36
+ cls = if connection.features.op_msg_enabled?
35
37
  polymorphic_class(self.class.name, :OpMsg)
36
- elsif server.features.list_indexes_enabled?
38
+ elsif connection.features.list_indexes_enabled?
37
39
  polymorphic_class(self.class.name, :Command)
38
40
  else
39
41
  polymorphic_class(self.class.name, :Legacy)
@@ -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) 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.
@@ -27,32 +27,34 @@ module Mongo
27
27
 
28
28
  private
29
29
 
30
- # Get the options for executing the operation on a particular server.
30
+ # Get the options for executing the operation on a particular connection.
31
31
  #
32
- # @param [ Server ] server The server that the operation will be
33
- # executed on.
32
+ # @param [ Server::Connection ] connection The connection that the
33
+ # operation will be executed on.
34
34
  #
35
35
  # @return [ Hash ] The options.
36
36
  #
37
37
  # @since 2.0.0
38
- def options(server)
39
- add_slave_ok_flag_maybe(super, server)
38
+ def options(connection)
39
+ add_slave_ok_flag_maybe(super, connection)
40
40
  end
41
41
 
42
42
  # Adds :slave_ok flag to options based on the read preference specified
43
- # in the operation or implied by the topology that the server is a
44
- # part of.
43
+ # in the operation or implied by the topology that the connection's
44
+ # server is a part of.
45
45
  #
46
46
  # @param [ Hash ] options The options calculated so far.
47
+ # @param [ Server::Connection ] connection The connection that the
48
+ # operation will be executed on.
47
49
  #
48
50
  # @return [ Hash ] The new options.
49
- def add_slave_ok_flag_maybe(options, server)
51
+ def add_slave_ok_flag_maybe(options, connection)
50
52
  add_flag =
51
53
  # https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#topology-type-single
52
- if server.standalone?
54
+ if connection.description.standalone?
53
55
  # Read preference is never sent to standalones.
54
56
  false
55
- elsif server.cluster.single?
57
+ elsif connection.server.cluster.single?
56
58
  # In Single topology the driver forces primaryPreferred read
57
59
  # preference mode (via the slave_ok flag, in case of old servers)
58
60
  # so that the query is satisfied.
@@ -72,9 +74,9 @@ module Mongo
72
74
  options
73
75
  end
74
76
 
75
- def command(server)
77
+ def command(connection)
76
78
  sel = super
77
- update_selector_for_read_pref(sel, server)
79
+ update_selector_for_read_pref(sel, connection)
78
80
  end
79
81
 
80
82
  # Adds $readPreference field to the command document.
@@ -89,11 +91,12 @@ module Mongo
89
91
  # $readPreference is not sent to pre-OP_MSG replica set members.
90
92
  #
91
93
  # @param [ Hash ] sel Existing command document.
92
- # @param [ Server ] server The server that the command is to be sent to.
94
+ # @param [ Server::Connection ] connection The connection that the
95
+ # operation will be executed on.
93
96
  #
94
97
  # @return [ Hash ] New command document to send to the server.
95
- def update_selector_for_read_pref(sel, server)
96
- if read && server.mongos? && read_pref = read.to_mongos
98
+ def update_selector_for_read_pref(sel, connection)
99
+ if read && connection.description.mongos? && read_pref = read.to_mongos
97
100
  Mongo::Lint.validate_camel_case_read_preference(read_pref)
98
101
  sel = sel[:$query] ? sel : {:$query => sel}
99
102
  sel = sel.merge(:$readPreference => read_pref)