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
@@ -395,7 +395,7 @@ module Mongo
395
395
  #
396
396
  # @since 2.0.0
397
397
  def servers
398
- topology.servers(servers_list.compact).compact
398
+ topology.servers(servers_list)
399
399
  end
400
400
 
401
401
  # The addresses in the cluster.
@@ -599,11 +599,14 @@ module Mongo
599
599
  # respective server is cleared. Set this option to true to keep the
600
600
  # existing connection pool (required when handling not master errors
601
601
  # on 4.2+ servers).
602
+ # @option aptions [ true | false ] :awaited Whether the updated description
603
+ # was a result of processing an awaited ismaster.
602
604
  #
603
605
  # @api private
604
606
  def run_sdam_flow(previous_desc, updated_desc, options = {})
605
607
  @sdam_flow_lock.synchronize do
606
- flow = SdamFlow.new(self, previous_desc, updated_desc)
608
+ flow = SdamFlow.new(self, previous_desc, updated_desc,
609
+ awaited: options[:awaited])
607
610
  flow.server_description_changed
608
611
 
609
612
  # SDAM flow may alter the updated description - grab the final
@@ -886,21 +889,26 @@ module Mongo
886
889
  end
887
890
  end
888
891
 
889
- # Returns whether the deployment that the driver is connected to supports
890
- # sessions.
892
+ # Raises Error::SessionsNotAvailable if the deployment that the driver
893
+ # is connected to does not support sessions.
891
894
  #
892
895
  # Session support may change over time, for example due to servers in the
893
- # deployment being upgraded or downgraded. This method returns the
894
- # current information if the client is connected to at least one data
895
- # bearing server. If the client is currently not connected to any data
896
- # bearing servers, this method returns the last known value for whether
897
- # the deployment supports sessions.
896
+ # deployment being upgraded or downgraded. If the client is currently not
897
+ # connected to any data bearing servers, this method considers the state
898
+ # of session support as of when the client was last connected to at
899
+ # least one server. If the client has never connected to any servers,
900
+ # the deployment is considered to not support sessions.
898
901
  #
899
- # @return [ true | false ] Whether deployment supports sessions.
900
902
  # @api private
901
- def sessions_supported?
902
- if topology.data_bearing_servers?
903
- return !!topology.logical_session_timeout
903
+ def validate_session_support!
904
+ @state_change_lock.synchronize do
905
+ @sdam_flow_lock.synchronize do
906
+ if topology.data_bearing_servers?
907
+ unless topology.logical_session_timeout
908
+ raise_sessions_not_supported
909
+ end
910
+ end
911
+ end
904
912
  end
905
913
 
906
914
  # No data bearing servers known - perform server selection to try to
@@ -908,12 +916,24 @@ module Mongo
908
916
  # assessment of whether sessions are currently supported.
909
917
  begin
910
918
  ServerSelector.get(mode: :primary_preferred).select_server(self)
911
- !!topology.logical_session_timeout
919
+ @state_change_lock.synchronize do
920
+ @sdam_flow_lock.synchronize do
921
+ unless topology.logical_session_timeout
922
+ raise_sessions_not_supported
923
+ end
924
+ end
925
+ end
912
926
  rescue Error::NoServerAvailable
913
927
  # We haven't been able to contact any servers - use last known
914
- # value for esssion support.
915
- @update_lock.synchronize do
916
- @sessions_supported || false
928
+ # value for session support.
929
+ @state_change_lock.synchronize do
930
+ @sdam_flow_lock.synchronize do
931
+ @update_lock.synchronize do
932
+ unless @sessions_supported
933
+ raise_sessions_not_supported
934
+ end
935
+ end
936
+ end
917
937
  end
918
938
  end
919
939
  end
@@ -930,9 +950,9 @@ module Mongo
930
950
  # Start SRV monitor
931
951
  @srv_monitor_lock.synchronize do
932
952
  unless @srv_monitor
933
- monitor_options = options.merge(
934
- timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT)
935
- @srv_monitor = _srv_monitor = Srv::Monitor.new(self, monitor_options)
953
+ monitor_options = Utils.shallow_symbolize_keys(options.merge(
954
+ timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
955
+ @srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
936
956
  finalizer = lambda do
937
957
  _srv_monitor.stop!
938
958
  end
@@ -952,6 +972,22 @@ module Mongo
952
972
  end
953
973
  end
954
974
  end
975
+
976
+ def raise_sessions_not_supported
977
+ # Intentionally using @servers instead of +servers+ here because we
978
+ # are supposed to be already holding the @update_lock and we cannot
979
+ # recursively acquire it again.
980
+ offending_servers = @servers.select do |server|
981
+ server.description.data_bearing? && server.logical_session_timeout.nil?
982
+ end
983
+ reason = if offending_servers.empty?
984
+ "There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
985
+ else
986
+ "The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
987
+ end
988
+ msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
989
+ raise Error::SessionsNotSupported, msg
990
+ end
955
991
  end
956
992
  end
957
993
 
@@ -25,12 +25,13 @@ class Mongo::Cluster
25
25
  class SdamFlow
26
26
  extend Forwardable
27
27
 
28
- def initialize(cluster, previous_desc, updated_desc)
28
+ def initialize(cluster, previous_desc, updated_desc, awaited: false)
29
29
  @cluster = cluster
30
30
  @topology = cluster.topology
31
31
  @original_desc = @previous_desc = previous_desc
32
32
  @updated_desc = updated_desc
33
33
  @servers_to_disconnect = []
34
+ @awaited = !!awaited
34
35
  end
35
36
 
36
37
  attr_reader :cluster
@@ -51,6 +52,10 @@ class Mongo::Cluster
51
52
  attr_reader :updated_desc
52
53
  attr_reader :original_desc
53
54
 
55
+ def awaited?
56
+ @awaited
57
+ end
58
+
54
59
  def_delegators :topology, :replica_set_name
55
60
 
56
61
  # Updates descriptions on all servers whose address matches
@@ -431,15 +436,12 @@ class Mongo::Cluster
431
436
  # the server - in case of a stale primary, the server reported itself
432
437
  # as being a primary but updated_desc here will be unknown.
433
438
 
434
- # We do not notify on unknown -> unknown changes.
435
- # This can also be important for tests which have real i/o
436
- # happening against bogus addresses which yield unknown responses
437
- # and that also mock responses with the resulting race condition,
438
- # though tests should avoid performing real i/o with monitoring_io: false
439
- # option.
440
- if updated_desc.unknown? && previous_desc.unknown?
441
- return
442
- end
439
+ # We used to not notify on Unknown -> Unknown server changes.
440
+ # Technically these are valid state changes (or at least as valid as
441
+ # other server description changes when the description has not
442
+ # changed meaningfully but the events are still published).
443
+ # The current version of the driver notifies on Unknown -> Unknown
444
+ # transitions.
443
445
 
444
446
  # Avoid dispatching events when updated description is the same as
445
447
  # previous description. This allows this method to be called multiple
@@ -456,6 +458,7 @@ class Mongo::Cluster
456
458
  topology,
457
459
  previous_desc,
458
460
  updated_desc,
461
+ awaited: awaited?,
459
462
  )
460
463
  )
