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
@@ -440,12 +440,15 @@ module Mongo
440
440
  # Deserializes bytes from the byte buffer.
441
441
  #
442
442
  # @param [ BSON::ByteBuffer ] buffer Buffer containing the value to read.
443
- # @param [ Integer ] num_bytes Number of bytes to read.
443
+ # @param [ Hash ] options The method options.
444
+ #
445
+ # @option options [ Integer ] num_bytes Number of bytes to read.
444
446
  #
445
447
  # @return [ String ] The bytes.
446
448
  #
447
449
  # @since 2.5.0
448
- def self.deserialize(buffer, num_bytes = nil)
450
+ def self.deserialize(buffer, options = {})
451
+ num_bytes = options[:num_bytes]
449
452
  buffer.get_bytes(num_bytes || buffer.length)
450
453
  end
451
454
  end
@@ -0,0 +1,242 @@
1
+ # Copyright (C) 2020 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module QueryCache
17
+ class << self
18
+
19
+ # Set whether the cache is enabled.
20
+ #
21
+ # @example Set if the cache is enabled.
22
+ # QueryCache.enabled = true
23
+ #
24
+ # @param [ true, false ] value The enabled value.
25
+ def enabled=(value)
26
+ Thread.current["[mongo]:query_cache:enabled"] = value
27
+ end
28
+
29
+ # Is the query cache enabled on the current thread?
30
+ #
31
+ # @example Is the query cache enabled?
32
+ # QueryCache.enabled?
33
+ #
34
+ # @return [ true, false ] If the cache is enabled.
35
+ def enabled?
36
+ !!Thread.current["[mongo]:query_cache:enabled"]
37
+ end
38
+
39
+ # Execute the block while using the query cache.
40
+ #
41
+ # @example Execute with the cache.
42
+ # QueryCache.cache { collection.find }
43
+ #
44
+ # @return [ Object ] The result of the block.
45
+ def cache
46
+ enabled = enabled?
47
+ self.enabled = true
48
+ begin
49
+ yield
50
+ ensure
51
+ self.enabled = enabled
52
+ end
53
+ end
54
+
55
+ # Execute the block with the query cache disabled.
56
+ #
57
+ # @example Execute without the cache.
58
+ # QueryCache.uncached { collection.find }
59
+ #
60
+ # @return [ Object ] The result of the block.
61
+ def uncached
62
+ enabled = enabled?
63
+ self.enabled = false
64
+ begin
65
+ yield
66
+ ensure
67
+ self.enabled = enabled
68
+ end
69
+ end
70
+
71
+ # Get the cached queries.
72
+ #
73
+ # @example Get the cached queries from the current thread.
74
+ # QueryCache.cache_table
75
+ #
76
+ # @return [ Hash ] The hash of cached queries.
77
+ private def cache_table
78
+ Thread.current["[mongo]:query_cache"] ||= {}
79
+ end
80
+
81
+ # Clear the query cache.
82
+ #
83
+ # @example Clear the cache.
84
+ # QueryCache.clear
85
+ #
86
+ # @return [ nil ] Always nil.
87
+ def clear
88
+ Thread.current["[mongo]:query_cache"] = nil
89
+ end
90
+
91
+ # Clear the section of the query cache storing cursors with results
92
+ # from this namespace.
93
+ #
94
+ # @param [ String ] namespace The namespace to be cleared, in the format
95
+ # "database.collection".
96
+ #
97
+ # @return [ nil ] Always nil.
98
+ #
99
+ # @api private
100
+ def clear_namespace(namespace)
101
+ cache_table.delete(namespace)
102
+ # The nil key is where cursors are stored that could potentially read from
103
+ # multiple collections. This key should be cleared on every write operation
104
+ # to prevent returning stale data.
105
+ cache_table.delete(nil)
106
+ nil
107
+ end
108
+
109
+ # Store a CachingCursor instance in the query cache associated with the
110
+ # specified query options.
111
+ #
112
+ # @param [ Mongo::CachingCursor ] cursor The CachingCursor instance to store.
113
+ #
114
+ # @option opts [ String | nil ] namespace The namespace of the query,
115
+ # in the format "database_name.collection_name".
116
+ # @option opts [ Array, Hash ] selector The selector passed to the query.
117
+ # For most queries, this will be a Hash, but for aggregations, this
118
+ # will be an Array representing the aggregation pipeline. May not be nil.
119
+ # @option opts [ Integer | nil ] skip The skip value of the query.
120
+ # @option opts [ Hash | nil ] sort The order of the query results
121
+ # (e.g. { name: -1 }).
122
+ # @option opts [ Integer | nil ] limit The limit value of the query.
123
+ # @option opts [ Hash | nil ] projection The projection of the query
124
+ # results (e.g. { name: 1 }).
125
+ # @option opts [ Hash | nil ] collation The collation of the query
126
+ # (e.g. { "locale" => "fr_CA" }).
127
+ # @option opts [ Hash | nil ] read_concern The read concern of the query
128
+ # (e.g. { level: :majority }).
129
+ # @option opts [ Hash | nil ] read_preference The read preference of
130
+ # the query (e.g. { mode: :secondary }).
131
+ # @option opts [ Boolean | nil ] multi_collection Whether the query
132
+ # results could potentially come from multiple collections. When true,
133
+ # these results will be stored under the nil namespace key and cleared
134
+ # on every write command.
135
+ #
136
+ # @return [ true ] Always true.
137
+ #
138
+ # @api private
139
+ def set(cursor, **opts)
140
+ _cache_key = cache_key(**opts)
141
+ _namespace_key = namespace_key(**opts)
142
+
143
+ cache_table[_namespace_key] ||= {}
144
+ cache_table[_namespace_key][_cache_key] = cursor
145
+
146
+ true
147
+ end
148
+
149
+ # For the given query options, retrieve a cached cursor that can be used
150
+ # to obtain the correct query results, if one exists in the cache.
151
+ #
152
+ # @option opts [ String | nil ] namespace The namespace of the query,
153
+ # in the format "database_name.collection_name".
154
+ # @option opts [ Array, Hash ] selector The selector passed to the query.
155
+ # For most queries, this will be a Hash, but for aggregations, this
156
+ # will be an Array representing the aggregation pipeline. May not be nil.
157
+ # @option opts [ Integer | nil ] skip The skip value of the query.
158
+ # @option opts [ Hash | nil ] sort The order of the query results
159
+ # (e.g. { name: -1 }).
160
+ # @option opts [ Integer | nil ] limit The limit value of the query.
161
+ # @option opts [ Hash | nil ] projection The projection of the query
162
+ # results (e.g. { name: 1 }).
163
+ # @option opts [ Hash | nil ] collation The collation of the query
164
+ # (e.g. { "locale" => "fr_CA" }).
165
+ # @option opts [ Hash | nil ] read_concern The read concern of the query
166
+ # (e.g. { level: :majority }).
167
+ # @option opts [ Hash | nil ] read_preference The read preference of
168
+ # the query (e.g. { mode: :secondary }).
169
+ # @option opts [ Boolean | nil ] multi_collection Whether the query
170
+ # results could potentially come from multiple collections. When true,
171
+ # these results will be stored under the nil namespace key and cleared
172
+ # on every write command.
173
+ #
174
+ # @return [ Mongo::CachingCursor | nil ] Returns a CachingCursor if one
175
+ # exists in the query cache, otherwise returns nil.
176
+ #
177
+ # @api private
178
+ def get(**opts)
179
+ limit = opts[:limit]
180
+ _namespace_key = namespace_key(**opts)
181
+ _cache_key = cache_key(**opts)
182
+
183
+ namespace_hash = cache_table[_namespace_key]
184
+ return nil unless namespace_hash
185
+
186
+ caching_cursor = namespace_hash[_cache_key]
187
+ return nil unless caching_cursor
188
+
189
+ caching_cursor_limit = caching_cursor.view.limit
190
+
191
+ # There are two scenarios in which a caching cursor could fulfill the
192
+ # query:
193
+ # 1. The query has a limit, and the stored cursor has no limit or
194
+ # a larger limit.
195
+ # 2. The query has no limit and the stored cursor has no limit.
196
+ #
197
+ # Otherwise, return nil because the stored cursor will not satisfy
198
+ # the query.
199
+ if limit && (caching_cursor_limit.nil? || caching_cursor_limit >= limit)
200
+ caching_cursor
201
+ elsif limit.nil? && caching_cursor_limit.nil?
202
+ caching_cursor
203
+ else
204
+ nil
205
+ end
206
+ end
207
+
208
+ private
209
+
210
+ def cache_key(**opts)
211
+ unless opts[:namespace]
212
+ raise ArgumentError.new("Cannot generate cache key without namespace")
213
+ end
214
+ unless opts[:selector]
215
+ raise ArgumentError.new("Cannot generate cache key without selector")
216
+ end
217
+
218
+ [
219
+ opts[:namespace],
220
+ opts[:selector],
221
+ opts[:skip],
222
+ opts[:sort],
223
+ opts[:projection],
224
+ opts[:collation],
225
+ opts[:read_concern],
226
+ opts[:read_preference]
227
+ ]
228
+ end
229
+
230
+ # If the cached results can come from multiple collections, store this
231
+ # cursor under the nil namespace to be cleared on every write operation.
232
+ # Otherwise, store it under the specified namespace.
233
+ def namespace_key(**opts)
234
+ if opts[:multi_collection]
235
+ nil
236
+ else
237
+ opts[:namespace]
238
+ end
239
+ end
240
+ end
241
+ end
242
+ end
@@ -59,7 +59,14 @@ module Mongo
59
59
  def read_with_retry_cursor(session, server_selector, view, &block)
