mongo 2.13.0 → 2.15.0.alpha

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 (375) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -4
  3. data.tar.gz.sig +0 -0
  4. data/README.md +4 -1
  5. data/Rakefile +46 -18
  6. data/lib/mongo.rb +32 -0
  7. data/lib/mongo/address.rb +1 -1
  8. data/lib/mongo/address/ipv4.rb +1 -1
  9. data/lib/mongo/address/ipv6.rb +1 -1
  10. data/lib/mongo/auth/aws/conversation.rb +1 -4
  11. data/lib/mongo/auth/base.rb +13 -7
  12. data/lib/mongo/auth/conversation_base.rb +32 -0
  13. data/lib/mongo/auth/cr/conversation.rb +6 -29
  14. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  15. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  16. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  17. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  18. data/lib/mongo/auth/user/view.rb +16 -9
  19. data/lib/mongo/auth/x509/conversation.rb +4 -25
  20. data/lib/mongo/background_thread.rb +11 -0
  21. data/lib/mongo/bulk_write.rb +38 -18
  22. data/lib/mongo/caching_cursor.rb +74 -0
  23. data/lib/mongo/client.rb +142 -16
  24. data/lib/mongo/cluster.rb +22 -31
  25. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  26. data/lib/mongo/cluster/sdam_flow.rb +14 -0
  27. data/lib/mongo/cluster/topology/single.rb +1 -1
  28. data/lib/mongo/collection.rb +58 -18
  29. data/lib/mongo/collection/view.rb +24 -20
  30. data/lib/mongo/collection/view/aggregation.rb +26 -5
  31. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  32. data/lib/mongo/collection/view/change_stream.rb +1 -1
  33. data/lib/mongo/collection/view/explainable.rb +27 -8
  34. data/lib/mongo/collection/view/iterable.rb +73 -13
  35. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  36. data/lib/mongo/collection/view/readable.rb +57 -21
  37. data/lib/mongo/collection/view/writable.rb +29 -15
  38. data/lib/mongo/crypt/encryption_io.rb +6 -6
  39. data/lib/mongo/cursor.rb +18 -5
  40. data/lib/mongo/database.rb +28 -5
  41. data/lib/mongo/database/view.rb +2 -2
  42. data/lib/mongo/error.rb +11 -1
  43. data/lib/mongo/error/bulk_write_error.rb +17 -3
  44. data/lib/mongo/error/internal_driver_error.rb +22 -0
  45. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  46. data/lib/mongo/error/operation_failure.rb +26 -7
  47. data/lib/mongo/error/parser.rb +65 -12
  48. data/lib/mongo/error/server_api_conflict.rb +23 -0
  49. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  50. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  51. data/lib/mongo/error/unmet_dependency.rb +21 -0
  52. data/lib/mongo/error/unsupported_option.rb +14 -12
  53. data/lib/mongo/grid/fs_bucket.rb +37 -37
  54. data/lib/mongo/index/view.rb +21 -11
  55. data/lib/mongo/lint.rb +2 -1
  56. data/lib/mongo/logger.rb +3 -3
  57. data/lib/mongo/monitoring.rb +13 -4
  58. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  59. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  60. data/lib/mongo/operation.rb +4 -2
  61. data/lib/mongo/operation/aggregate/result.rb +9 -8
  62. data/lib/mongo/operation/collections_info.rb +18 -1
  63. data/lib/mongo/operation/collections_info/command.rb +5 -0
  64. data/lib/mongo/operation/collections_info/result.rb +18 -1
  65. data/lib/mongo/operation/context.rb +99 -0
  66. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  67. data/lib/mongo/operation/delete/result.rb +3 -0
  68. data/lib/mongo/operation/explain/command.rb +4 -0
  69. data/lib/mongo/operation/explain/legacy.rb +4 -0
  70. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  71. data/lib/mongo/operation/explain/result.rb +3 -0
  72. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  73. data/lib/mongo/operation/find/result.rb +13 -0
  74. data/lib/mongo/operation/get_more/result.rb +3 -0
  75. data/lib/mongo/operation/indexes.rb +15 -1
  76. data/lib/mongo/operation/indexes/result.rb +5 -0
  77. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  78. data/lib/mongo/operation/insert/command.rb +2 -2
  79. data/lib/mongo/operation/insert/legacy.rb +2 -2
  80. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  81. data/lib/mongo/operation/insert/result.rb +5 -0
  82. data/lib/mongo/operation/list_collections/result.rb +9 -1
  83. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  84. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  85. data/lib/mongo/operation/result.rb +37 -6
  86. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  87. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  88. data/lib/mongo/operation/shared/executable.rb +25 -14
  89. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  90. data/lib/mongo/operation/shared/idable.rb +2 -1
  91. data/lib/mongo/operation/shared/limited.rb +1 -0
  92. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  93. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  94. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  95. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  96. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  97. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  98. data/lib/mongo/operation/shared/sessions_supported.rb +14 -2
  99. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  100. data/lib/mongo/operation/shared/write.rb +9 -18
  101. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  102. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  103. data/lib/mongo/operation/update/result.rb +8 -0
  104. data/lib/mongo/operation/users_info/result.rb +3 -0
  105. data/lib/mongo/protocol/compressed.rb +51 -5
  106. data/lib/mongo/protocol/message.rb +31 -4
  107. data/lib/mongo/protocol/msg.rb +37 -12
  108. data/lib/mongo/protocol/query.rb +36 -0
  109. data/lib/mongo/query_cache.rb +272 -0
  110. data/lib/mongo/retryable.rb +9 -2
  111. data/lib/mongo/server.rb +12 -16
  112. data/lib/mongo/server/app_metadata.rb +52 -18
  113. data/lib/mongo/server/connection.rb +5 -0
  114. data/lib/mongo/server/connection_base.rb +16 -15
  115. data/lib/mongo/server/connection_common.rb +2 -2
  116. data/lib/mongo/server/connection_pool.rb +9 -4
  117. data/lib/mongo/server/description.rb +12 -1
  118. data/lib/mongo/server/description/features.rb +9 -8
  119. data/lib/mongo/server/monitor.rb +21 -2
  120. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  121. data/lib/mongo/server/monitor/connection.rb +12 -13
  122. data/lib/mongo/server/pending_connection.rb +26 -8
  123. data/lib/mongo/server/push_monitor.rb +12 -2
  124. data/lib/mongo/server_selector/base.rb +5 -1
  125. data/lib/mongo/session.rb +7 -3
  126. data/lib/mongo/session/session_pool.rb +4 -2
  127. data/lib/mongo/socket.rb +35 -8
  128. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  129. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  130. data/lib/mongo/socket/ssl.rb +53 -24
  131. data/lib/mongo/srv/monitor.rb +7 -24
  132. data/lib/mongo/srv/resolver.rb +14 -10
  133. data/lib/mongo/timeout.rb +2 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +620 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +27 -1
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.md +87 -2
  141. data/spec/integration/auth_spec.rb +25 -15
  142. data/spec/integration/bson_symbol_spec.rb +4 -2
  143. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  144. data/spec/integration/bulk_write_spec.rb +48 -0
  145. data/spec/integration/change_stream_spec.rb +5 -5
  146. data/spec/integration/client_authentication_options_spec.rb +92 -28
  147. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
  148. data/spec/integration/command_monitoring_spec.rb +2 -2
  149. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  150. data/spec/integration/connection_spec.rb +2 -0
  151. data/spec/integration/cursor_reaping_spec.rb +54 -18
  152. data/spec/integration/docs_examples_spec.rb +8 -1
  153. data/spec/integration/fork_reconnect_spec.rb +60 -2
  154. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  155. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  156. data/spec/integration/ocsp_verifier_spec.rb +340 -0
  157. data/spec/integration/operation_failure_code_spec.rb +1 -1
  158. data/spec/integration/operation_failure_message_spec.rb +90 -0
  159. data/spec/integration/query_cache_spec.rb +1045 -0
  160. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  161. data/spec/integration/reconnect_spec.rb +1 -1
  162. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  163. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
  164. data/spec/integration/sdam_error_handling_spec.rb +86 -1
  165. data/spec/integration/sdam_events_spec.rb +8 -7
  166. data/spec/integration/server_selection_spec.rb +36 -0
  167. data/spec/integration/size_limit_spec.rb +20 -19
  168. data/spec/integration/snappy_compression_spec.rb +25 -0
  169. data/spec/integration/srv_monitoring_spec.rb +39 -4
  170. data/spec/integration/srv_spec.rb +56 -0
  171. data/spec/integration/transactions_examples_spec.rb +23 -7
  172. data/spec/integration/zlib_compression_spec.rb +1 -1
  173. data/spec/integration/zstd_compression_spec.rb +26 -0
  174. data/spec/lite_spec_helper.rb +15 -5
  175. data/spec/mongo/address_spec.rb +16 -12
  176. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  177. data/spec/mongo/auth/ldap_spec.rb +5 -1
  178. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  179. data/spec/mongo/auth/scram_spec.rb +1 -1
  180. data/spec/mongo/auth/user_spec.rb +1 -1
  181. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  182. data/spec/mongo/bulk_write_spec.rb +2 -2
  183. data/spec/mongo/caching_cursor_spec.rb +70 -0
  184. data/spec/mongo/client_construction_spec.rb +273 -35
  185. data/spec/mongo/client_encryption_spec.rb +16 -10
  186. data/spec/mongo/client_spec.rb +64 -0
  187. data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
  188. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  189. data/spec/mongo/cluster/topology/single_spec.rb +15 -6
  190. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  191. data/spec/mongo/cluster/topology_spec.rb +1 -1
  192. data/spec/mongo/cluster_spec.rb +6 -18
  193. data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
  194. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  195. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  196. data/spec/mongo/collection/view/readable_spec.rb +50 -0
  197. data/spec/mongo/collection_crud_spec.rb +4357 -0
  198. data/spec/mongo/collection_ddl_spec.rb +534 -0
  199. data/spec/mongo/collection_spec.rb +5 -4787
  200. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  201. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  202. data/spec/mongo/crypt/binary_spec.rb +1 -6
  203. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  204. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  205. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  206. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  207. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  209. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  210. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  211. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  212. data/spec/mongo/crypt/status_spec.rb +1 -6
  213. data/spec/mongo/database_spec.rb +174 -4
  214. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  215. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  216. data/spec/mongo/error/parser_spec.rb +37 -6
  217. data/spec/mongo/index/view_spec.rb +8 -2
  218. data/spec/mongo/logger_spec.rb +13 -11
  219. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  220. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  221. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  222. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  223. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  225. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  226. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  227. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  228. data/spec/mongo/operation/command_spec.rb +6 -3
  229. data/spec/mongo/operation/create_index_spec.rb +6 -3
  230. data/spec/mongo/operation/create_user_spec.rb +6 -3
  231. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  232. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  233. data/spec/mongo/operation/delete_spec.rb +11 -7
  234. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  235. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  236. data/spec/mongo/operation/get_more_spec.rb +3 -1
  237. data/spec/mongo/operation/indexes_spec.rb +5 -1
  238. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  239. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  240. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  241. data/spec/mongo/operation/insert_spec.rb +15 -12
  242. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  243. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  244. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  245. data/spec/mongo/operation/result_spec.rb +1 -1
  246. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  247. data/spec/mongo/operation/update/command_spec.rb +2 -2
  248. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  249. data/spec/mongo/operation/update_spec.rb +10 -7
  250. data/spec/mongo/operation/update_user_spec.rb +4 -1
  251. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  252. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  253. data/spec/mongo/query_cache_spec.rb +280 -0
  254. data/spec/mongo/retryable_spec.rb +3 -2
  255. data/spec/mongo/server/app_metadata_shared.rb +2 -2
  256. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  257. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  258. data/spec/mongo/server/connection_pool_spec.rb +8 -4
  259. data/spec/mongo/server/connection_spec.rb +39 -25
  260. data/spec/mongo/server/description_spec.rb +18 -0
  261. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  262. data/spec/mongo/server/monitor_spec.rb +9 -1
  263. data/spec/mongo/server_selector_spec.rb +2 -2
  264. data/spec/mongo/server_spec.rb +15 -2
  265. data/spec/mongo/socket/ssl_spec.rb +44 -4
  266. data/spec/mongo/socket_spec.rb +2 -2
  267. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  268. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  269. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  270. data/spec/mongo/uri_spec.rb +68 -41
  271. data/spec/mongo/utils_spec.rb +39 -0
  272. data/spec/runners/auth.rb +3 -0
  273. data/spec/runners/change_streams/test.rb +1 -1
  274. data/spec/runners/connection_string.rb +31 -124
  275. data/spec/runners/crud/requirement.rb +40 -3
  276. data/spec/runners/crud/test_base.rb +0 -19
  277. data/spec/runners/crud/verifier.rb +8 -0
  278. data/spec/runners/server_selection.rb +1 -1
  279. data/spec/runners/transactions/operation.rb +13 -2
  280. data/spec/runners/transactions/test.rb +3 -2
  281. data/spec/runners/unified.rb +96 -0
  282. data/spec/runners/unified/assertions.rb +249 -0
  283. data/spec/runners/unified/change_stream_operations.rb +26 -0
  284. data/spec/runners/unified/crud_operations.rb +199 -0
  285. data/spec/runners/unified/ddl_operations.rb +96 -0
  286. data/spec/runners/unified/entity_map.rb +39 -0
  287. data/spec/runners/unified/error.rb +25 -0
  288. data/spec/runners/unified/event_subscriber.rb +91 -0
  289. data/spec/runners/unified/exceptions.rb +21 -0
  290. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  291. data/spec/runners/unified/support_operations.rb +250 -0
  292. data/spec/runners/unified/test.rb +393 -0
  293. data/spec/runners/unified/test_group.rb +28 -0
  294. data/spec/runners/unified/using_hash.rb +31 -0
  295. data/spec/shared/LICENSE +20 -0
  296. data/spec/shared/bin/get-mongodb-download-url +17 -0
  297. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  298. data/spec/shared/lib/mrss/cluster_config.rb +218 -0
  299. data/spec/shared/lib/mrss/constraints.rb +346 -0
  300. data/spec/shared/lib/mrss/docker_runner.rb +262 -0
  301. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  302. data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
  303. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  304. data/spec/shared/lib/mrss/utils.rb +15 -0
  305. data/spec/shared/share/Dockerfile.erb +231 -0
  306. data/spec/shared/shlib/distro.sh +73 -0
  307. data/spec/shared/shlib/server.sh +290 -0
  308. data/spec/shared/shlib/set_env.sh +128 -0
  309. data/spec/solo/clean_exit_spec.rb +21 -0
  310. data/spec/spec_helper.rb +7 -2
  311. data/spec/spec_tests/cmap_spec.rb +7 -3
  312. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  313. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
  314. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
  315. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  316. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  317. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  318. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  319. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  320. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  321. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  322. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  323. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  324. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  325. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  326. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  327. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  328. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  329. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  330. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  331. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  332. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  333. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  334. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  335. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  336. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  337. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  338. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  339. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  340. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  341. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  342. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  343. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  344. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  345. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  346. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  347. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  348. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  349. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  350. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  351. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  352. data/spec/spec_tests/unified_spec.rb +15 -0
  353. data/spec/spec_tests/uri_options_spec.rb +47 -33
  354. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  355. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  356. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  357. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  358. data/spec/support/client_registry_macros.rb +11 -2
  359. data/spec/support/common_shortcuts.rb +59 -0
  360. data/spec/support/constraints.rb +6 -253
  361. data/spec/support/matchers.rb +16 -0
  362. data/spec/support/ocsp +1 -0
  363. data/spec/support/session_registry.rb +52 -0
  364. data/spec/support/shared/session.rb +2 -2
  365. data/spec/support/spec_config.rb +68 -3
  366. data/spec/support/spec_setup.rb +48 -38
  367. data/spec/support/utils.rb +102 -4
  368. metadata +1087 -936
  369. metadata.gz.sig +0 -0
  370. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
  371. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  372. data/spec/support/child_process_helper.rb +0 -78
  373. data/spec/support/cluster_config.rb +0 -207
  374. data/spec/support/lite_constraints.rb +0 -141
  375. data/spec/support/spec_organizer.rb +0 -129
