mongo 2.13.2 → 2.15.0

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