60
60
  read_with_retry(session, server_selector) do |server|
61
61
  result = yield server
62
- Cursor.new(view, result, server, session: session)
62
+
63
+ # RUBY-2367: This will be updated to allow the query cache to
64
+ # cache cursors with multi-batch results.
65
+ if QueryCache.enabled? && !view.collection.system_collection?
66
+ CachingCursor.new(view, result, server, session: session)
67
+ else
68
+ Cursor.new(view, result, server, session: session)
69
+ end
63
70
  end
64
71
  end
65
72
 
@@ -64,7 +64,7 @@ module Mongo
64
64
  @connection_id_gen = Class.new do
65
65
  include Id
66
66
  end
67
- @scan_semaphore = Semaphore.new
67
+ @scan_semaphore = DistinguishingSemaphore.new
68
68
  @round_trip_time_averager = RoundTripTimeAverager.new
69
69
  @description = Description.new(address, {})
70
70
  @last_scan = nil
@@ -311,7 +311,7 @@ module Mongo
311
311
  #
312
312
  # @since 2.0.0
313
313
  def inspect
314
- "#<Mongo::Server:0x#{object_id} address=#{address.host}:#{address.port}>"
314
+ "#<Mongo::Server:0x#{object_id} address=#{address.host}:#{address.port} #{status}>"
315
315
  end