data/lib/mongo/cluster.rb CHANGED
@@ -107,6 +107,11 @@ module Mongo
107
107
  # for the server monitor to refresh its description via ismaster.
108
108
  # @option options [ Hash ] :resolv_options For internal driver use only.
109
109
  # Options to pass through to Resolv::DNS constructor for SRV lookups.
110
+ # @option options [ Hash ] :server_api The requested server API version.
111
+ # This hash can have the following items:
112
+ # - *:version* -- string
113
+ # - *:strict* -- boolean
114
+ # - *:deprecation_errors* -- boolean
110
115
  #
111
116
  # @since 2.0.0
112
117
  def initialize(seeds, monitoring, options = Options::Redacted.new)
@@ -129,7 +134,9 @@ module Mongo
129
134
  @servers = []
130
135
  @monitoring = monitoring
131
136
  @event_listeners = Event::Listeners.new
132
- @app_metadata = Server::AppMetadata.new(@options)
137
+ @app_metadata = Server::AppMetadata.new(@options.merge(purpose: :application))
138
+ @monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :monitor))
139
+ @push_monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :push_monitor))
133
140
  @cluster_time_lock = Mutex.new
134
141
  @cluster_time = nil
135
142
  @srv_monitor_lock = Mutex.new
@@ -199,9 +206,6 @@ module Mongo
199
206
  @cursor_reaper, @socket_reaper,
