mongo 2.13.0.beta1 → 2.14.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 (339) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +50 -9
  5. data/lib/mongo.rb +13 -2
  6. data/lib/mongo/address.rb +1 -1
  7. data/lib/mongo/address/ipv4.rb +1 -1
  8. data/lib/mongo/address/ipv6.rb +1 -1
  9. data/lib/mongo/auth/aws/request.rb +31 -5
  10. data/lib/mongo/bulk_write.rb +18 -0
  11. data/lib/mongo/caching_cursor.rb +74 -0
  12. data/lib/mongo/client.rb +238 -31
  13. data/lib/mongo/cluster.rb +56 -20
  14. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  15. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  16. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  17. data/lib/mongo/cluster/topology/single.rb +2 -2
  18. data/lib/mongo/collection.rb +66 -24
  19. data/lib/mongo/collection/view.rb +24 -20
  20. data/lib/mongo/collection/view/aggregation.rb +25 -4
  21. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  22. data/lib/mongo/collection/view/explainable.rb +27 -8
  23. data/lib/mongo/collection/view/iterable.rb +72 -12
  24. data/lib/mongo/collection/view/readable.rb +19 -3
  25. data/lib/mongo/collection/view/writable.rb +55 -5
  26. data/lib/mongo/crypt/encryption_io.rb +6 -6
  27. data/lib/mongo/cursor.rb +16 -3
  28. data/lib/mongo/database.rb +37 -4
  29. data/lib/mongo/database/view.rb +18 -3
  30. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  31. data/lib/mongo/error.rb +5 -0
  32. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  33. data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
  34. data/lib/mongo/error/invalid_session.rb +2 -1
  35. data/lib/mongo/error/operation_failure.rb +11 -5
  36. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  37. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  38. data/lib/mongo/error/unsupported_option.rb +14 -12
  39. data/lib/mongo/event/base.rb +6 -0
  40. data/lib/mongo/grid/file.rb +5 -0
  41. data/lib/mongo/grid/file/chunk.rb +2 -0
  42. data/lib/mongo/grid/fs_bucket.rb +15 -13
  43. data/lib/mongo/grid/stream/write.rb +9 -3
  44. data/lib/mongo/index/view.rb +3 -0
  45. data/lib/mongo/lint.rb +2 -1
  46. data/lib/mongo/logger.rb +3 -3
  47. data/lib/mongo/monitoring.rb +38 -0
  48. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  49. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  50. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  51. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  52. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  53. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  54. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  55. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  56. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  57. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  58. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  59. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  60. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  61. data/lib/mongo/monitoring/publishable.rb +6 -3
  62. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  63. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  64. data/lib/mongo/operation.rb +2 -0
  65. data/lib/mongo/operation/aggregate/result.rb +9 -8
  66. data/lib/mongo/operation/collections_info/command.rb +5 -0
  67. data/lib/mongo/operation/collections_info/result.rb +18 -1
  68. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  69. data/lib/mongo/operation/delete/result.rb +3 -0
  70. data/lib/mongo/operation/explain/command.rb +4 -0
  71. data/lib/mongo/operation/explain/legacy.rb +4 -0
  72. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  73. data/lib/mongo/operation/explain/result.rb +3 -0
  74. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  75. data/lib/mongo/operation/find/result.rb +13 -0
  76. data/lib/mongo/operation/get_more/result.rb +3 -0
  77. data/lib/mongo/operation/indexes/result.rb +5 -0
  78. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  79. data/lib/mongo/operation/insert/result.rb +5 -0
  80. data/lib/mongo/operation/list_collections/result.rb +5 -0
  81. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  82. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  83. data/lib/mongo/operation/result.rb +35 -6
  84. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  85. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  86. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
  87. data/lib/mongo/operation/shared/executable.rb +1 -0
  88. data/lib/mongo/operation/shared/idable.rb +2 -1
  89. data/lib/mongo/operation/shared/limited.rb +1 -0
  90. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  91. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  92. data/lib/mongo/operation/shared/sessions_supported.rb +1 -0
  93. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  94. data/lib/mongo/operation/shared/write.rb +1 -0
  95. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  96. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  97. data/lib/mongo/operation/update/result.rb +8 -0
  98. data/lib/mongo/operation/users_info/result.rb +3 -0
  99. data/lib/mongo/protocol/message.rb +47 -10
  100. data/lib/mongo/protocol/msg.rb +34 -1
  101. data/lib/mongo/protocol/query.rb +36 -0
  102. data/lib/mongo/protocol/serializers.rb +5 -2
  103. data/lib/mongo/query_cache.rb +242 -0
  104. data/lib/mongo/retryable.rb +8 -1
  105. data/lib/mongo/server.rb +15 -4
  106. data/lib/mongo/server/app_metadata.rb +27 -3
  107. data/lib/mongo/server/connection.rb +4 -4
  108. data/lib/mongo/server/connection_base.rb +38 -12
  109. data/lib/mongo/server/connection_common.rb +2 -2
  110. data/lib/mongo/server/connection_pool.rb +3 -0
  111. data/lib/mongo/server/description.rb +13 -1
  112. data/lib/mongo/server/monitor.rb +76 -44
  113. data/lib/mongo/server/monitor/connection.rb +57 -9
  114. data/lib/mongo/server/pending_connection.rb +14 -4
  115. data/lib/mongo/server/push_monitor.rb +173 -0
  116. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  117. data/lib/mongo/server_selector.rb +0 -1
  118. data/lib/mongo/server_selector/base.rb +583 -1
  119. data/lib/mongo/server_selector/nearest.rb +1 -6
  120. data/lib/mongo/server_selector/primary.rb +1 -6
  121. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  122. data/lib/mongo/server_selector/secondary.rb +1 -6
  123. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  124. data/lib/mongo/session.rb +7 -1
  125. data/lib/mongo/socket.rb +26 -12
  126. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  127. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  128. data/lib/mongo/socket/ssl.rb +46 -25
  129. data/lib/mongo/socket/tcp.rb +1 -1
  130. data/lib/mongo/srv/monitor.rb +7 -13
  131. data/lib/mongo/srv/resolver.rb +14 -10
  132. data/lib/mongo/timeout.rb +2 -0
  133. data/lib/mongo/topology_version.rb +9 -0
  134. data/lib/mongo/uri.rb +21 -390
  135. data/lib/mongo/uri/options_mapper.rb +582 -0
  136. data/lib/mongo/uri/srv_protocol.rb +3 -2
  137. data/lib/mongo/utils.rb +73 -0
  138. data/lib/mongo/version.rb +1 -1
  139. data/spec/NOTES.aws-auth.md +12 -7
  140. data/spec/README.aws-auth.md +2 -2
  141. data/spec/README.md +63 -1
  142. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  143. data/spec/integration/bson_symbol_spec.rb +4 -2
  144. data/spec/integration/bulk_write_spec.rb +67 -0
  145. data/spec/integration/change_stream_examples_spec.rb +6 -2
  146. data/spec/integration/change_stream_spec.rb +1 -1
  147. data/spec/integration/check_clean_slate_spec.rb +16 -0
  148. data/spec/integration/client_authentication_options_spec.rb +92 -28
  149. data/spec/integration/client_construction_spec.rb +1 -0
  150. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -5
  151. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  152. data/spec/integration/connection_pool_populator_spec.rb +4 -2
  153. data/spec/integration/connection_spec.rb +7 -4
  154. data/spec/integration/crud_spec.rb +4 -4
  155. data/spec/integration/cursor_reaping_spec.rb +54 -18
  156. data/spec/integration/docs_examples_spec.rb +6 -0
  157. data/spec/integration/fork_reconnect_spec.rb +56 -1
  158. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  159. data/spec/integration/heartbeat_events_spec.rb +4 -23
  160. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  161. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  162. data/spec/integration/ocsp_verifier_spec.rb +334 -0
  163. data/spec/integration/query_cache_spec.rb +1045 -0
  164. data/spec/integration/query_cache_transactions_spec.rb +190 -0
  165. data/spec/integration/read_concern_spec.rb +1 -1
  166. data/spec/integration/retryable_errors_spec.rb +1 -1
  167. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  168. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +4 -2
  169. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  170. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  171. data/spec/integration/sdam_error_handling_spec.rb +122 -15
  172. data/spec/integration/sdam_events_spec.rb +80 -6
  173. data/spec/integration/sdam_prose_spec.rb +64 -0
  174. data/spec/integration/server_monitor_spec.rb +25 -1
  175. data/spec/integration/server_selection_spec.rb +36 -0
  176. data/spec/integration/size_limit_spec.rb +23 -5
  177. data/spec/integration/srv_monitoring_spec.rb +38 -3
  178. data/spec/integration/srv_spec.rb +56 -0
  179. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  180. data/spec/integration/transactions_examples_spec.rb +17 -7
  181. data/spec/integration/zlib_compression_spec.rb +25 -0
  182. data/spec/lite_spec_helper.rb +20 -9
  183. data/spec/mongo/address_spec.rb +1 -1
  184. data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
  185. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  186. data/spec/mongo/auth/scram_spec.rb +1 -1
  187. data/spec/mongo/auth/user_spec.rb +1 -1
  188. data/spec/mongo/bulk_write_spec.rb +2 -2
  189. data/spec/mongo/caching_cursor_spec.rb +70 -0
  190. data/spec/mongo/client_construction_spec.rb +386 -3
  191. data/spec/mongo/client_encryption_spec.rb +16 -10
  192. data/spec/mongo/client_spec.rb +85 -3
  193. data/spec/mongo/cluster/topology/replica_set_spec.rb +53 -10
  194. data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
  195. data/spec/mongo/cluster/topology/single_spec.rb +19 -8
  196. data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
  197. data/spec/mongo/cluster/topology_spec.rb +1 -1
  198. data/spec/mongo/cluster_spec.rb +37 -35
  199. data/spec/mongo/collection/view/change_stream_resume_spec.rb +7 -7
  200. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  201. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  202. data/spec/mongo/collection/view/readable_spec.rb +36 -0
  203. data/spec/mongo/collection_spec.rb +572 -0
  204. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  205. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  206. data/spec/mongo/crypt/binary_spec.rb +1 -6
  207. data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
  208. data/spec/mongo/crypt/binding/context_spec.rb +2 -7
  209. data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
  210. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
  211. data/spec/mongo/crypt/binding/status_spec.rb +1 -6
  212. data/spec/mongo/crypt/binding/version_spec.rb +1 -6
  213. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  214. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  215. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  216. data/spec/mongo/crypt/status_spec.rb +1 -6
  217. data/spec/mongo/database_spec.rb +353 -8
  218. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  219. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  220. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  221. data/spec/mongo/index/view_spec.rb +148 -2
  222. data/spec/mongo/logger_spec.rb +13 -11
  223. data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
  224. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  225. data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
  226. data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
  227. data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
  228. data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
  229. data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
  230. data/spec/mongo/operation/insert/command_spec.rb +2 -2
  231. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
  232. data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
  233. data/spec/mongo/operation/update/command_spec.rb +2 -2
  234. data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
  235. data/spec/mongo/protocol/msg_spec.rb +10 -0
  236. data/spec/mongo/query_cache_spec.rb +280 -0
  237. data/spec/mongo/semaphore_spec.rb +51 -0
  238. data/spec/mongo/server/app_metadata_shared.rb +82 -2
  239. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  240. data/spec/mongo/server/connection_pool_spec.rb +7 -3
  241. data/spec/mongo/server/connection_spec.rb +15 -8
  242. data/spec/mongo/server/description_spec.rb +18 -0
  243. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  244. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  245. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  246. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  247. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  248. data/spec/mongo/server_selector_spec.rb +6 -6
  249. data/spec/mongo/session_spec.rb +35 -0
  250. data/spec/mongo/socket/ssl_spec.rb +4 -4
  251. data/spec/mongo/socket_spec.rb +1 -1
  252. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  253. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  254. data/spec/mongo/uri_spec.rb +68 -41
  255. data/spec/mongo/utils_spec.rb +39 -0
  256. data/spec/runners/auth.rb +3 -0
  257. data/spec/runners/change_streams/test.rb +3 -3
  258. data/spec/runners/cmap.rb +1 -1
  259. data/spec/runners/command_monitoring.rb +3 -34
  260. data/spec/runners/connection_string.rb +35 -124
  261. data/spec/runners/crud/context.rb +9 -5
  262. data/spec/runners/crud/operation.rb +59 -27
  263. data/spec/runners/crud/spec.rb +0 -8
  264. data/spec/runners/crud/test.rb +1 -1
  265. data/spec/runners/crud/test_base.rb +0 -19
  266. data/spec/runners/sdam.rb +2 -2
  267. data/spec/runners/server_selection.rb +242 -28
  268. data/spec/runners/transactions.rb +12 -12
  269. data/spec/runners/transactions/operation.rb +151 -25
  270. data/spec/runners/transactions/test.rb +62 -18
  271. data/spec/shared/LICENSE +20 -0
  272. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  273. data/spec/shared/lib/mrss/constraints.rb +303 -0
  274. data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
  275. data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
  276. data/spec/spec_helper.rb +3 -1
  277. data/spec/spec_tests/cmap_spec.rb +7 -3
  278. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  279. data/spec/spec_tests/crud_spec.rb +1 -1
  280. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -9
  281. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  282. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  283. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  284. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  285. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  286. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  287. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  288. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  289. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  290. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  291. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  292. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  293. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  294. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  295. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  296. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  297. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  298. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  299. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  300. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  301. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  302. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  303. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  304. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  305. data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
  306. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  307. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  308. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  309. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  310. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  311. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  312. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  313. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  314. data/spec/spec_tests/server_selection_spec.rb +4 -116
  315. data/spec/spec_tests/uri_options_spec.rb +31 -33
  316. data/spec/stress/cleanup_spec.rb +17 -2
  317. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  318. data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
  319. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  320. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  321. data/spec/support/client_registry.rb +1 -0
  322. data/spec/support/client_registry_macros.rb +11 -2
  323. data/spec/support/cluster_config.rb +4 -0
  324. data/spec/support/common_shortcuts.rb +45 -0
  325. data/spec/support/constraints.rb +6 -253
  326. data/spec/support/event_subscriber.rb +123 -33
  327. data/spec/support/keyword_struct.rb +26 -0
  328. data/spec/support/matchers.rb +16 -0
  329. data/spec/support/ocsp +1 -0
  330. data/spec/support/session_registry.rb +52 -0
  331. data/spec/support/shared/server_selector.rb +13 -1
  332. data/spec/support/spec_config.rb +60 -13
  333. data/spec/support/spec_setup.rb +1 -1
  334. data/spec/support/utils.rb +84 -1
  335. metadata +1027 -937
  336. metadata.gz.sig +0 -0
  337. data/lib/mongo/server_selector/selectable.rb +0 -560
  338. data/spec/runners/sdam_monitoring.rb +0 -89
  339. data/spec/support/lite_constraints.rb +0 -141