461
464
  @previous_desc = updated_desc
@@ -73,8 +73,9 @@ module Mongo
73
73
  # @return [ true, false ] If a readable server is present.
74
74
  #
75
75
  # @since 2.4.0
76
+ # @deprecated
76
77
  def has_readable_server?(cluster, server_selector = nil)
77
- (server_selector || ServerSelector.primary).candidates(cluster).any?
78
+ !(server_selector || ServerSelector.primary).try_select_server(cluster).nil?
78
79
  end
79
80
 
80
81
  # Determine if the topology would select a writable server for the
@@ -89,7 +90,7 @@ module Mongo
89
90
  #
90
91
  # @since 2.4.0
91
92
  def has_writable_server?(cluster)
92
- cluster.servers.any?{ |server| server.primary? }
93
+ !ServerSelector.primary.try_select_server(cluster).nil?
93
94
  end
94
95
 
95
96
  # A replica set topology is a replica set.
@@ -97,7 +97,7 @@ module Mongo
97
97
  #
98
98
  # @since 2.0.0
99
99
  def servers(servers)
100
- servers.select{ |server| server.mongos? }
100
+ servers.select { |server| server.mongos? }
101
101
  end
102
102
 
103
103
  # A sharded topology is sharded.
@@ -96,7 +96,7 @@ module Mongo
96
96
  #
97
97
  # @since 2.0.0
98
98
  def servers(servers, name = nil)
99
- [ servers.detect { |server| !server.unknown? } ]
99
+ servers.reject { |server| server.unknown? }
100
100
  end
101
101
 
102
102
  # A single topology is not sharded.
@@ -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
@@ -264,12 +270,19 @@ 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,
@@ -278,8 +291,12 @@ module Mongo
278
291
  }).execute(next_primary(nil, session), client: client)
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 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.
@@ -450,19 +469,20 @@ module Mongo
450
469
  # @return [ Integer ] The document count.
451
470
  #
452
471
  # @since 2.6.0
453
- def count_documents(filter, options = {})
472
+ def count_documents(filter = {}, options = {})
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,20 +556,31 @@ 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
- write_concern = write_concern_with_session(session)
562
+ write_concern = if opts[:write_concern]
563
+ WriteConcern.get(opts[:write_concern])
564
+ else
565
+ write_concern_with_session(session)
566
+ end
567
+
568
+ if document.nil?
569
+ raise ArgumentError, "Document to be inserted cannot be nil"
570
+ end
571
+
541
572
  write_with_retry(session, write_concern) do |server, txn_num|
542
573
  Operation::Insert.new(
543
- :documents => [ document ],
544
- :db_name => database.name,
545
- :coll_name => name,
546
- :write_concern => write_concern,
547
- :bypass_document_validation => !!opts[:bypass_document_validation],
548
- :options => opts,
549
- :id_generator => client.options[:id_generator],
550
- :session => session,
551
- :txn_num => txn_num
552
- ).execute(server, client: client)
574
+ :documents => [ document ],
575
+ :db_name => database.name,
576
+ :coll_name => name,
577
+ :write_concern => write_concern,
578
+ :bypass_document_validation => !!opts[:bypass_document_validation],
579
+ :options => opts,
580
+ :id_generator => client.options[:id_generator],
581
+ :session => session,
582
+ :txn_num => txn_num
583
+ ).execute(server, client: client)
553
584
  end
554
585
  end
555
586
  end
@@ -568,6 +599,8 @@ module Mongo
568
599
  #
569
600
  # @since 2.0.0
570
601
  def insert_many(documents, options = {})
602
+ QueryCache.clear_namespace(namespace)
603
+
571
604
  inserts = documents.map{ |doc| { :insert_one => doc }}
572
605
  bulk_write(inserts, options)
573
606
  end
@@ -850,5 +883,14 @@ module Mongo
850
883
  def namespace
851
884
  "#{database.name}.#{name}"
852
885
  end
886
+
887
+ # Whether the collection is a system collection.
888
+ #
889
+ # @return [ Boolean ] Whether the system is a system collection.
890
+ #
891
+ # @api private
892
+ def system_collection?
893
+ name.start_with?('system.')
894
+ end
853
895
  end
854
896
  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 = {})