200
207
  ], options)
201
208
 
202
- ObjectSpace.define_finalizer(self, self.class.finalize(
203
- {}, @periodic_executor, @session_pool))
204
-
205
209
  @periodic_executor.run!
206
210
  end
207
211
 
@@ -244,7 +248,11 @@ module Mongo
244
248
  # the servers list above and the wait call below, we should not
245
249
  # wait for the full remaining time - wait for up to 1 second, then
246
250
  # recheck the state.
247
- server_selection_semaphore.wait([time_remaining, 1].min)
251
+ begin
252
+ server_selection_semaphore.wait([time_remaining, 1].min)
253
+ rescue ::Timeout::Error
254
+ # nothing
255
+ end
248
256
  end
249
257
  end
250
258
 
@@ -288,6 +296,12 @@ module Mongo
288
296
  # @since 2.4.0
289
297
  attr_reader :app_metadata
290
298
 
299
+ # @api private
300
+ attr_reader :monitor_app_metadata
301
+
302
+ # @api private
303
+ attr_reader :push_monitor_app_metadata
304
+
291
305
  # @return [ Array<String> ] The addresses of seed servers. Contains
292
306
  # addresses that were given to Cluster when it was instantiated, not
293
307
  # current addresses that the cluster is using as a result of SDAM.