316
316
 
317
317
  # @return [ String ] String representing server status (e.g. PRIMARY).
@@ -352,6 +352,10 @@ module Mongo
352
352
  status += " replica_set=#{replica_set_name}"
353
353
  end
354
354
 
355
+ unless monitor&.running?
356
+ status += " NO-MONITORING"
357
+ end
358
+
355
359
  if @pool
356
360
  status += " pool=#{@pool.summary}"
357
361
  end
@@ -432,7 +436,7 @@ module Mongo
432
436
  def handle_handshake_failure!
433
437
  yield
434
438
  rescue Mongo::Error::SocketError, Mongo::Error::SocketTimeoutError => e
435
- unknown!(generation: e.generation)
439
+ unknown!(generation: e.generation, stop_push_monitor: true)
436
440
  raise
437
441
  end
438
442
 
@@ -455,7 +459,7 @@ module Mongo
455
459
  raise
456
460
  rescue Mongo::Error::SocketError => e
457
461
  # non-timeout network error
458
- unknown!(generation: e.generation)
462
+ unknown!(generation: e.generation, stop_push_monitor: true)
459
463
  raise
460
464
  rescue Auth::Unauthorized
461
465
  # auth error, keep server description and topology as they are
@@ -503,6 +507,8 @@ module Mongo
503
507
  # on 4.2+ servers).
504
508
  # @option options [ TopologyVersion ] :topology_version Topology version
505
509
  # of the error response that is causing the server to be marked unknown.
510
+ # @option options [ true | false ] :stop_push_monitor Whether to stop
511
+ # the PushMonitor associated with the server, if any.
506
512
  #
507
513
  # @since 2.4.0, SDAM events are sent as of version 2.7.0
508
514
  def unknown!(options = {})
@@ -516,6 +522,10 @@ module Mongo
516
522
  return
517
523
  end
518
524
 
525
+ if options[:stop_push_monitor]
526
+ monitor&.stop_push_monitor!
527
+ end
528
+
519
529
  # SDAM flow will update description on the server without in-place