@@ -21,7 +21,7 @@ module Mongo
21
21
  # @api private
22
22
  class EncryptionIO
23
23
 
24
- # Timeout used for SSL socket connection, reading, and writing.
24
+ # Timeout used for TLS socket connection, reading, and writing.
25
25
  # There is no specific timeout written in the spec. See SPEC-1394
26
26
  # for a discussion and updates on what this timeout should be.
27
27
  SOCKET_TIMEOUT = 10
@@ -236,10 +236,10 @@ module Mongo
236
236
  end
237
237
  end
238
238
 
239
- # Provide an SSL socket to be used for KMS calls in a block API
239
+ # Provide a TLS socket to be used for KMS calls in a block API
240
240
  #
241
- # @param [ String ] endpoint The URI at which to connect the SSL socket.
242
- # @yieldparam [ OpenSSL::SSL::SSLSocket ] ssl_socket Yields an SSL socket
241
+ # @param [ String ] endpoint The URI at which to connect the TLS socket.
242
+ # @yieldparam [ OpenSSL::SSL::SSLSocket ] ssl_socket Yields a TLS socket
243
243
  # connected to the specified endpoint.
244
244
  #
245
245
  # @raise [ Mongo::Error::KmsError ] If the socket times out or raises
@@ -277,7 +277,7 @@ module Mongo
277
277
  Timeout.timeout(
278
278
  SOCKET_TIMEOUT,
279
279
  Error::SocketTimeoutError,
280
- 'KMS SSL socket close timed out'
280
+ 'KMS TLS socket close timed out'
281
281
  ) do