@@ -445,25 +459,6 @@ module Mongo
445
459
  # @api private
446
460
  attr_reader :server_selection_semaphore
447
461
 
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
462
  # Closes the cluster.
468
463
  #
469
464
  # @note Applications should call Client#close to disconnect from
@@ -950,13 +945,9 @@ module Mongo
950
945
  # Start SRV monitor
951
946
  @srv_monitor_lock.synchronize do
952
947
  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)
948
+ monitor_options = Utils.shallow_symbolize_keys(options.merge(
949
+ timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
950
+ @srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
960
951
  end
961
952
  @srv_monitor.run!
962
953
  end
@@ -130,16 +130,20 @@ module Mongo
130
130
  end
131
131
 
132
132
  to_kill_copy.each do |server, op_specs|
133
+ options = {
134
+ server_api: server.options[:server_api],
135
+ }
136
+ context = Operation::Context.new(options: options)
133
137
  op_specs.each do |op_spec|
134
138
  if server.features.find_command_enabled?
135
139
  Cursor::Builder::KillCursorsCommand.update_cursors(op_spec, active_cursors_copy.to_a)
136
140
  if Cursor::Builder::KillCursorsCommand.get_cursors_list(op_spec).size > 0
137
- Operation::KillCursors.new(op_spec).execute(server, client: nil)
141
+ Operation::KillCursors.new(op_spec).execute(server, context: context)
138
142
  end
139
143
  else
140
144
  Cursor::Builder::OpKillCursors.update_cursors(op_spec, active_cursors_copy.to_a)
141
145
  if Cursor::Builder::OpKillCursors.get_cursors_list(op_spec).size > 0
142
- Operation::KillCursors.new(op_spec).execute(server, client: nil)
146
+ Operation::KillCursors.new(op_spec).execute(server, context: context)
143
147
  end
144
148
  end
145
149
  end
@@ -178,6 +178,7 @@ class Mongo::Cluster
178
178
  raise ArgumentError, "Unknown topology #{topology.class}"
179
179
  end
180
180
 
181
+ verify_invariants
181
182
  commit_changes
182
183
  disconnect_servers
183
184
  end
@@ -363,6 +364,9 @@ class Mongo::Cluster
363
364
  end
364
365
  end
365
366
  end
367
+
368
+ verify_invariants
369
+
366
370
  added_servers
367
371
  end
368
372
 
@@ -599,5 +603,15 @@ class Mongo::Cluster
599
603
 
600
604
  @previous_server_descriptions != server_descriptions
601
605
  end
606
+
607
+ def verify_invariants
608
+ if Mongo::Lint.enabled?
609
+ if cluster.topology.single?
610
+ if cluster.servers_list.length > 1
611
+ raise Mongo::Error::LintError, "Trying to create a single topology with multiple servers: #{cluster.servers_list}"
612
+ end
613
+ end
614
+ end
615
+ end
602
616
  end
603
617
  end
@@ -133,7 +133,7 @@ module Mongo
133
133
 
134
134
  def validate_options(options, cluster)
135
135
  if cluster.servers_list.length > 1
136
- raise ArgumentError, 'Cannot instantiate a single topology with more than one server in the cluster'
136
+ raise ArgumentError, "Cannot instantiate a single topology with more than one server in the cluster: #{cluster.servers_list.map(&:address).map(&:seed).join(', ')}"
137
137
  end
138
138
 
139
139
  super(options, cluster)
@@ -223,6 +223,7 @@ module Mongo
223
223
  # @param [ Hash ] opts The options for the create operation.
224
224
  #
225
225
  # @option options [ Session ] :session The session to use for the operation.
226
+ # @option opts [ Hash ] :write_concern The write concern options.
226
227
  #
227
228
  # @return [ Result ] The result of the command.
228
229
  #
@@ -239,6 +240,11 @@ module Mongo
239
240
  operation.delete(:write)
240
241
  operation.delete(:write_concern)
241
242
  client.send(:with_session, opts) do |session|
243
+ write_concern = if opts[:write_concern]
244
+ WriteConcern.get(opts[:write_concern])
245
+ else
246
+ self.write_concern
247
+ end
242
248
  server = next_primary(nil, session)
243
249
  if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
244
250
  raise Error::UnsupportedCollation
@@ -248,8 +254,8 @@ module Mongo
248
254
  selector: operation,
249
255
  db_name: database.name,
250
256
  write_concern: write_concern,
251
- session: session
252
- }).execute(server, client: client)
257
+ session: session,
258
+ }).execute(server, context: Operation::Context.new(client: client, session: session))
253
259
  end