520
530
  # mutations and invoke SDAM transitions as needed.
521
531
  config = {}
@@ -562,3 +572,4 @@ require 'mongo/server/context'
562
572
  require 'mongo/server/description'
563
573
  require 'mongo/server/monitor'
564
574
  require 'mongo/server/round_trip_time_averager'
575
+ require 'mongo/server/push_monitor'
@@ -65,12 +65,17 @@ module Mongo
65
65
  # the metadata printed to the mongod logs upon establishing a connection
66
66
  # in server versions >= 3.4.
67
67
  # @option options [ String ] :user The user name.
68
+ # @option options [ Array<Hash> ] :wrapping_libraries Information about
69
+ # libraries such as ODMs that are wrapping the driver. Specify the
70
+ # lower level libraries first. Allowed hash keys: :name, :version,
71
+ # :platform.
68
72
  #
69
73
  # @since 2.4.0
70
74
  def initialize(options)
71
75
  @app_name = options[:app_name].to_s if options[:app_name]
72
76
  @platform = options[:platform]
73
77
  @compressors = options[:compressors] || []
78
+ @wrapping_libraries = options[:wrapping_libraries]
74
79
 
75
80
  if options[:user] && !options[:auth_mech]
76
81
  auth_db = options[:auth_source] || 'admin'
@@ -78,6 +83,10 @@ module Mongo
78
83
  end
79
84
  end
80
85
 
86
+ # @return [ Array<Hash> | nil ] Information about libraries wrapping
87
+ # the driver.
88
+ attr_reader :wrapping_libraries
89
+
81
90
  # Get the bytes of the ismaster message including this metadata.
82
91
  #
83
92
  # @api private
@@ -140,9 +149,17 @@ module Mongo
140
149
  end
141
150
 
142
151
  def driver_doc
152
+ names = [DRIVER_NAME]
153
+ versions = [Mongo::VERSION]
154
+ if wrapping_libraries
155
+ wrapping_libraries.each do |library|
156
+ names << library[:name] || ''
157
+ versions << library[:version] || ''
158
+ end
159
+ end
143
160
  {
144
- name: DRIVER_NAME,
145
- version: Mongo::VERSION
161
+ name: names.join('|'),
162
+ version: versions.join('|'),
146
163
  }
147
164
  end
148
165
 
@@ -175,12 +192,19 @@ module Mongo
175
192
  ruby_versions = ["Ruby #{RUBY_VERSION}"]
176
193
  platforms = [RUBY_PLATFORM]
177
194
  end
178
- [
195
+ platform = [
179
196
  @platform,
180
197
  *ruby_versions,
181
198
  *platforms,
182
199
  RbConfig::CONFIG['build'],
183
200
  ].compact.join(', ')
201
+ platforms = [platform]
202
+ if wrapping_libraries
203
+ wrapping_libraries.each do |library|
204
+ platforms << library[:platform] || ''
205
+ end
206
+ end
207
+ platforms.join('|')
184
208
  end
185
209
  end
186
210
  end
@@ -163,7 +163,7 @@ module Mongo
163
163
  unless @socket
164
164
  # When @socket is assigned, the socket should have handshaken and
165
165
  # authenticated and be usable.
166
- @socket, @description = do_connect
166
+ @socket, @description, @compressor = do_connect
167
167
 
168
168
  publish_cmap_event(
169
169
  Monitoring::Event::Cmap::ConnectionReady.new(address, id)
@@ -194,7 +194,7 @@ module Mongo
194
194
  raise
195
195
  end
196
196
 
197
- [socket, pending_connection.description]
197
+ [socket, pending_connection.description, pending_connection.compressor]
198
198
  end
199
199
 
200
200
  # Disconnect the connection.
@@ -220,7 +220,7 @@ module Mongo
220
220
  @auth_mechanism = nil
221
221
  @last_checkin = nil
222
222
  if socket
223
- socket.close
223
+ socket.close rescue nil
224
224
  @socket = nil
225
225
  end
226
226
  @closed = true
@@ -306,7 +306,7 @@ module Mongo
306
306
  yield
307
307
  rescue Error::SocketError => e
308
308
  @error = e
309
- @server.unknown!(generation: e.generation)
309
+ @server.unknown!(generation: e.generation, stop_push_monitor: true)
310
310
  raise
311
311
  rescue Error::SocketTimeoutError => e
312
312
  @error = e