282
282
  ssl_socket.sysclose
283
283
  end
@@ -285,7 +285,7 @@ module Mongo
285
285
  end
286
286
  end
287
287
  ensure
288
- # Still close tcp socket manually in case ssl socket creation
288
+ # Still close tcp socket manually in case TLS socket creation
289
289
  # fails.
290
290
  begin
291
291
  Timeout.timeout(
@@ -69,12 +69,12 @@ module Mongo
69
69
  @view = view
70
70
  @server = server
71
71
  @initial_result = result
72
+ @namespace = result.namespace
72
73
  @remaining = limit if limited?
73
74
  @cursor_id = result.cursor_id
74
75
  if @cursor_id.nil?
75
76
  raise ArgumentError, 'Cursor id must be present in the result'
76
77
  end
77
- @coll_name = nil
78
78
  @options = options
79
79
  @session = @options[:session]
80
80
  unless closed?
@@ -138,6 +138,7 @@ module Mongo
138
138
  #
139
139
  # @since 2.0.0
140
140
  def each
141
+
141
142
  # If we already iterated past the first batch (i.e., called get_more
142
143
  # at least once), the cursor on the server side has advanced past
143
144
  # the first batch and restarting iteration from the beginning by
@@ -287,7 +288,20 @@ module Mongo
287
288
  #
288
289
  # @since 2.2.0
289
290
  def collection_name
290
- @coll_name || collection.name
291
+ # In most cases, this will be equivalent to the name of the collection
292
+ # object in the driver. However, in some cases (e.g. when connected
293
+ # to an Atlas Data Lake), the namespace returned by the find command
294
+ # may be different, which is why we want to use the collection name based
295
+ # on the namespace in the command result.
296
+ if @namespace
297
+ # Often, the namespace will be in the format "database.collection".
298
+ # However, sometimes the collection name will contain periods, which
299
+ # is why this method joins all the namespace components after the first.
300
+ ns_components = @namespace.split('.')
301
+ ns_components[1...ns_components.length].join('.')
302
+ else
303
+ collection.name
304
+ end
291
305
  end
292
306
 
293
307
  # Get the cursor id.
@@ -381,7 +395,6 @@ module Mongo
381
395
 
382
396
  def process(result)
383
397
  @remaining -= result.returned_count if limited?
384
- @coll_name ||= result.namespace.sub("#{database.name}.", '') if result.namespace
385
398
  # #process is called for the first batch of results. In this case
386
399
  # the @cursor_id may be zero (all results fit in the first batch).
387
400
  # Thus we need to check both @cursor_id and the cursor_id of the result
@@ -113,6 +113,16 @@ module Mongo
113
113
  # @note The set of returned collection names depends on the version of
114
114
  # MongoDB server that fulfills the request.
115
115
  #
116
+ # @param [ Hash ] options
117
+ #
118
+ # @option options [ Hash ] :filter A filter on the collections returned.
119
+ # @option options [ true, false ] :authorized_collections A flag, when
120
+ # set to true and used with nameOnly: true, that allows a user without the
121
+ # required privilege to run the command when access control is enforced
122
+ #
123
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
124
+ # for more information and usage.
125
+ #
116
126
  # @return [ Array<String> ] Names of the collections.
117
127
  #
118
128
  # @since 2.0.0
@@ -129,6 +139,13 @@ module Mongo
129
139
  # @param [ Hash ] options
130
140
  #
131
141
  # @option options [ Hash ] :filter A filter on the collections returned.
142
+ # @option options [ true, false ] :name_only Indicates whether command
143
+ # should return just collection/view names and type or return both the
144
+ # name and other information
145
+ # @option options [ true, false ] :authorized_collections A flag, when
146
+ # set to true and used with nameOnly: true, that allows a user without the
147
+ # required privilege to run the command when access control is enforced
148
+ #
132
149
  # See https://docs.mongodb.com/manual/reference/command/listCollections/
133
150
  # for more information and usage.
134
151
  #
@@ -136,8 +153,8 @@ module Mongo
136
153
  # collection in the database.
137
154
  #
138
155
  # @since 2.0.5
139
- def list_collections(**options)
140
- View.new(self).list_collections(**options)
156
+ def list_collections(options = {})
157
+ View.new(self).list_collections(options)
141
158
  end
142
159
 
143
160
  # Get all the non-system collections that belong to this database.
@@ -145,11 +162,21 @@ module Mongo
145
162
  # @note The set of returned collections depends on the version of
146
163
  # MongoDB server that fulfills the request.
147
164
  #
165
+ # @param [ Hash ] options
166
+ #
167
+ # @option options [ Hash ] :filter A filter on the collections returned.
168
+ # @option options [ true, false ] :authorized_collections A flag, when
169
+ # set to true and used with name_only: true, that allows a user without the
170
+ # required privilege to run the command when access control is enforced
171
+ #
172
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
173
+ # for more information and usage.
174
+ #
148
175
  # @return [ Array<Mongo::Collection> ] The collections.
149
176
  #
150
177
  # @since 2.0.0
151
- def collections
152
- collection_names.map { |name| collection(name) }
178
+ def collections(options = {})
179
+ collection_names(options).map { |name| collection(name) }
153
180
  end
154
181
 
155
182
  # Execute a command on the database.
@@ -236,6 +263,7 @@ module Mongo
236
263
  # @param [ Hash ] options The options for the operation.
237
264
  #
238
265
  # @option options [ Session ] :session The session to use for the operation.
266
+ # @option opts [ Hash ] :write_concern The write concern options.
239
267
  #
240
268
  # @return [ Result ] The result of the command.
241
269
  #
@@ -243,6 +271,11 @@ module Mongo
243
271
  def drop(options = {})
244
272
  operation = { :dropDatabase => 1 }
245
273
  client.send(:with_session, options) do |session|
274
+ write_concern = if options[:write_concern]
275
+ WriteConcern.get(options[:write_concern])
276
+ else
277
+ self.write_concern
278
+ end
246
279
  Operation::DropDatabase.new({
247
280
  selector: operation,
248
281
  db_name: name,
@@ -47,6 +47,13 @@ module Mongo
47
47
  #
48
48
  # @option options [ Integer ] :batch_size The batch size for results
49
49
  # returned from the listCollections command.
50
+ # @option options [ Hash ] :filter A filter on the collections returned.
51
+ # @option options [ true, false ] :authorized_collections A flag, when
52
+ # set to true, that allows a user without the required privilege
53
+ # to run the command when access control is enforced
54
+ #
55
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
56
+ # for more information and usage.
50
57
  #
51
58
  # @return [ Array<String> ] The names of all non-system collections.
52
59
  #
@@ -55,7 +62,7 @@ module Mongo
55
62
  @batch_size = options[:batch_size]
56
63
  session = client.send(:get_session, options)
57
64
  cursor = read_with_retry_cursor(session, ServerSelector.primary, self) do |server|
58
- send_initial_query(server, session, name_only: true)
65
+ send_initial_query(server, session, options.merge(name_only: true))
59
66
  end
60
67
  cursor.map do |info|
61
68
  if cursor.server.with_connection { |connection| connection.features }.list_collections_enabled?
@@ -81,15 +88,22 @@ module Mongo
81
88
  # @param [ Hash ] options
82
89
  #
83
90
  # @option options [ Hash ] :filter A filter on the collections returned.
91
+ # @option options [ true, false ] :name_only Indicates whether command
92
+ # should return just collection/view names and type or return both the
93
+ # name and other information
94
+ # @option options [ true, false ] :authorized_collections A flag, when
95
+ # set to true and used with nameOnly: true, that allows a user without the
96
+ # required privilege to run the command when access control is enforced
97
+ #
84
98
  # See https://docs.mongodb.com/manual/reference/command/listCollections/
85
99
  # for more information and usage.
86
100
  #
87
101
  # @return [ Array<Hash> ] Info for each collection in the database.
88
102
  #
89
103
  # @since 2.0.5
90
- def list_collections(**options)
104
+ def list_collections(options = {})
91
105
  session = client.send(:get_session)
92
- collections_info(session, ServerSelector.primary, **options)
106
+ collections_info(session, ServerSelector.primary, options)
93
107
  end
94
108
 
95
109
  # Create the new database view.
@@ -166,6 +180,7 @@ module Mongo
166
180
  }.tap do |spec|
167
181
  spec[:selector][:nameOnly] = true if options[:name_only]
168
182
  spec[:selector][:filter] = options[:filter] if options[:filter]
183
+ spec[:selector][:authorizedCollections] = true if options[:authorized_collections]
169
184
  end
170
185
  end
171
186
 
@@ -0,0 +1,55 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ # This is a semaphore that distinguishes waits ending due to the timeout
17
+ # being reached from waits ending due to the semaphore being signaled.
18
+ #
19
+ # @api private
20
+ class DistinguishingSemaphore
21
+ def initialize
22
+ @lock = Mutex.new
23
+ @cv = ConditionVariable.new
24
+ @queue = []
25
+ end
26
+
27
+ # Waits for the semaphore to be signaled up to timeout seconds.
28
+ # If semaphore is not signaled, returns after timeout seconds.
29
+ #
30
+ # @return [ true | false ] true if semaphore was signaled, false if
31
+ # timeout was reached.
32
+ def wait(timeout = nil)
33
+ @lock.synchronize do
34
+ @cv.wait(@lock, timeout)
35
+ (!@queue.empty?).tap do
36
+ @queue.clear
37
+ end
38
+ end
39
+ end
40
+
41
+ def broadcast
42
+ @lock.synchronize do
43
+ @queue.push(true)
44
+ @cv.broadcast
45
+ end
46
+ end
47
+
48
+ def signal
49
+ @lock.synchronize do
50
+ @queue.push(true)
51
+ @cv.signal
52
+ end
53
+ end
54
+ end
55
+ end
@@ -188,8 +188,11 @@ require 'mongo/error/invalid_min_pool_size'
188
188
  require 'mongo/error/invalid_read_option'
189
189
  require 'mongo/error/invalid_application_name'
190
190
  require 'mongo/error/invalid_nonce'
191
+ require 'mongo/error/invalid_read_concern'
191
192
  require 'mongo/error/invalid_replacement_document'
192
193
  require 'mongo/error/invalid_server_auth_response'
194
+ # Subclass of InvalidServerAuthResponse
195
+ require 'mongo/error/invalid_server_auth_host'
193
196
  require 'mongo/error/invalid_server_preference'
194
197
  require 'mongo/error/invalid_session'
195
198
  require 'mongo/error/invalid_signature'
@@ -210,8 +213,10 @@ require 'mongo/error/need_primary_server'
210
213
  require 'mongo/error/no_server_available'
211
214
  require 'mongo/error/no_srv_records'
212
215
  require 'mongo/error/session_ended'
216
+ require 'mongo/error/sessions_not_supported'
213
217
  require 'mongo/error/pool_closed_error'
214
218
  require 'mongo/error/raise_original_error'
219
+ require 'mongo/error/server_certificate_revoked'
215
220
  require 'mongo/error/socket_error'
216
221
  require 'mongo/error/socket_timeout_error'
217
222
  require 'mongo/error/failed_string_prep_validation'
@@ -0,0 +1,28 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Raised when an invalid read concern is provided.
19
+ class InvalidReadConcern < Error
20
+ # Instantiate the new exception.
21
+ def initialize(msg = nil)
22
+ super(msg || 'Invalid read concern option provided.' \
23
+ 'The only valid key is :level, for which accepted values are' \
24
+ ':local, :majority, and :snapshot')
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Raised when the server returned an invalid Host value in AWS auth.
19
+ class InvalidServerAuthHost < InvalidServerAuthResponse
20
+ end
21
+ end
22
+ end
@@ -15,7 +15,8 @@
15
15
  module Mongo
16
16
  class Error
17
17
 
18
- # This exception is raised when a session is attempted to be used and it is invalid.
18
+ # This exception is raised when a session is attempted to be used and it
19
+ # is invalid.
19
20
  #
20
21
  # @since 2.5.0
21
22
  class InvalidSession < Error
@@ -97,7 +97,8 @@ module Mongo
97
97
  # @since 2.1.1
98
98
  # @deprecated
99
99
  def retryable?
100
- write_retryable? || RETRY_MESSAGES.any?{ |m| message.include?(m) }
100
+ write_retryable? ||
101
+ code.nil? && RETRY_MESSAGES.any?{ |m| message.include?(m) }
101
102
  end
102
103
 
103
104
  # Whether the error is a retryable error according to the modern retryable
@@ -110,11 +111,11 @@ module Mongo
110
111
  #
111
112
  # @since 2.4.2
112
113
  def write_retryable?
113
- WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) } ||
114
- write_retryable_code?
114
+ write_retryable_code? ||
115
+ code.nil? && WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) }
115
116
  end