254
260
  end
255
261
 
@@ -264,22 +270,33 @@ module Mongo
264
270
  # @param [ Hash ] opts The options for the drop operation.
265
271
  #
266
272
  # @option options [ Session ] :session The session to use for the operation.
273
+ # @option opts [ Hash ] :write_concern The write concern options.
267
274
  #
268
275
  # @return [ Result ] The result of the command.
269
276
  #
270
277
  # @since 2.0.0
271
278
  def drop(opts = {})
272
279
  client.send(:with_session, opts) do |session|
280
+ temp_write_concern = write_concern
281
+ write_concern = if opts[:write_concern]
282
+ WriteConcern.get(opts[:write_concern])
283
+ else
284
+ temp_write_concern
285
+ end
273
286
  Operation::Drop.new({
274
287
  selector: { :drop => name },
275
288
  db_name: database.name,
276
289
  write_concern: write_concern,
277
- session: session
278
- }).execute(next_primary(nil, session), client: client)
290
+ session: session,
291
+ }).execute(next_primary(nil, session), context: Operation::Context.new(client: client, session: session))
279
292
  end
280
293
  rescue Error::OperationFailure => ex
281
- raise ex unless ex.message =~ /ns not found/
282
- false
294
+ # NamespaceNotFound
295
+ if ex.code == 26 || ex.code.nil? && ex.message =~ /ns not found/
296
+ false
297
+ else
298
+ raise
299
+ end
283
300
  end
