mongo 2.15.0 → 2.16.0.alpha1

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 (328) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +1 -1
  3. data/README.md +1 -1
  4. data/lib/mongo/bulk_write.rb +2 -2
  5. data/lib/mongo/client.rb +45 -5
  6. data/lib/mongo/cluster/periodic_executor.rb +4 -3
  7. data/lib/mongo/cluster/reapers/cursor_reaper.rb +76 -43
  8. data/lib/mongo/cluster/sdam_flow.rb +9 -3
  9. data/lib/mongo/cluster/topology/base.rb +13 -9
  10. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  11. data/lib/mongo/cluster/topology.rb +28 -8
  12. data/lib/mongo/cluster.rb +136 -51
  13. data/lib/mongo/collection/view/aggregation.rb +5 -10
  14. data/lib/mongo/collection/view/builder/aggregation.rb +6 -5
  15. data/lib/mongo/collection/view/builder/map_reduce.rb +12 -49
  16. data/lib/mongo/collection/view/builder.rb +0 -4
  17. data/lib/mongo/collection/view/iterable.rb +58 -24
  18. data/lib/mongo/collection/view/map_reduce.rb +39 -15
  19. data/lib/mongo/collection/view/readable.rb +60 -51
  20. data/lib/mongo/collection/view/writable.rb +178 -175
  21. data/lib/mongo/collection/view.rb +15 -21
  22. data/lib/mongo/collection.rb +13 -13
  23. data/lib/mongo/cursor/kill_spec.rb +38 -0
  24. data/lib/mongo/cursor.rb +72 -31
  25. data/lib/mongo/database/view.rb +1 -1
  26. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  27. data/lib/mongo/error/missing_service_id.rb +26 -0
  28. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  29. data/lib/mongo/error/notable.rb +7 -0
  30. data/lib/mongo/error.rb +3 -0
  31. data/lib/mongo/grid/fs_bucket.rb +21 -2
  32. data/lib/mongo/id.rb +7 -5
  33. data/lib/mongo/index/view.rb +22 -41
  34. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
  35. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  36. data/lib/mongo/monitoring/event/command_started.rb +2 -0
  37. data/lib/mongo/monitoring/publishable.rb +2 -2
  38. data/lib/mongo/operation/aggregate/command.rb +8 -0
  39. data/lib/mongo/operation/context.rb +19 -1
  40. data/lib/mongo/operation/count/command.rb +6 -0
  41. data/lib/mongo/operation/count/op_msg.rb +6 -0
  42. data/lib/mongo/operation/create/command.rb +7 -1
  43. data/lib/mongo/operation/create/op_msg.rb +7 -0
  44. data/lib/mongo/operation/create_index/command.rb +17 -1
  45. data/lib/mongo/operation/create_index/op_msg.rb +17 -4
  46. data/lib/mongo/operation/delete/command.rb +6 -3
  47. data/lib/mongo/operation/delete/legacy.rb +9 -2
  48. data/lib/mongo/operation/delete/op_msg.rb +8 -1
  49. data/lib/mongo/operation/distinct/command.rb +6 -0
  50. data/lib/mongo/operation/distinct/op_msg.rb +7 -0
  51. data/lib/mongo/operation/explain/command.rb +13 -1
  52. data/lib/mongo/operation/explain/legacy.rb +12 -5
  53. data/lib/mongo/operation/explain/op_msg.rb +9 -1
  54. data/lib/mongo/operation/find/builder/command.rb +110 -0
  55. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
  56. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  57. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
  58. data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
  59. data/lib/mongo/operation/find/command.rb +9 -0
  60. data/lib/mongo/operation/find/legacy.rb +10 -1
  61. data/lib/mongo/operation/find/op_msg.rb +12 -0
  62. data/lib/mongo/operation/find.rb +1 -0
  63. data/lib/mongo/operation/get_more/command.rb +1 -0
  64. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  65. data/lib/mongo/operation/get_more/op_msg.rb +1 -0
  66. data/lib/mongo/operation/get_more.rb +1 -0
  67. data/lib/mongo/operation/kill_cursors/command.rb +8 -0
  68. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  69. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -1
  70. data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
  71. data/lib/mongo/operation/kill_cursors.rb +1 -0
  72. data/lib/mongo/operation/map_reduce/command.rb +8 -0
  73. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  74. data/lib/mongo/operation/shared/executable.rb +15 -1
  75. data/lib/mongo/operation/shared/polymorphic_operation.rb +1 -1
  76. data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
  77. data/lib/mongo/operation/shared/response_handling.rb +1 -0
  78. data/lib/mongo/operation/shared/sessions_supported.rb +12 -12
  79. data/lib/mongo/operation/shared/specifiable.rb +11 -29
  80. data/lib/mongo/operation/shared/validatable.rb +87 -0
  81. data/lib/mongo/operation/shared/write.rb +1 -1
  82. data/lib/mongo/operation/update/command.rb +6 -3
  83. data/lib/mongo/operation/update/legacy.rb +19 -11
  84. data/lib/mongo/operation/update/op_msg.rb +7 -4
  85. data/lib/mongo/operation/write_command/command.rb +51 -0
  86. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  87. data/lib/mongo/operation/write_command.rb +32 -0
  88. data/lib/mongo/operation.rb +10 -0
  89. data/lib/mongo/protocol/query.rb +35 -18
  90. data/lib/mongo/server/connection.rb +25 -3
  91. data/lib/mongo/server/connection_base.rb +12 -1
  92. data/lib/mongo/server/connection_common.rb +38 -1
  93. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  94. data/lib/mongo/server/connection_pool.rb +100 -27
  95. data/lib/mongo/server/description/features.rb +17 -16
  96. data/lib/mongo/server/description/load_balancer.rb +33 -0
  97. data/lib/mongo/server/description.rb +85 -6
  98. data/lib/mongo/server/monitor/connection.rb +5 -6
  99. data/lib/mongo/server/monitor.rb +2 -1
  100. data/lib/mongo/server/pending_connection.rb +47 -31
  101. data/lib/mongo/server/push_monitor.rb +6 -0
  102. data/lib/mongo/server.rb +73 -26
  103. data/lib/mongo/server_selector/base.rb +5 -1
  104. data/lib/mongo/session/session_pool.rb +11 -0
  105. data/lib/mongo/session.rb +21 -1
  106. data/lib/mongo/socket/ocsp_verifier.rb +6 -37
  107. data/lib/mongo/uri/options_mapper.rb +1 -0
  108. data/lib/mongo/uri/srv_protocol.rb +6 -8
  109. data/lib/mongo/uri.rb +18 -0
  110. data/lib/mongo/utils.rb +0 -7
  111. data/lib/mongo/version.rb +1 -1
  112. data/mongo.gemspec +1 -1
  113. data/spec/integration/auth_spec.rb +31 -1
  114. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  115. data/spec/integration/bulk_write_spec.rb +1 -1
  116. data/spec/integration/change_stream_spec.rb +3 -3
  117. data/spec/integration/client_construction_spec.rb +54 -0
  118. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  119. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  120. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  121. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  122. data/spec/integration/client_spec.rb +2 -0
  123. data/spec/integration/command_monitoring_spec.rb +1 -1
  124. data/spec/integration/command_spec.rb +1 -1
  125. data/spec/integration/connection_spec.rb +52 -35
  126. data/spec/integration/crud_spec.rb +174 -1
  127. data/spec/integration/cursor_pinning_spec.rb +121 -0
  128. data/spec/integration/cursor_reaping_spec.rb +8 -4
  129. data/spec/integration/fork_reconnect_spec.rb +1 -5
  130. data/spec/integration/get_more_spec.rb +1 -1
  131. data/spec/integration/heartbeat_events_spec.rb +1 -1
  132. data/spec/integration/map_reduce_spec.rb +77 -0
  133. data/spec/integration/query_cache_spec.rb +47 -2
  134. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  135. data/spec/integration/read_concern_spec.rb +1 -1
  136. data/spec/integration/read_preference_spec.rb +1 -1
  137. data/spec/integration/reconnect_spec.rb +30 -12
  138. data/spec/integration/retryable_errors_spec.rb +1 -1
  139. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  140. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  141. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  142. data/spec/integration/sdam_events_spec.rb +35 -19
  143. data/spec/integration/sdam_prose_spec.rb +1 -1
  144. data/spec/integration/server_monitor_spec.rb +1 -0
  145. data/spec/integration/server_selector_spec.rb +22 -5
  146. data/spec/integration/server_spec.rb +2 -0
  147. data/spec/integration/srv_monitoring_spec.rb +1 -1
  148. data/spec/integration/step_down_spec.rb +1 -1
  149. data/spec/integration/transaction_pinning_spec.rb +120 -0
  150. data/spec/integration/versioned_api_examples_spec.rb +45 -0
  151. data/spec/integration/x509_auth_spec.rb +1 -1
  152. data/spec/lite_spec_helper.rb +1 -2
  153. data/spec/mongo/address/unix_spec.rb +1 -0
  154. data/spec/mongo/auth/cr_spec.rb +2 -3
  155. data/spec/mongo/auth/ldap_spec.rb +2 -3
  156. data/spec/mongo/auth/scram_spec.rb +2 -3
  157. data/spec/mongo/auth/user/view_spec.rb +1 -1
  158. data/spec/mongo/auth/x509_spec.rb +2 -3
  159. data/spec/mongo/bulk_write_spec.rb +3 -3
  160. data/spec/mongo/client_construction_spec.rb +259 -28
  161. data/spec/mongo/client_spec.rb +6 -4
  162. data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
  163. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  164. data/spec/mongo/cluster_spec.rb +44 -3
  165. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  166. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  167. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  168. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  169. data/spec/mongo/collection_crud_spec.rb +7 -2
  170. data/spec/mongo/collection_ddl_spec.rb +1 -1
  171. data/spec/mongo/collection_spec.rb +1 -1
  172. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  173. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  174. data/spec/mongo/cursor_spec.rb +15 -5
  175. data/spec/mongo/database_spec.rb +15 -15
  176. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  177. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  178. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  179. data/spec/mongo/grid/stream_spec.rb +1 -1
  180. data/spec/mongo/index/view_spec.rb +2 -2
  181. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  182. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  183. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  184. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  185. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  186. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  187. data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
  188. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  189. data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
  190. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  191. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  192. data/spec/mongo/query_cache_spec.rb +6 -2
  193. data/spec/mongo/server/connection_common_spec.rb +62 -11
  194. data/spec/mongo/server/connection_pool_spec.rb +73 -7
  195. data/spec/mongo/server/connection_spec.rb +138 -43
  196. data/spec/mongo/server/description_spec.rb +1 -1
  197. data/spec/mongo/server/monitor_spec.rb +4 -3
  198. data/spec/mongo/session/session_pool_spec.rb +42 -10
  199. data/spec/mongo/session_transaction_spec.rb +15 -30
  200. data/spec/mongo/socket/unix_spec.rb +1 -0
  201. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  202. data/spec/runners/change_streams/test.rb +1 -1
  203. data/spec/runners/cmap.rb +1 -1
  204. data/spec/runners/connection_string.rb +7 -3
  205. data/spec/runners/crud/operation.rb +5 -3
  206. data/spec/runners/crud/requirement.rb +1 -0
  207. data/spec/runners/crud.rb +1 -1
  208. data/spec/runners/sdam.rb +2 -1
  209. data/spec/runners/transactions/test.rb +2 -2
  210. data/spec/runners/unified/assertions.rb +2 -3
  211. data/spec/runners/unified/event_subscriber.rb +2 -2
  212. data/spec/runners/unified/test.rb +3 -0
  213. data/spec/runners/unified.rb +1 -1
  214. data/spec/shared/lib/mrss/constraints.rb +11 -5
  215. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  216. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  217. data/spec/shared/share/Dockerfile.erb +2 -1
  218. data/spec/shared/shlib/server.sh +70 -20
  219. data/spec/spec_tests/change_streams_spec.rb +1 -1
  220. data/spec/spec_tests/cmap_spec.rb +4 -1
  221. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  222. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  223. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  224. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  225. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  226. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  227. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  228. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  229. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  230. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  231. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  232. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  233. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  234. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  235. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  236. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  237. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  238. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  239. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  240. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  241. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  242. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  243. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  244. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  245. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  246. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  247. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  248. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  249. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  250. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  251. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  252. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  253. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  254. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  255. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  256. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  257. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  258. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  259. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  260. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  261. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  262. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  263. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  264. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  265. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  266. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  267. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  268. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  269. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  270. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  271. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  272. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  273. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  274. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  275. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  276. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  277. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  278. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  279. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  280. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  281. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  282. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  283. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  284. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  285. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  286. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  287. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  288. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  289. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  290. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  291. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  292. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  293. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  294. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  295. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  296. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  297. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  298. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  299. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  300. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  301. data/spec/spec_tests/sdam_spec.rb +1 -1
  302. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  303. data/spec/spec_tests/uri_options_spec.rb +4 -4
  304. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  305. data/spec/stress/push_monitor_close_spec.rb +44 -0
  306. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  307. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  308. data/spec/support/common_shortcuts.rb +2 -3
  309. data/spec/support/matchers.rb +13 -0
  310. data/spec/support/shared/auth_context.rb +16 -0
  311. data/spec/support/shared/session.rb +2 -2
  312. data/spec/support/spec_config.rb +9 -10
  313. data/spec/support/using_hash.rb +31 -0
  314. data/spec/support/utils.rb +1 -1
  315. data.tar.gz.sig +2 -4
  316. metadata +1050 -1004
  317. metadata.gz.sig +0 -0
  318. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  319. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  320. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  321. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  322. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  323. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  324. data/lib/mongo/server/context.rb +0 -72
  325. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  326. data/spec/runners/unified/using_hash.rb +0 -34
  327. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  328. data/spec/support/event_subscriber.rb +0 -221
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- # Copyright (C) 2015-2020 MongoDB Inc.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- module Mongo
19
- class Cursor
20
- module Builder
21
-
22
- # Encapsulates behavior around generating an OP_GET_MORE specification.
23
- #
24
- # @since 2.2.0
25
- class OpGetMore
26
- extend Forwardable
27
-
28
- # @return [ Cursor ] cursor The cursor.
29
- attr_reader :cursor
30
-
31
- def_delegators :@cursor, :collection_name, :database, :to_return
32
-
33
- # Create the new builder.
34
- #
35
- # @example Create the builder.
36
- # OpGetMore.new(cursor)
37
- #
38
- # @param [ Cursor ] cursor The cursor.
39
- #
40
- # @since 2.2.0
41
- def initialize(cursor)
42
- @cursor = cursor
43
- end
44
-
45
- # Get the specification.
46
- #
47
- # @example Get the specification.
48
- # op_get_more.specification
49
- #
50
- # @return [ Hash ] The specification.
51
- #
52
- # @since 2.2.0
53
- def specification
54
- {
55
- :to_return => to_return,
56
- :cursor_id => BSON::Int64.new(cursor.id),
57
- :db_name => database.name,
58
- :coll_name => collection_name,
59
- }
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- # Copyright (C) 2015-2020 MongoDB Inc.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- module Mongo
19
- class Cursor
20
- module Builder
21
-
22
- # Encapsulates behavior around generating an OP_KILL_CURSORS specification.
23
- #
24
- # @since 2.2.0
25
- class OpKillCursors
26
- extend Forwardable
27
-
28
- # @return [ Cursor ] cursor The cursor.
29
- attr_reader :cursor
30
-
31
- def_delegators :@cursor, :collection_name, :database
32
-
33
- # Create the new builder.
34
- #
35
- # @example Create the builder.
36
- # OpKillCursors.new(cursor)
37
- #
38
- # @param [ Cursor ] cursor The cursor.
39
- #
40
- # @since 2.2.0
41
- def initialize(cursor)
42
- @cursor = cursor
43
- end
44
-
45
- # Get the specification.
46
- #
47
- # @example Get the specification.
48
- # op_kill_cursors.specification
49
- #
50
- # @return [ Hash ] The specification.
51
- #
52
- # @since 2.2.0
53
- def specification
54
- {
55
- coll_name: collection_name,
56
- db_name: database.name,
57
- cursor_ids: [ BSON::Int64.new(cursor.id) ],
58
- }
59
- end
60
-
61
- class << self
62
-
63
- # Update a specification's list of cursor ids.
64
- #
65
- # @example Update a specification's list of cursor ids.
66
- # OpKillCursors.update_cursors(spec, ids)
67
- #
68
- # @return [ Hash ] The specification.
69
- # @return [ Array<Integer> ] The ids to update with.
70
- #
71
- # @since 2.3.0
72
- def update_cursors(spec, ids)
73
- # Ruby 2.5+ can & BSON::Int64 instances.
74
- # Ruby 2.4 and earlier cannot.
75
- # Convert stored ids to Ruby integers for compatibility with
76
- # older Rubies.
77
- ids = get_cursors_list(spec) & ids
78
- ids = ids.map do |cursor_id|
79
- BSON::Int64.new(cursor_id)
80
- end
81
- spec.merge!(cursor_ids: ids)
82
- end
83
-
84
- # Get the list of cursor ids from a spec generated by this Builder.
85
- #
86
- # @example Get the list of cursor ids.
87
- # OpKillCursors.cursors(spec)
88
- #
89
- # @return [ Array<Integer> ] The cursor ids.
90
- #
91
- # @since 2.3.0
92
- def get_cursors_list(spec)
93
- spec[:cursor_ids].map do |value|
94
- if value.respond_to?(:value)
95
- # bson-ruby >= 4.6.0
96
- value.value
97
- else
98
- value.instance_variable_get('@integer')
99
- end
100
- end
101
- end
102
- end
103
- end
104
- end
105
- end
106
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- # Copyright (C) 2014-2020 MongoDB Inc.
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the 'License');
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an 'AS IS' BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
-
18
- module Mongo
19
- class Server
20
-
21
- # Represents a context in which messages are sent to the server on a
22
- # connection.
23
- #
24
- # @since 2.0.0
25
- #
26
- # @deprecated Will be removed in version 3.0
27
- class Context
28
- extend Forwardable
29
-
30
- # Instantiate a server context.
31
- #
32
- # @example Instantiate a server context.
33
- # Mongo::Server::Context.new(server)
34
- #
35
- # @param [ Mongo::Server ] server The server the context is for.
36
- #
37
- # @since 2.0.0
38
- def initialize(server)
39
- @server = server
40
- end
41
-
42
- # @return [ Mongo::Server ] server The server the context is for.
43
- attr_reader :server
44
-
45
- # Delegate state checks to the server.
46
- def_delegators :@server,
47
- :cluster,
48
- :features,
49
- :max_wire_version,
50
- :max_write_batch_size,
51
- :mongos?,
52
- :primary?,
53
- :secondary?,
54
- :standalone?
55
-
56
- # Execute a block of code with a connection, that is checked out of the
57
- # pool and then checked back in.
58
- #
59
- # @example Send a message with the connection.
60
- # context.with_connection do |connection|
61
- # connection.dispatch([ command ])
62
- # end
63
- #
64
- # @return [ Object ] The result of the block execution.
65
- #
66
- # @since 2.0.0
67
- def with_connection(&block)
68
- server.pool.with_connection(&block)
69
- end
70
- end
71
- end
72
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require 'spec_helper'
5
-
6
- describe Mongo::Cursor::Builder::OpKillCursors do
7
-
8
- let(:reply) do
9
- Mongo::Protocol::Reply.allocate.tap do |reply|
10
- allow(reply).to receive(:cursor_id).and_return(8000)
11
- end
12
- end
13
-
14
- let(:description) do
15
- Mongo::Server::Description.new(
16
- double('description address'),
17
- { 'minWireVersion' => 0, 'maxWireVersion' => 2 }
18
- )
19
- end
20
-
21
- let(:result) do
22
- Mongo::Operation::Result.new(reply, description)
23
- end
24
-
25
- let(:view) do
26
- Mongo::Collection::View.new(
27
- authorized_collection,
28
- {},
29
- tailable: true,
30
- max_time_ms: 100
31
- )
32
- end
33
-
34
- let(:cursor) do
35
- Mongo::Cursor.new(view, result, authorized_primary)
36
- end
37
-
38
- let(:builder) do
39
- described_class.new(cursor)
40
- end
41
-
42
- describe '#specification' do
43
-
44
- let(:specification) do
45
- builder.specification
46
- end
47
-
48
- it 'includes the cursor ids' do
49
- expect(specification[:cursor_ids]).to eq([BSON::Int64.new(8000)])
50
- end
51
-
52
- it 'includes the database name' do
53
- expect(specification[:db_name]).to eq(SpecConfig.instance.test_db)
54
- end
55
-
56
- it 'includes the collection name' do
57
- expect(specification[:coll_name]).to eq(TEST_COLL)
58
- end
59
- end
60
-
61
- describe '.get_cursors_list' do
62
- it 'returns integer cursor ids' do
63
- expect(described_class.get_cursors_list(builder.specification)).to eq([8000])
64
- end
65
- end
66
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- module Unified
5
-
6
- class UsingHash < Hash
7
- def use(key)
8
- wrap(self[key]).tap do
9
- delete(key)
10
- end
11
- end
12
-
13
- def use!(key)
14
- wrap(fetch(key)).tap do
15
- delete(key)
16
- end
17
- end
18
-
19
- private
20
-
21
- def wrap(v)
22
- case v
23
- when Hash
24
- self.class[v]
25
- when Array
26
- v.map do |subv|
27
- wrap(subv)
28
- end
29
- else
30
- v
31
- end
32
- end
33
- end
34
- end
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- require 'lite_spec_helper'
5
-
6
- require 'runners/connection_string'
7
-
8
- describe 'DNS Seedlist Discovery' do
9
- require_external_connectivity
10
-
11
- include Mongo::ConnectionString
12
-
13
- DNS_SEEDLIST_DISCOVERY_TESTS.each do |test_path|
14
-
15
- spec = YAML.load(File.read(test_path))
16
-
17
- test = Mongo::ConnectionString::Test.new(spec)
18
-
19
- context(File.basename(test_path)) do
20
-
21
- context 'when the uri is invalid', if: test.raise_error? do
22
-
23
- let(:valid_errors) do
24
- [
25
- Mongo::Error::InvalidTXTRecord,
26
- Mongo::Error::NoSRVRecords,
27
- Mongo::Error::InvalidURI,
28
- Mongo::Error::MismatchedDomain,
29
- ]
30
- end
31
-
32
- let(:error) do
33
- e = nil
34
- begin; test.uri; rescue => ex; e = ex; end
35
- e
36
- end
37
-
38
- it 'raises an error' do
39
- expect(valid_errors).to include(error.class)
40
- end
41
- end
42
-
43
- context 'when the uri is valid', unless: test.raise_error? do
44
-
45
- it 'does not raise an exception' do
46
- expect(test.uri).to be_a(Mongo::URI::SRVProtocol)
47
- end
48
-
49
- if test.seeds
50
- # DNS seed list tests specify both seeds and hosts.
51
- # To get the hosts, the client must do SDAM (as required in the
52
- # spec tests' description), but this isn't testing DNS seed list -
53
- # it is testing SDAM. Plus, all of the hosts are always the same.
54
- # If seed list is given in the expectations, just test the seed
55
- # list and not the expanded hosts.
56
- it 'creates a client with the correct seeds' do
57
- expect(test.client).to have_hosts(test, test.seeds)
58
- end
59
- else
60
- it 'creates a client with the correct hosts' do
61
- expect(test.client).to have_hosts(test, test.hosts)
62
- end
63
- end
64
-
65
- it 'creates a client with the correct options' do
66
- mapped = Mongo::URI::OptionsMapper.new.ruby_to_smc(test.client.options)
67
- # Connection string spec tests do not use canonical URI option names
68
- actual = Utils.downcase_keys(mapped)
69
- expected = Utils.downcase_keys(test.options)
70
- # SRV tests use ssl URI option instead of tls one
71
- if expected.key?('ssl') && !expected.key?('tls')
72
- expected['tls'] = expected.delete('ssl')
73
- end
74
- actual.should == expected
75
- end
76
- end
77
- end
78
- end
79
- end
@@ -1,221 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- # Test event subscriber.
5
- #
6
- # @since 2.5.0
7
- class EventSubscriber
8
-
9
- # The mappings of event names to types.
10
- #
11
- # @since 2.4.0
12
- MAPPINGS = {
13
- 'topology_opening_event' => Mongo::Monitoring::Event::TopologyOpening,
14
- 'topology_description_changed_event' => Mongo::Monitoring::Event::TopologyChanged,
15
- 'topology_closed_event' => Mongo::Monitoring::Event::TopologyClosed,
16
- 'server_opening_event' => Mongo::Monitoring::Event::ServerOpening,
17
- 'server_description_changed_event' => Mongo::Monitoring::Event::ServerDescriptionChanged,
18
- 'server_closed_event' => Mongo::Monitoring::Event::ServerClosed
19
- }.freeze
20
-
21
- # All events.
22
- attr_reader :all_events
23
-
24
- # The started events.
25
- #
26
- # @since 2.5.0
27
- attr_reader :started_events
28
-
29
- # The succeeded events.
30
- #
31
- # @since 2.5.0
32
- attr_reader :succeeded_events
33
-
34
- # The failed events.
35
- #
36
- # @since 2.5.0
37
- attr_reader :failed_events
38
-
39
- attr_reader :published_events
40
-
41
- # @param [ String ] name Optional name for the event subscriber.
42
- def initialize(name: nil)
43
- @mutex = Mutex.new
44
- clear_events!
45
- @name = name
46
- end
47
-
48
- def to_s
49
- %Q`#<EventSubscriber:#{@name ? "\"#{@name}\"" : '%x' % object_id} \
50
- started=#{started_events.length} \
51
- succeeded=#{succeeded_events.length} \
52
- failed=#{failed_events.length} \
53
- published=#{published_events.length}>`
54
- end
55
-
56
- alias :inspect :to_s
57
-
58
- # Event retrieval
59
-
60
- def select_started_events(cls)
61
- started_events.select do |event|
62
- event.is_a?(cls)
63
- end
64
- end
65
-
66
- def select_succeeded_events(cls)
67
- succeeded_events.select do |event|
68
- event.is_a?(cls)
69
- end
70
- end
71
-
72
- def select_completed_events(*classes)
73
- (succeeded_events + failed_events).select do |event|
74
- classes.any? { |c| c === event }
75
- end
76
- end
77
-
78
- def select_published_events(cls)
79
- published_events.select do |event|
80
- event.is_a?(cls)
81
- end
82
- end
83
-
84
- # Filters command started events for the specified command name.
85
- def command_started_events(command_name)
86
- started_events.select do |event|
87
- event.command[command_name]
88
- end
89
- end
90
-
91
- def non_auth_command_started_events
92
- started_events.reject do |event|
93
- %w(authenticate getnonce saslSstart saslContinue).any? do |cmd|
94
- event.command[cmd]
95
- end
96
- end
97
- end
98
-
99
- # Locates command stated events for the specified command name,
100
- # asserts that there is exactly one such event, and returns it.
101
- def single_command_started_event(command_name, include_auth: false)
102
- events = if include_auth
103
- started_events
104
- else
105
- non_auth_command_started_events
106
- end
107
- events.select! do |event|
108
- event.command[command_name]
109
- end
110
- if events.length != 1
111
- raise "Expected a single #{command_name} event but we have #{events.length}"
112
- end
113
- events.first
114
- end
115
-
116
- # Get the first succeeded event published for the name, and then delete it.
117
- #
118
- # @param [ String ] name The event name.
119
- #
120
- # @return [ Event ] The matching event.
121
- def first_event(name)
122
- cls = MAPPINGS[name]
123
- if cls.nil?
124
- raise ArgumentError, "Bogus event name #{name}"
125
- end
126
- matching = succeeded_events.find do |event|
127
- cls === event
128
- end
129
- succeeded_events.delete(matching)
130
- matching
131
- end
132
-
133
- # Event recording
134
-
135
- # Cache the started event.
136
- #
137
- # @param [ Event ] event The event.
138
- #
139
- # @since 2.5.0
140
- def started(event)
141
- @mutex.synchronize do
142
- started_events << event
143
- all_events << event
144
- end
145
- end
146
-
147
- # Cache the succeeded event.
148
- #
149
- # @param [ Event ] event The event.
150
- #
151
- # @since 2.5.0
152
- def succeeded(event)
153
- @mutex.synchronize do
154
- succeeded_events << event
155
- all_events << event
156
- end
157
- end
158
-
159
- # Cache the failed event.
160
- #
161
- # @param [ Event ] event The event.
162
- #
163
- # @since 2.5.0
164
- def failed(event)
165
- @mutex.synchronize do
166
- failed_events << event
167
- all_events << event
168
- end
169
- end
170
-
171
- def published(event)
172
- @mutex.synchronize do
173
- published_events << event
174
- all_events << event
175
- end
176
- end
177
-
178
- # Clear all cached events.
179
- #
180
- # @since 2.5.1
181
- def clear_events!
182
- @all_events = []
183
- @started_events = []
184
- @succeeded_events = []
185
- @failed_events = []
186
- @published_events = []
187
- self
188
- end
189
- end
190
-
191
- # Only handles succeeded events correctly.
192
- class PhasedEventSubscriber < EventSubscriber
193
- def initialize
194
- super
195
- @phase_events = {}
196
- end
197
-
198
- def phase_finished(phase_index)
199
- @phase_events[phase_index] = succeeded_events
200
- @succeeded_events = []
201
- end
202
-
203
- def phase_events(phase_index)
204
- @phase_events[phase_index]
205
- end
206
-
207
- def event_count
208
- @phase_events.inject(0) do |sum, event|
209
- sum + event.length
210
- end
211
- end
212
- end
213
-
214
- class VerboseEventSubscriber < EventSubscriber
215
- %w(started succeeded failed published).each do |meth|
216
- define_method(meth) do |event|
217
- puts event.summary
218
- super(event)
219
- end
220
- end
221
- end