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
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'QueryCache with transactions' do
4
+ # Work around https://jira.mongodb.org/browse/HELP-10518
5
+ before(:all) do
6
+ client = ClientRegistry.instance.global_client('authorized')
7
+ Utils.create_collection(client, 'test')
8
+
9
+ Utils.mongos_each_direct_client do |client|
10
+ client['test'].distinct('foo').to_a
11
+ end
12
+ end
13
+
14
+ around do |spec|
15
+ Mongo::QueryCache.clear
16
+ Mongo::QueryCache.cache { spec.run }
17
+ end
18
+
19
+ # These tests do not currently use the session registry because transactions
20
+ # leak sessions independently of the query cache. This will be resolved by
21
+ # RUBY-2391.
22
+
23
+ let(:subscriber) { EventSubscriber.new }
24
+
25
+ let(:client) do
26
+ authorized_client.tap do |client|
27
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
28
+ end
29
+ end
30
+
31
+ before do
32
+ collection.delete_many
33
+
34
+ # Work around https://jira.mongodb.org/browse/HELP-10518
35
+ client.start_session do |session|
36
+ session.with_transaction do
37
+ collection.find({}, session: session).to_a
38
+ end
39
+ end
40
+ subscriber.clear_events!
41
+ end
42
+
43
+ describe 'in transactions' do
44
+ require_transaction_support
45
+ require_wired_tiger
46
+
47
+ let(:collection) { client['test'] }
48
+
49
+ let(:events) do
50
+ subscriber.command_started_events('find')
51
+ end
52
+
53
+ context 'with convenient API' do
54
+ context 'when same query is performed inside and outside of transaction' do
55
+ it 'performs one query' do
56
+ collection.find.to_a
57
+
58
+ session = client.start_session
59
+ session.with_transaction do
60
+ collection.find({}, session: session).to_a
61
+ end
62
+
63
+ expect(subscriber.command_started_events('find').length).to eq(1)
64
+ end
65
+ end
66
+
67
+ context 'when transaction has a different read concern' do
68
+ it 'performs two queries' do
69
+ collection.find.to_a
70
+
71
+ session = client.start_session
72
+ session.with_transaction(
73
+ read_concern: { level: :snapshot }
74
+ ) do
75
+ collection.find({}, session: session).to_a
76
+ end
77
+
78
+ expect(subscriber.command_started_events('find').length).to eq(2)
79
+ end
80
+ end
81
+
82
+ context 'when transaction has a different read preference' do
83
+ it 'performs two queries' do
84
+ collection.find.to_a
85
+
86
+ session = client.start_session
87
+ session.with_transaction(
88
+ read: { mode: :primary }
89
+ ) do
90
+ collection.find({}, session: session).to_a
91
+ end
92
+
93
+ expect(subscriber.command_started_events('find').length).to eq(2)
94
+ end
95
+ end
96
+
97
+ context 'when transaction is committed' do
98
+ it 'clears the cache' do
99
+ session = client.start_session
100
+ session.with_transaction do
101
+ collection.insert_one({ test: 1 }, session: session)
102
+ collection.insert_one({ test: 2 }, session: session)
103
+
104
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
105
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
106
+
107
+ # The driver caches the queries within the transaction
108
+ expect(subscriber.command_started_events('find').length).to eq(1)
109
+ session.commit_transaction
110
+ end
111
+
112
+ expect(collection.find.to_a.length).to eq(2)
113
+
114
+ # The driver clears the cache and runs the query again
115
+ expect(subscriber.command_started_events('find').length).to eq(2)
116
+ end
117
+ end
118
+
119
+ context 'when transaction is aborted' do
120
+ it 'clears the cache' do
121
+ session = client.start_session
122
+ session.with_transaction do
123
+ collection.insert_one({ test: 1 }, session: session)
124
+ collection.insert_one({ test: 2 }, session: session)
125
+
126
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
127
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
128
+
129
+ # The driver caches the queries within the transaction
130
+ expect(subscriber.command_started_events('find').length).to eq(1)
131
+ session.abort_transaction
132
+ end
133
+
134
+ expect(collection.find.to_a.length).to eq(0)
135
+
136
+ # The driver clears the cache and runs the query again
137
+ expect(subscriber.command_started_events('find').length).to eq(2)
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'with low-level API' do
143
+ context 'when transaction is committed' do
144
+ it 'clears the cache' do
145
+ session = client.start_session
146
+ session.start_transaction
147
+
148
+ collection.insert_one({ test: 1 }, session: session)
149
+ collection.insert_one({ test: 2 }, session: session)
150
+
151
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
152
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
153
+
154
+ # The driver caches the queries within the transaction
155
+ expect(subscriber.command_started_events('find').length).to eq(1)
156
+
157
+ session.commit_transaction
158
+
159
+ expect(collection.find.to_a.length).to eq(2)
160
+
161
+ # The driver clears the cache and runs the query again
162
+ expect(subscriber.command_started_events('find').length).to eq(2)
163
+ end
164
+ end
165
+
166
+ context 'when transaction is aborted' do
167
+ it 'clears the cache' do
168
+ session = client.start_session
169
+ session.start_transaction
170
+
171
+ collection.insert_one({ test: 1 }, session: session)
172
+ collection.insert_one({ test: 2 }, session: session)
173
+
174
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
175
+ expect(collection.find({}, session: session).to_a.length).to eq(2)
176
+
177
+ # The driver caches the queries within the transaction
178
+ expect(subscriber.command_started_events('find').length).to eq(1)
179
+
180
+ session.abort_transaction
181
+
182
+ expect(collection.find.to_a.length).to eq(0)
183
+
184
+ # The driver clears the cache and runs the query again
185
+ expect(subscriber.command_started_events('find').length).to eq(2)
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -17,7 +17,7 @@ describe 'read concern' do
17
17
 