284
301
 
285
302
  # Find documents in the collection.
@@ -400,7 +417,7 @@ module Mongo
400
417
  View::ChangeStream.new(View.new(self, {}, options), pipeline, nil, options)
401
418
  end
402
419
 
403
- # Gets the number of matching documents in the collection.
420
+ # Gets an estimated number of matching documents in the collection.
404
421
  #
405
422
  # @example Get the count.
406
423
  # collection.count(name: 1)
@@ -429,11 +446,13 @@ module Mongo
429
446
  View.new(self, filter || {}, options).count(options)
430
447
  end
431
448
 
432
- # Gets the number of matching documents in the collection. Unlike the deprecated #count
433
- # method, this will return the exact number of documents matching the filter rather than the estimate.
449
+ # Gets the number of documents matching the query. Unlike the deprecated
450
+ # #count method, this will return the exact number of documents matching
451
+ # the filter (or exact number of documents in the collection, if no filter
452
+ # is provided) rather than an estimate.
434
453
  #
435
- # @example Get the number of documents in the collection.
436
- # collection_view.count_documents
454
+ # Use #estimated_document_count to retrieve an estimate of the number
455
+ # of documents in the collection using the collection metadata.
437
456
  #
438
457
  # @param [ Hash ] filter A filter for matching documents.