116
117
 
117
- def write_retryable_code?
118
+ private def write_retryable_code?
118
119
  if code
119
120
  WRITE_RETRY_ERRORS.any? { |e| e[:code] == code }
120
121
  else
@@ -122,7 +123,6 @@ module Mongo
122
123
  false
123
124
  end
124
125
  end
125
- private :write_retryable_code?
126
126
 
127
127
  # Error codes and code names that should result in a failing getMore
128
128
  # command on a change stream NOT being resumed.
@@ -166,6 +166,12 @@ module Mongo
166
166
  # @since 2.6.0
167
167
  def change_stream_resumable?
168
168
  if @result && @result.is_a?(Mongo::Operation::GetMore::Result)
169
+ # CursorNotFound exceptions are always resumable because the server
170
+ # is not aware of the cursor id, and thus cannot determine if
171
+ # the cursor is a change stream and cannot add the
172
+ # ResumableChangeStreamError label.
173
+ return true if code == 43
174
+
169
175
  # Connection description is not populated for unacknowledged writes.
170
176
  if connection_description.max_wire_version >= 9
171
177
  label?('ResumableChangeStreamError')
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Server certificate has been revoked (determined via OCSP).
19
+ class ServerCertificateRevoked < Error
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # This exception is raised when a session is attempted to be used and the
19
+ # deployment does not support sessions.
20
+ #
21
+ # @note The subclassing of InvalidSession only exists for backwards
22
+ # compatibility and will be removed in driver version 3.0.
23
+ class SessionsNotSupported < InvalidSession
24
+
25
+ # Create the new exception.
26
+ #
27
+ # @param [ String ] message The error message.
28
+ #
29
+ # @api private
30
+ def initialize(message)
31
+ super(message)
32
+ end
33
+ end
34
+ end
35
+ end