18
18
  let(:sent_read_concern) do
19
19
  subscriber.clear_events!
20
- collection.count_documents({})
20
+ collection.count_documents
21
21
  subscriber.started_events.find { |c| c.command_name == 'aggregate' }.command[:readConcern]
22
22
  end
23
23
 
@@ -106,7 +106,7 @@ describe 'Failing retryable operations' do
106
106
  },
107
107
  }
108
108
 
109
- if ClusterConfig.instance.short_server_version >= '4.3'
109
+ if ClusterConfig.instance.short_server_version >= '4.4'
110
110
  # Server versions 4.4 and newer will add the RetryableWriteError
111
111
  # label to all retryable errors, and the driver must not add the label
112
112
  # if it is not already present.
@@ -8,6 +8,7 @@ describe 'Retryable Writes' do
8
8
  require_fail_command
9
9
  require_wired_tiger
10
10
  require_no_multi_shard
11
+ require_warning_clean
11
12
 
12
13
  let(:client) do
13
14
  authorized_client.with(
@@ -2,6 +2,8 @@ require_relative './adds_diagnostics'
2
2
 
3
3
  module PerformsLegacyRetries
4
4
  shared_examples 'it performs legacy retries' do
5
+ require_warning_clean
6
+
5
7
  context 'for connection error' do
6
8
  before do
7
9
  client.use('admin').command(
@@ -26,7 +28,7 @@ module PerformsLegacyRetries
26
28
  end
27
29
 
28
30
  context 'for ETIMEDOUT' do
29
- min_server_fcv '4.3'
31
+ min_server_fcv '4.4'
30
32
 
31
33
  # shorten socket timeout so these tests take less time to run
32
34
  let(:socket_timeout) { 1 }
@@ -59,7 +61,7 @@ module PerformsLegacyRetries
59
61
  end
60
62
 
61
63
  context 'on server versions >= 4.4' do
62
- min_server_fcv '4.3'
64
+ min_server_fcv '4.4'
63
65
 
64
66
  context 'for OperationFailure with RetryableWriteError label' do
65
67
  before do
@@ -44,8 +44,8 @@ module PerformsModernRetries
44
44
 
45
45
  context 'for ETIMEDOUT' do
46
46
  # blockConnection option in failCommand was introduced in
47
- # server version 4.3
48
- min_server_fcv '4.3'
47
+ # server version 4.4
48
+ min_server_fcv '4.4'
49
49
 
50
50
  # shorten socket timeout so these tests take less time to run
51
51
  let(:socket_timeout) { 1 }
@@ -94,7 +94,7 @@ module PerformsModernRetries
94
94
  end
95
95
 
96
96
  context 'on server versions >= 4.4' do
97
- min_server_fcv '4.3'
97
+ min_server_fcv '4.4'
98
98
 
99
99
  context 'for OperationFailure with RetryableWriteError label' do
100
100
  before do
@@ -25,7 +25,7 @@ module PerformsNoRetries
25
25
  end
26
26
 
27
27
  context 'for ETIMEDOUT' do
28
- min_server_fcv '4.3'
28
+ min_server_fcv '4.4'
29
29
 
30
30
  # shorten socket timeout so these tests take less time to run
31
31
  let(:socket_timeout) { 1 }
@@ -58,7 +58,7 @@ module PerformsNoRetries
58
58
  end
59
59
 
60
60
  context 'on server versions >= 4.4' do
61
- min_server_fcv '4.3'
61
+ min_server_fcv '4.4'
62
62
  # These tests will be implemented in a follow-up PR
63
63
  end
64
64
 
@@ -3,15 +3,40 @@ require 'spec_helper'
3
3
  describe 'SDAM error handling' do
4
4
  clean_slate_for_all
5
5
 
6
+ after do
7
+ # Close all clients after every test to avoid leaking expectations into
8
+ # subsequent tests because we set global assertions on sockets.
9
+ ClientRegistry.instance.close_all_clients
10
+ end
11
+
6
12
  # These tests operate on specific servers, and don't work in a multi
7
13
  # shard cluster where multiple servers are equally eligible
8
14
  require_no_multi_shard
9
15
 
10
- let(:client) { authorized_client_without_any_retries }
16
+ let(:diagnostic_subscriber) { VerboseEventSubscriber.new }
17
+
18
+ let(:client) do
19
+ new_local_client(SpecConfig.instance.addresses,
20
+ SpecConfig.instance.all_test_options.merge(
21
+ socket_timeout: 3, connect_timeout: 3,
22
+ heartbeat_frequency: 100,
23
+ # Uncomment to print all events to stdout:
24
+ #sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
25
+ **Utils.disable_retries_client_options)
26
+ )
27
+ end
11
28
 
12
29
  let(:server) { client.cluster.next_primary }
13
30
 
14
31
  shared_examples_for 'marks server unknown' do
32
+ before do
33
+ server.monitor.stop!
34
+ end
35
+
36
+ after do
37
+ client.close
38
+ end
39
+
15
40
  it 'marks server unknown' do
16
41
  expect(server).not_to be_unknown
17
42
  RSpec::Mocks.with_temporary_scope do
@@ -22,6 +47,14 @@ describe 'SDAM error handling' do
22
47
  end
23
48
 
24
49
  shared_examples_for 'does not mark server unknown' do
50
+ before do
51
+ server.monitor.stop!
52
+ end
53
+
54
+ after do
55
+ client.close
56
+ end
57
+
25
58
  it 'does not mark server unknown' do
26
59
  expect(server).not_to be_unknown
27
60
  RSpec::Mocks.with_temporary_scope do
@@ -148,6 +181,9 @@ describe 'SDAM error handling' do
148
181
  end
149
182
 
150
183
  context 'network error' do
184
+ # With 4.4 servers we set up two monitoring connections, hence global
185
+ # socket expectations get hit twice.
186
+ max_server_version '4.2'
151
187
 
152
188
  let(:operation) do
153
189
  expect_any_instance_of(Mongo::Socket).to receive(:read).and_raise(exception)
@@ -178,15 +214,76 @@ describe 'SDAM error handling' do
178
214
  end
179
215
  end
180
216
 
181
- describe 'when there is an error on monitoring connection' do
182
- clean_slate_for_all
217
+ describe 'when there is an error during connection establishment' do
218
+ require_topology :single
219
+
220
+ # The push monitor creates sockets unpredictably and interferes with this
221
+ # test.
222
+ max_server_version '4.2'
223
+
224
+ # When TLS is used there are two socket classes and we can't simply
225
+ # mock the base Socket class.
226
+ require_no_tls
227
+
228
+ {
229
+ SystemCallError => Mongo::Error::SocketError,
230
+ Errno::ETIMEDOUT => Mongo::Error::SocketTimeoutError,
231
+ }.each do |raw_error_cls, mapped_error_cls|
232
+ context raw_error_cls.name do
233
+ let(:socket) do
234
+ double('mock socket').tap do |socket|
235
+ allow(socket).to receive(:set_encoding)
236
+ allow(socket).to receive(:setsockopt)
237
+ allow(socket).to receive(:getsockopt)
238
+ allow(socket).to receive(:connect)
239
+ allow(socket).to receive(:close)
240
+ socket.should receive(:write).and_raise(raw_error_cls, 'mocked failure')
241
+ end
242
+ end
243
+
244
+ it 'marks server unknown' do
245
+ server = client.cluster.next_primary
246
+ client.cluster.servers.map(&:disconnect!)
247
+
248
+ RSpec::Mocks.with_temporary_scope do
249
+
250
+ Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
251
+
252
+ lambda do
253
+ client.command(ping: 1)
254
+ end.should raise_error(mapped_error_cls, /mocked failure/)
255
+
256
+ server.should be_unknown
257
+ end
258
+ end
259
+
260
+ it 'recovers' do
261
+ server = client.cluster.next_primary
262
+ # If we do not kill the monitor, the client will recover automatically.
263
+
264
+ RSpec::Mocks.with_temporary_scope do
265
+
266
+ Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
267
+ Socket.should receive(:new).with(any_args).ordered.once.and_call_original
268
+
269
+ lambda do
270
+ client.command(ping: 1)
271
+ end.should raise_error(mapped_error_cls, /mocked failure/)
272
+
273
+ client.command(ping: 1)
274
+ end
275
+ end
276
+ end
277
+ end
183
278
 
184
- let(:client) do
185
- new_local_client(SpecConfig.instance.addresses,
186
- SpecConfig.instance.test_options.merge(
187
- connect_timeout: 1, socket_timeout: 1,
188
- ))
279
+ after do
280
+ # Since we stopped monitoring on the client, close it.
281
+ ClientRegistry.instance.close_all_clients
189
282
  end
283
+ end
284
+
285
+ describe 'when there is an error on monitoring connection' do
286
+ clean_slate_for_all
190
287
 
191
288
  let(:subscriber) { EventSubscriber.new }
192
289
 
@@ -209,6 +306,7 @@ describe 'SDAM error handling' do
209
306
  it 'marks server unknown' do
210
307
  expect(server).not_to be_unknown
211
308
 
309
+ #subscriber.clear_events!
212
310
  events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerDescriptionChanged)
213
311
  events.should be_empty
214
312
 
@@ -228,6 +326,7 @@ describe 'SDAM error handling' do
228
326
 
229
327
  shared_examples_for 'clears connection pool - cmap event' do
230
328
  it 'clears connection pool' do
329
+ #subscriber.clear_events!
231
330
  events = subscriber.select_published_events(Mongo::Monitoring::Event::Cmap::PoolCleared)
232
331
  events.should be_empty
233
332
 
@@ -245,6 +344,7 @@ describe 'SDAM error handling' do
245
344
  end
246
345
 
247
346
  shared_examples_for 'marks server unknown and clears connection pool' do
347
+ =begin These tests are not reliable
248
348
  context 'via object inspection' do
249
349
  let(:expect_server_state_change) do
250
350
  server.summary.should =~ /unknown/i
@@ -254,6 +354,7 @@ describe 'SDAM error handling' do
254
354
  it_behaves_like 'marks server unknown'
255
355
  it_behaves_like 'clears connection pool'
256
356
  end
357
+ =end
257
358
 
258
359
  context 'via events' do
259
360
  # When we use events we do not need to examine object state, therefore
@@ -268,16 +369,22 @@ describe 'SDAM error handling' do
268
369
  end
269
370
  end
270
371
 
271
- context 'network timeout' do
272
- let(:exception) { Mongo::Error::SocketTimeoutError }
372
+ context 'via stubs' do
373
+ # With 4.4 servers we set up two monitoring connections, hence global
374
+ # socket expectations get hit twice.
375
+ max_server_version '4.2'
273
376
 
274
- it_behaves_like 'marks server unknown and clears connection pool'
275
- end
377
+ context 'network timeout' do
378
+ let(:exception) { Mongo::Error::SocketTimeoutError }
276
379
 
277
- context 'non-timeout network error' do
278
- let(:exception) { Mongo::Error::SocketError }
380
+ it_behaves_like 'marks server unknown and clears connection pool'
381
+ end
279
382
 
280
- it_behaves_like 'marks server unknown and clears connection pool'
383
+ context 'non-timeout network error' do
384
+ let(:exception) { Mongo::Error::SocketError }
385
+
386
+ it_behaves_like 'marks server unknown and clears connection pool'
387
+ end
281
388
  end
282
389
 
283
390
  context 'non-timeout network error via fail point' do