439
458
  # @param [ Hash ] options Options for the operation.
@@ -454,15 +473,16 @@ module Mongo
454
473
  View.new(self, filter, options).count_documents(options)
455
474
  end
456
475
 
457
- # Gets an estimate of the count of documents in a collection using collection metadata.
476
+ # Gets an estimate of the number of documents in the collection using the
477
+ # collection metadata.
458
478
  #
459
- # @example Get the number of documents in the collection.
460
- # collection_view.estimated_document_count
479
+ # Use #count_documents to retrieve the exact number of documents in the
480
+ # collection, or to count documents matching a filter.
461
481
  #
462
482
  # @param [ Hash ] options Options for the operation.
463
483
  #
464
- # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow the command to
465
- # run.
484
+ # @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
485
+ # the command to run for on the server.
466
486
  # @option opts [ Hash ] :read The read preference options.
467
487
  #
468
488
  # @return [ Integer ] The document count.
@@ -536,12 +556,19 @@ module Mongo
536
556
  #
537
557
  # @since 2.0.0
538
558
  def insert_one(document, opts = {})
559
+ QueryCache.clear_namespace(namespace)
560
+
539
561
  client.send(:with_session, opts) do |session|
540
562
  write_concern = if opts[:write_concern]
541
563
  WriteConcern.get(opts[:write_concern])
542
564
  else
543
565
  write_concern_with_session(session)
544
566
  end
567
+
568
+ if document.nil?
569
+ raise ArgumentError, "Document to be inserted cannot be nil"
570
+ end
571
+
545
572
  write_with_retry(session, write_concern) do |server, txn_num|
546
573
  Operation::Insert.new(
547
574
  :documents => [ document ],
@@ -552,8 +579,8 @@ module Mongo
552
579
  :options => opts,
553
580
  :id_generator => client.options[:id_generator],
554
581
  :session => session,
555
- :txn_num => txn_num
556
- ).execute(server, client: client)
582
+ :txn_num => txn_num,
583
+ ).execute(server, context: Operation::Context.new(client: client, session: session))
557
584
  end
558
585
  end
559
586
  end
@@ -566,12 +593,16 @@ module Mongo
566
593
  # @param [ Array<Hash> ] documents The documents to insert.
567
594
  # @param [ Hash ] options The insert options.
568
595
  #
596
+ # @option options [ true | false ] :ordered Whether the operations
597
+ # should be executed in order.
569
598
  # @option options [ Session ] :session The session to use for the operation.
570
599
  #
571
600
  # @return [ Result ] The database response wrapper.
572
601
  #
573
602
  # @since 2.0.0
574
603
  def insert_many(documents, options = {})
604
+ QueryCache.clear_namespace(namespace)
605
+
575
606
  inserts = documents.map{ |doc| { :insert_one => doc }}
576
607
  bulk_write(inserts, options)
577
608
  end
@@ -854,5 +885,14 @@ module Mongo
854
885
  def namespace
855
886
  "#{database.name}.#{name}"
856
887
  end
888
+
889
+ # Whether the collection is a system collection.
890
+ #
891
+ # @return [ Boolean ] Whether the system is a system collection.
892
+ #
893
+ # @api private
894
+ def system_collection?
895
+ name.start_with?('system.')
896
+ end
857
897
  end
858
898
  end
@@ -120,27 +120,31 @@ module Mongo
120
120
  # server can write temporary data to disk while executing the find
121
121
  # operation. This option is only available on MongoDB server versions
122
122
  # 4.4 and newer.
123
- # @option options :comment [ String ] Associate a comment with the query.
124
- # @option options :batch_size [ Integer ] The number of docs to return in
125
- # each response from MongoDB.
126
- # @option options :projection [ Hash ] The fields to include or exclude in
127
- # returned docs.
128
- # @option options :hint [ Hash ] Override default index selection and force
129
- # MongoDB to use a specific index for the query.
130
- # @option options :limit [ Integer ] Max number of docs to return.
131
- # @option options :max_scan [ Integer ] Constrain the query to only scan the
132
- # specified number of docs. Use to prevent queries from running too long.
133
- # Deprecated as of MongoDB server version 4.0.
134
- # @option options :read [ Symbol ] The read preference to use for the query.
135
- # If none is provided, the collection's default read preference is used.
136
- # @option options :show_disk_loc [ true, false ] Return disk location info as
137
- # a field in each doc.
138
- # @option options :skip [ Integer ] The number of documents to skip.
139
- # @option options :snapshot [ true, false ] Prevents returning a doc more than
140
- # once. Deprecated as of MongoDB server version 4.0.
141
- # @option options :sort [ Hash ] The key and direction pairs used to sort the
142
- # results.
123
+ # @option options [ Integer ] :batch_size The number of documents to
124
+ # return in each response from MongoDB.
143
125
  # @option options [ Hash ] :collation The collation to use.
126
+ # @option options [ String ] :comment Associate a comment with the query.
127
+ # @option options [ Hash ] :explain Execute an explain with the provided
128
+ # explain options (known options are :verbose and :verbosity) rather
129
+ # than a find.
130
+ # @option options [ Hash ] :hint Override the default index selection and
131
+ # force MongoDB to use a specific index for the query.
132
+ # @option options [ Integer ] :limit Max number of documents to return.
133
+ # @option options [ Integer ] :max_scan Constrain the query to only scan
134
+ # the specified number of documents. Use to prevent queries from
135
+ # running for too long. Deprecated as of MongoDB server version 4.0.
136
+ # @option options [ Hash ] :projection The fields to include or exclude
137
+ # in the returned documents.
138
+ # @option options [ Hash ] :read The read preference to use for the
139
+ # query. If none is provided, the collection's default read preference
140
+ # is used.
141
+ # @option options [ true | false ] :show_disk_loc Return disk location
142
+ # info as a field in each doc.
143
+ # @option options [ Integer ] :skip The number of documents to skip.
144
+ # @option options [ true | false ] :snapshot Prevents returning a
145
+ # document more than once. Deprecated as of MongoDB server version 4.0.
146
+ # @option options [ Hash ] :sort The key and direction pairs used to sort
147
+ # the results.
144
148
  #
145
149
  # @since 2.0.0
146
150
  def initialize(collection, filter = {}, options = {})
@@ -89,6 +89,16 @@ module Mongo
89
89
  self.class.new(view, pipeline, options.merge(explain: true)).first
90
90
  end
91
91
 
92
+ # Whether this aggregation will write its result to a database collection.
93
+ #
94
+ # @return [ Boolean ] Whether the aggregation will write its result
95
+ # to a collection.
96
+ #
97
+ # @api private
98
+ def write?
99
+ pipeline.any? { |op| op.key?('$out') || op.key?(:$out) || op.key?('$merge') || op.key?(:$merge) }
100
+ end
101
+
92
102
  private
93
103
 
94
104
  def server_selector
@@ -114,10 +124,6 @@ module Mongo
114
124
  description.standalone? || description.mongos? || description.primary? || secondary_ok?
115
125
  end
116
126
 
117
- def write?
118
- pipeline.any? { |op| op.key?('$out') || op.key?(:$out) || op.key?('$merge') || op.key?(:$merge) }
119
- end
120
-
121
127
  def secondary_ok?
122
128
  !write?
123
129
  end
@@ -128,7 +134,7 @@ module Mongo
128
134
  server = cluster.next_primary(nil, session)
129
135
  end
130
136
  validate_collation!(server)
131
- initial_query_op(session).execute(server, client: client)
137
+ initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
132
138
  end
133
139
 
134
140
  def validate_collation!(server)
@@ -136,6 +142,21 @@ module Mongo
136
142
  raise Error::UnsupportedCollation.new
137
143
  end
138
144
  end
145
+
146
+ # Skip, sort, limit, projection are specified as pipeline stages
147
+ # rather than as options.
148
+ def cache_options
149
+ {
150
+ namespace: collection.namespace,
151
+ selector: pipeline,
152
+ read_concern: view.read_concern,
153
+ read_preference: view.read_preference,
154
+ collation: options[:collation],
155
+ # Aggregations can read documents from more than one collection,
156
+ # so they will be cleared on every write operation.
157
+ multi_collection: true,
158
+ }
159
+ end
139
160
  end
140
161
  end
141
162
  end