mongo 2.15.1 → 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 (326) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  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 +42 -18
  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 +62 -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.rb +73 -26
  102. data/lib/mongo/server_selector/base.rb +5 -1
  103. data/lib/mongo/session/session_pool.rb +11 -0
  104. data/lib/mongo/session.rb +21 -1
  105. data/lib/mongo/socket/ocsp_verifier.rb +6 -37
  106. data/lib/mongo/uri/options_mapper.rb +1 -0
  107. data/lib/mongo/uri/srv_protocol.rb +6 -8
  108. data/lib/mongo/uri.rb +18 -0
  109. data/lib/mongo/utils.rb +0 -7
  110. data/lib/mongo/version.rb +1 -1
  111. data/mongo.gemspec +1 -1
  112. data/spec/integration/auth_spec.rb +31 -1
  113. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  114. data/spec/integration/bulk_write_spec.rb +1 -1
  115. data/spec/integration/change_stream_spec.rb +3 -3
  116. data/spec/integration/client_construction_spec.rb +54 -0
  117. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  118. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  119. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  120. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  121. data/spec/integration/client_spec.rb +2 -0
  122. data/spec/integration/command_monitoring_spec.rb +1 -1
  123. data/spec/integration/command_spec.rb +1 -1
  124. data/spec/integration/connection_spec.rb +52 -35
  125. data/spec/integration/crud_spec.rb +174 -1
  126. data/spec/integration/cursor_pinning_spec.rb +121 -0
  127. data/spec/integration/cursor_reaping_spec.rb +8 -4
  128. data/spec/integration/fork_reconnect_spec.rb +1 -5
  129. data/spec/integration/get_more_spec.rb +1 -1
  130. data/spec/integration/heartbeat_events_spec.rb +1 -1
  131. data/spec/integration/map_reduce_spec.rb +77 -0
  132. data/spec/integration/query_cache_spec.rb +2 -2
  133. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  134. data/spec/integration/read_concern_spec.rb +1 -1
  135. data/spec/integration/read_preference_spec.rb +1 -1
  136. data/spec/integration/reconnect_spec.rb +30 -12
  137. data/spec/integration/retryable_errors_spec.rb +1 -1
  138. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  139. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  140. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  141. data/spec/integration/sdam_events_spec.rb +35 -19
  142. data/spec/integration/sdam_prose_spec.rb +1 -1
  143. data/spec/integration/server_monitor_spec.rb +1 -0
  144. data/spec/integration/server_selector_spec.rb +22 -5
  145. data/spec/integration/server_spec.rb +2 -0
  146. data/spec/integration/srv_monitoring_spec.rb +1 -1
  147. data/spec/integration/step_down_spec.rb +1 -1
  148. data/spec/integration/transaction_pinning_spec.rb +120 -0
  149. data/spec/integration/versioned_api_examples_spec.rb +45 -0
  150. data/spec/integration/x509_auth_spec.rb +1 -1
  151. data/spec/lite_spec_helper.rb +1 -2
  152. data/spec/mongo/address/unix_spec.rb +1 -0
  153. data/spec/mongo/auth/cr_spec.rb +2 -3
  154. data/spec/mongo/auth/ldap_spec.rb +2 -3
  155. data/spec/mongo/auth/scram_spec.rb +2 -3
  156. data/spec/mongo/auth/user/view_spec.rb +1 -1
  157. data/spec/mongo/auth/x509_spec.rb +2 -3
  158. data/spec/mongo/bulk_write_spec.rb +3 -3
  159. data/spec/mongo/client_construction_spec.rb +259 -28
  160. data/spec/mongo/client_spec.rb +6 -4
  161. data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
  162. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  163. data/spec/mongo/cluster_spec.rb +44 -3
  164. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  165. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  166. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  167. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  168. data/spec/mongo/collection_crud_spec.rb +7 -2
  169. data/spec/mongo/collection_ddl_spec.rb +1 -1
  170. data/spec/mongo/collection_spec.rb +1 -1
  171. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  172. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  173. data/spec/mongo/cursor_spec.rb +15 -5
  174. data/spec/mongo/database_spec.rb +15 -15
  175. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  176. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  177. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  178. data/spec/mongo/grid/stream_spec.rb +1 -1
  179. data/spec/mongo/index/view_spec.rb +2 -2
  180. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  181. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  182. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  183. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  184. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  185. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  186. data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
  187. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  188. data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
  189. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  190. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  191. data/spec/mongo/query_cache_spec.rb +6 -2
  192. data/spec/mongo/server/connection_common_spec.rb +62 -11
  193. data/spec/mongo/server/connection_pool_spec.rb +73 -7
  194. data/spec/mongo/server/connection_spec.rb +138 -43
  195. data/spec/mongo/server/description_spec.rb +1 -1
  196. data/spec/mongo/server/monitor_spec.rb +4 -3
  197. data/spec/mongo/session/session_pool_spec.rb +42 -10
  198. data/spec/mongo/session_transaction_spec.rb +15 -30
  199. data/spec/mongo/socket/unix_spec.rb +1 -0
  200. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  201. data/spec/runners/change_streams/test.rb +1 -1
  202. data/spec/runners/cmap.rb +1 -1
  203. data/spec/runners/connection_string.rb +7 -3
  204. data/spec/runners/crud/operation.rb +5 -3
  205. data/spec/runners/crud/requirement.rb +1 -0
  206. data/spec/runners/crud.rb +1 -1
  207. data/spec/runners/sdam.rb +2 -1
  208. data/spec/runners/transactions/test.rb +2 -2
  209. data/spec/runners/unified/assertions.rb +2 -3
  210. data/spec/runners/unified/event_subscriber.rb +2 -2
  211. data/spec/runners/unified/test.rb +3 -0
  212. data/spec/runners/unified.rb +1 -1
  213. data/spec/shared/lib/mrss/constraints.rb +11 -5
  214. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  215. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  216. data/spec/shared/share/Dockerfile.erb +2 -1
  217. data/spec/shared/shlib/server.sh +70 -20
  218. data/spec/spec_tests/change_streams_spec.rb +1 -1
  219. data/spec/spec_tests/cmap_spec.rb +4 -1
  220. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  221. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  222. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  223. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  224. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  225. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  226. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  227. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  228. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  229. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  230. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  231. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  232. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  233. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  234. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  235. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  236. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  237. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  238. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  239. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  240. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  241. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  242. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  243. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  244. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  245. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  246. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  247. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  248. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  249. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  250. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  251. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  252. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  253. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  254. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  255. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  256. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  257. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  258. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  259. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  260. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  261. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  262. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  263. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  264. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  265. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  266. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  267. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  268. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  269. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  270. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  271. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  272. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  273. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  274. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  275. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  276. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  277. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  278. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  279. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  280. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  281. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  282. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  283. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  284. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  285. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  286. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  287. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  288. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  289. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  290. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  291. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  292. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  293. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  294. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  295. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  296. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  297. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  298. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  299. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  300. data/spec/spec_tests/sdam_spec.rb +1 -1
  301. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  302. data/spec/spec_tests/uri_options_spec.rb +4 -4
  303. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  304. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  305. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  306. data/spec/support/common_shortcuts.rb +2 -3
  307. data/spec/support/matchers.rb +13 -0
  308. data/spec/support/shared/auth_context.rb +16 -0
  309. data/spec/support/shared/session.rb +2 -2
  310. data/spec/support/spec_config.rb +9 -10
  311. data/spec/support/using_hash.rb +31 -0
  312. data/spec/support/utils.rb +1 -1
  313. data.tar.gz.sig +0 -0
  314. metadata +120 -76
  315. metadata.gz.sig +0 -0
  316. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  317. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  318. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  319. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  320. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  321. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  322. data/lib/mongo/server/context.rb +0 -72
  323. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  324. data/spec/runners/unified/using_hash.rb +0 -34
  325. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  326. data/spec/support/event_subscriber.rb +0 -221
@@ -20,7 +20,7 @@ describe 'Retryable writes integration tests' do
20
20
 
21
21
  # These tests override server selector, which fails if there are multiple
22
22
  # eligible servers as would be the case in a multi-shard sharded cluster
23
- require_no_multi_shard
23
+ require_no_multi_mongos
24
24
 
25
25
  # Note: these tests are deprecated in favor of the tests in the file
26
26
  # spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb
@@ -10,7 +10,7 @@ require_relative './shared/does_not_support_retries'
10
10
  describe 'Retryable Writes' do
11
11
  require_fail_command
12
12
  require_wired_tiger
13
- require_no_multi_shard
13
+ require_no_multi_mongos
14
14
  require_warning_clean
15
15
 
16
16
  let(:client) do
@@ -4,6 +4,8 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe 'SDAM error handling' do
7
+ require_topology :single, :replica_set, :sharded
8
+
7
9
  clean_slate
8
10
 
9
11
  after do
@@ -14,9 +16,9 @@ describe 'SDAM error handling' do
14
16
 
15
17
  # These tests operate on specific servers, and don't work in a multi
16
18
  # shard cluster where multiple servers are equally eligible
17
- require_no_multi_shard
19
+ require_no_multi_mongos
18
20
 
19
- let(:diagnostic_subscriber) { VerboseEventSubscriber.new }
21
+ let(:diagnostic_subscriber) { Mrss::VerboseEventSubscriber.new }
20
22
 
21
23
  let(:client) do
22
24
  new_local_client(SpecConfig.instance.addresses,
@@ -288,7 +290,7 @@ describe 'SDAM error handling' do
288
290
  describe 'when there is an error on monitoring connection' do
289
291
  clean_slate_for_all
290
292
 
291
- let(:subscriber) { EventSubscriber.new }
293
+ let(:subscriber) { Mrss::EventSubscriber.new }
292
294
 
293
295
  let(:set_subscribers) do
294
296
  client.subscribe(Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, subscriber)
@@ -4,7 +4,7 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe 'SDAM events' do
7
- let(:subscriber) { EventSubscriber.new }
7
+ let(:subscriber) { Mrss::EventSubscriber.new }
8
8
 
9
9
  describe 'server closed event' do
10
10
  it 'is published when client is closed' do
@@ -50,13 +50,20 @@ describe 'SDAM events' do
50
50
  context 'pre-4.4 servers' do
51
51
  max_server_version '4.2'
52
52
 
53
+ let(:sdam_proc) do
54
+ Proc.new do |client|
55
+ client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
56
+ end
57
+ end
58
+
53
59
  let(:client) do
54
60
  new_local_client(SpecConfig.instance.addresses,
55
61
  # Heartbeat interval is bound by 500 ms
56
- SpecConfig.instance.test_options.merge(heartbeat_frequency: 0.5),
57
- ).tap do |client|
58
- client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
59
- end
62
+ SpecConfig.instance.test_options.merge(
63
+ heartbeat_frequency: 0.5,
64
+ sdam_proc: sdam_proc
65
+ ),
66
+ )
60
67
  end
61
68
 
62
69
  it 'is published every heartbeat interval' do
@@ -78,13 +85,20 @@ describe 'SDAM events' do
78
85
  context '4.4+ servers' do
79
86
  min_server_fcv '4.4'
80
87
 
88
+ let(:sdam_proc) do
89
+ Proc.new do |client|
90
+ client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
91
+ end
92
+ end
93
+
81
94
  let(:client) do
82
95
  new_local_client(SpecConfig.instance.addresses,
83
96
  # Heartbeat interval is bound by 500 ms
84
- SpecConfig.instance.test_options.merge(heartbeat_frequency: 0.5),
85
- ).tap do |client|
86
- client.subscribe(Mongo::Monitoring::SERVER_HEARTBEAT, subscriber)
87
- end
97
+ SpecConfig.instance.test_options.merge(
98
+ heartbeat_frequency: 0.5,
99
+ sdam_proc: sdam_proc
100
+ ),
101
+ )
88
102
  end
89
103
 
90
104
  it 'is published up to twice every heartbeat interval' do
@@ -92,23 +106,25 @@ describe 'SDAM events' do
92
106
  sleep 3
93
107
  client.close
94
108
 
95
- events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
109
+ started_events = subscriber.select_started_events(
110
+ Mongo::Monitoring::Event::ServerHeartbeatStarted
111
+ )
96
112
  # We could have up to 16 events and should have no fewer than 8 events.
97
113
  # Whenever an awaited hello succeeds while the regular monitor is
98
114
  # waiting, the regular monitor's next scan is pushed forward.
99
- events.length.should >= 6
100
- events.length.should <= 18
101
- (started_awaited = events.select(&:awaited?)).should_not be_empty
102
- (started_regular = events.reject(&:awaited?)).should_not be_empty
115
+ started_events.length.should >= 6
116
+ started_events.length.should <= 18
117
+ (started_awaited = started_events.select(&:awaited?)).should_not be_empty
118
+ (started_regular = started_events.reject(&:awaited?)).should_not be_empty
103
119
 
104
- events = subscriber.select_completed_events(
120
+ completed_events = subscriber.select_completed_events(
105
121
  Mongo::Monitoring::Event::ServerHeartbeatSucceeded,
106
122
  Mongo::Monitoring::Event::ServerHeartbeatFailed,
107
123
  )
108
- events.length.should >= 6
109
- events.length.should <= 18
110
- (succeeded_awaited = events.select(&:awaited?)).should_not be_empty
111
- (succeeded_regular = events.reject(&:awaited?)).should_not be_empty
124
+ completed_events.length.should >= 6
125
+ completed_events.length.should <= 18
126
+ (succeeded_awaited = completed_events.select(&:awaited?)).should_not be_empty
127
+ (succeeded_regular = completed_events.reject(&:awaited?)).should_not be_empty
112
128
 
113
129
  # There may be in-flight hellos that don't complete, both
114
130
  # regular and awaited.
@@ -11,7 +11,7 @@ describe 'SDAM prose tests' do
11
11
  min_server_fcv '4.4'
12
12
  require_topology :single
13
13
 
14
- let(:subscriber) { EventSubscriber.new }
14
+ let(:subscriber) { Mrss::EventSubscriber.new }
15
15
 
16
16
  let(:client) do
17
17
  new_local_client(SpecConfig.instance.addresses,
@@ -4,6 +4,7 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe 'Server::Monitor' do
7
+ require_topology :single, :replica_set, :sharded
7
8
 
8
9
  let(:client) do
9
10
  new_local_client([ClusterConfig.instance.primary_address_str],
@@ -11,7 +11,7 @@ describe 'Server selector' do
11
11
  describe '#select_server' do
12
12
  # These tests operate on specific servers, and don't work in a multi
13
13
  # shard cluster where multiple servers are equally eligible
14
- require_no_multi_shard
14
+ require_no_multi_mongos
15
15
 
16
16
  let(:result) { selector.select_server(cluster) }
17
17
 
@@ -52,6 +52,8 @@ describe 'Server selector' do
52
52
  end
53
53
 
54
54
  context 'there is no known primary' do
55
+ require_topology :single, :replica_set, :sharded
56
+
55
57
  before do
56
58
  primary_server = client.cluster.next_primary
57
59
  client.close
@@ -59,15 +61,30 @@ describe 'Server selector' do
59
61
  primary_server.unknown!
60
62
  end
61
63
 
62
- it 'raises NoServerAvailable with a message explaining the situation' do
63
- expect do
64
- result
65
- end.to raise_error(Mongo::Error::NoServerAvailable, /The cluster is disconnected \(client may have been closed\)/)
64
+ context 'non-lb' do
65
+ require_topology :single, :replica_set, :sharded
66
+
67
+ it 'raises NoServerAvailable with a message explaining the situation' do
68
+ expect do
69
+ result
70
+ end.to raise_error(Mongo::Error::NoServerAvailable, /The cluster is disconnected \(client may have been closed\)/)
71
+ end
72
+ end
73
+
74
+ context 'lb' do
75
+ require_topology :load_balanced
76
+
77
+ it 'returns the load balancer' do
78
+ expect(result).to be_a(Mongo::Server)
79
+ result.should be_load_balancer
80
+ end
66
81
  end
67
82
  end
68
83
  end
69
84
 
70
85
  context 'monitoring thread is dead' do
86
+ require_topology :single, :replica_set, :sharded
87
+
71
88
  before do
72
89
  client.cluster.servers.each do |server|
73
90
  server.monitor.instance_variable_get('@thread').kill
@@ -33,6 +33,8 @@ describe 'Server' do
33
33
  end
34
34
 
35
35
  context 'unknown server in disconnected cluster' do
36
+ require_topology :single, :replica_set, :sharded
37
+
36
38
  before do
37
39
  client.close
38
40
  server.unknown!
@@ -144,7 +144,7 @@ describe 'SRV Monitoring' do
144
144
 
145
145
  context 'sharded cluster' do
146
146
  require_topology :sharded
147
- require_multi_shard
147
+ require_multi_mongos
148
148
 
149
149
  it 'updates topology via SRV records' do
150
150
 
@@ -32,7 +32,7 @@ describe 'Step down behavior' do
32
32
  end
33
33
  end
34
34
 
35
- let(:subscriber) { EventSubscriber.new }
35
+ let(:subscriber) { Mrss::EventSubscriber.new }
36
36
 
37
37
  let(:test_client) do
38
38
  authorized_client_without_any_retries.with(server_selection_timeout: 20).tap do |client|
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe 'Transaction pinning' do
7
+ let(:client) { authorized_client.with(max_pool_size: 4) }
8
+ let(:collection_name) { 'tx_pinning' }
9
+ let(:collection) { client[collection_name] }
10
+
11
+ before do
12
+ authorized_client[collection_name].insert_many([{test: 1}] * 200)
13
+ end
14
+
15
+ let(:server) { client.cluster.next_primary }
16
+
17
+ clean_slate
18
+
19
+ context 'non-lb' do
20
+ require_topology :sharded
21
+ min_server_fcv '4.2'
22
+
23
+ # Start several transactions, then complete each of them.
24
+ # Force each transaction to be on its own connection.
25
+
26
+ before do
27
+ 4.times do |i|
28
+ # Collections cannot be created inside transactions.
29
+ client["tx_pin_t#{i}"].drop
30
+ client["tx_pin_t#{i}"].create
31
+ end
32
+ end
33
+
34
+ it 'works' do
35
+ sessions = []
36
+ connections = []
37
+
38
+ 4.times do |i|
39
+ session = client.start_session
40
+ session.start_transaction
41
+ client["tx_pin_t#{i}"].insert_one({test: 1}, session: session)
42
+ session.pinned_server.should be_a(Mongo::Server)
43
+ sessions << session
44
+ connections << server.pool.check_out
45
+ end
46
+
47
+ server.pool.size.should == 4
48
+
49
+ connections.each do |c|
50
+ server.pool.check_in(c)
51
+ end
52
+
53
+ sessions.each_with_index do |session, i|
54
+ client["tx_pin_t#{i}"].insert_one({test: 2}, session: session)
55
+ session.commit_transaction
56
+ end
57
+ end
58
+ end
59
+
60
+ context 'lb' do
61
+ require_topology :load_balanced
62
+ min_server_fcv '4.2'
63
+
64
+ # In load-balanced topology, we cannot create new connections to a
65
+ # particular service.
66
+
67
+ context 'when no connection is available' do
68
+
69
+ before do
70
+ client["tx_pin"].drop
71
+ client["tx_pin"].create
72
+ end
73
+
74
+ it 'raises ConnectionCheckOutTimeout' do
75
+ session = client.start_session
76
+ session.start_transaction
77
+ client["tx_pin"].insert_one({test: 1}, session: session)
78
+ session.pinned_server.should be nil
79
+ session.pinned_service_id.should_not be nil
80
+
81
+ server.pool.size.should == 1
82
+ server.pool.clear
83
+ server.pool.size.should == 0
84
+
85
+ lambda do
86
+ client["tx_pin"].insert_one({test: 2}, session: session)
87
+ end.should raise_error(Mongo::Error::ConnectionCheckOutTimeout)
88
+ end
89
+ end
90
+
91
+ context 'when connection is available' do
92
+
93
+ it 'uses the available connection' do
94
+ sessions = []
95
+ connections = []
96
+
97
+ 4.times do |i|
98
+ session = client.start_session
99
+ session.start_transaction
100
+ client["tx_pin_t#{i}"].insert_one({test: 1}, session: session)
101
+ session.pinned_server.should be nil
102
+ session.pinned_service_id.should_not be nil
103
+ sessions << session
104
+ connections << server.pool.check_out
105
+ end
106
+
107
+ server.pool.size.should == 4
108
+
109
+ connections.each do |c|
110
+ server.pool.check_in(c)
111
+ end
112
+
113
+ sessions.each_with_index do |session, i|
114
+ client["tx_pin_t#{i}"].insert_one({test: 2}, session: session)
115
+ session.commit_transaction
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -66,4 +66,49 @@ describe 'Versioned API examples' do
66
66
  # Do not leak clients.
67
67
  client.close
68
68
  end
69
+
70
+ it "Versioned API Strict Migration Example" do
71
+ client = Mongo::Client.new(uri_string, server_api: {version: "1", strict: true})
72
+ client[:sales].drop
73
+
74
+ # Start Versioned API Example 5
75
+
76
+ client[:sales].insert_many([
77
+ { _id: 1, item: "abc", price: 10, quantity: 2, date: DateTime.parse("2021-01-01T08:00:00Z") },
78
+ { _id: 2, item: "jkl", price: 20, quantity: 1, date: DateTime.parse("2021-02-03T09:00:00Z") },
79
+ { _id: 3, item: "xyz", price: 5, quantity: 5, date: DateTime.parse("2021-02-03T09:05:00Z") },
80
+ { _id: 4, item: "abc", price: 10, quantity: 10, date: DateTime.parse("2021-02-15T08:00:00Z") },
81
+ { _id: 5, item: "xyz", price: 5, quantity: 10, date: DateTime.parse("2021-02-15T09:05:00Z") },
82
+ { _id: 6, item: "xyz", price: 5, quantity: 5, date: DateTime.parse("2021-02-15T12:05:10Z") },
83
+ { _id: 7, item: "xyz", price: 5, quantity: 10, date: DateTime.parse("2021-02-15T14:12:12Z") },
84
+ { _id: 8, item: "abc", price: 10, quantity: 5, date: DateTime.parse("2021-03-16T20:20:13Z") }
85
+ ])
86
+
87
+ # End Versioned API Example 5
88
+
89
+ expect do
90
+ client.database.command(count: :sales)
91
+ end.to raise_error(Mongo::Error::OperationFailure)
92
+
93
+ # Start Versioned API Example 6
94
+
95
+ # Mongo::Error::OperationFailure:
96
+ # [323:APIStrictError]: Provided apiStrict:true, but the command count is not in API Version 1. Information on supported commands and migrations in API Version 1 can be found at https://dochub.mongodb.org/core/manual-versioned-api
97
+
98
+ # End Versioned API Example 6
99
+
100
+ # Start Versioned API Example 7
101
+
102
+ client[:sales].count_documents
103
+
104
+ # End Versioned API Example 7
105
+
106
+ # Start Versioned API Example 8
107
+
108
+ # 8
109
+
110
+ # End Versioned API Example 8
111
+ # Do not leak clients.
112
+ client.close
113
+ end
69
114
  end
@@ -38,7 +38,7 @@ describe 'X.509 auth integration tests' do
38
38
  "C=US,ST=New York,L=New York City,O=MongoDB,OU=x509,CN=localhost".freeze
39
39
  end
40
40
 
41
- let(:subscriber) { EventSubscriber.new }
41
+ let(:subscriber) { Mrss::EventSubscriber.new }
42
42
 
43
43
  shared_examples 'authenticates successfully' do
44
44
  it 'authenticates successfully' do
@@ -16,7 +16,6 @@ RETRYABLE_READS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/retryable_read
16
16
  COMMAND_MONITORING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/command_monitoring/**/*.yml").sort
17
17
  CONNECTION_STRING_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/connection_string/*.yml").sort
18
18
  URI_OPTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/uri_options/*.yml").sort
19
- DNS_SEEDLIST_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/dns_seedlist_discovery/*.yml").sort
20
19
  GRIDFS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/gridfs/*.yml").sort
21
20
  TRANSACTIONS_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions/*.yml").sort
22
21
  TRANSACTIONS_API_TESTS = Dir.glob("#{CURRENT_PATH}/spec_tests/data/transactions_api/*.yml").sort
@@ -78,7 +77,7 @@ end
78
77
 
79
78
  require 'mrss/lite_constraints'
80
79
  require 'support/matchers'
81
- require 'support/event_subscriber'
80
+ require 'mrss/event_subscriber'
82
81
  require 'support/common_shortcuts'
83
82
  require 'support/client_registry'
84
83
  require 'support/client_registry_macros'
@@ -28,6 +28,7 @@ describe Mongo::Address::Unix do
28
28
  end
29
29
 
30
30
  describe '#socket' do
31
+ require_unix_socket
31
32
 
32
33
  let(:address) do
33
34
  "/tmp/mongodb-#{SpecConfig.instance.any_port}.sock"
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'support/shared/auth_context'
5
6
 
6
7
  describe Mongo::Auth::CR do
7
8
 
@@ -9,9 +10,7 @@ describe Mongo::Auth::CR do
9
10
  authorized_client.cluster.next_primary
10
11
  end
11
12
 
12
- let(:connection) do
13
- Mongo::Server::Connection.new(server, SpecConfig.instance.test_options)
14
- end
13
+ include_context 'auth unit tests'
15
14
 
16
15
  describe '#login' do
17
16
 
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'support/shared/auth_context'
5
6
 
6
7
  describe Mongo::Auth::LDAP do
7
8
 
@@ -9,9 +10,7 @@ describe Mongo::Auth::LDAP do
9
10
  authorized_client.cluster.next_primary
10
11
  end
11
12
 
12
- let(:connection) do
13
- Mongo::Server::Connection.new(server, SpecConfig.instance.test_options)
14
- end
13
+ include_context 'auth unit tests'
15
14
 
16
15
  let(:user) do
17
16
  Mongo::Auth::User.new(
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'support/shared/auth_context'
5
6
 
6
7
  describe Mongo::Auth::Scram do
7
8
  require_no_external_user
@@ -10,9 +11,7 @@ describe Mongo::Auth::Scram do
10
11
  authorized_client.cluster.next_primary
11
12
  end
12
13
 
13
- let(:connection) do
14
- Mongo::Server::Connection.new(server, SpecConfig.instance.monitoring_options)
15
- end
14
+ include_context 'auth unit tests'
16
15
 
17
16
  let(:cache_mod) { Mongo::Auth::CredentialCache }
18
17
 
@@ -23,7 +23,7 @@ describe Mongo::Auth::User::View do
23
23
  shared_context 'testing write concern' do
24
24
 
25
25
  let(:subscriber) do
26
- EventSubscriber.new
26
+ Mrss::EventSubscriber.new
27
27
  end
28
28
 
29
29
  let(:client) do
@@ -2,6 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  require 'spec_helper'
5
+ require 'support/shared/auth_context'
5
6
 
6
7
  describe Mongo::Auth::X509 do
7
8
 
@@ -9,9 +10,7 @@ describe Mongo::Auth::X509 do
9
10
  authorized_client.cluster.next_primary
10
11
  end
11
12
 
12
- let(:connection) do
13
- Mongo::Server::Connection.new(server, SpecConfig.instance.test_options)
14
- end
13
+ include_context 'auth unit tests'
15
14
 
16
15
  let(:user) do
17
16
  Mongo::Auth::User.new(database: '$external')
@@ -1424,7 +1424,7 @@ describe Mongo::BulkWrite do
1424
1424
 
1425
1425
  # In a multi-sharded cluster, the write seems to go to a
1426
1426
  # different shard from the read
1427
- require_no_multi_shard
1427
+ require_no_multi_mongos
1428
1428
 
1429
1429
  let(:extra_options) do
1430
1430
  { write_concern: { w: 0 } }
@@ -2103,10 +2103,10 @@ describe Mongo::BulkWrite do
2103
2103
 
2104
2104
  # In a multi-shard cluster, retries may go to a different server
2105
2105
  # than original command which these tests are not prepared to handle
2106
- require_no_multi_shard
2106
+ require_no_multi_mongos
2107
2107
 
2108
2108
 
2109
- let(:subscriber) { EventSubscriber.new }
2109
+ let(:subscriber) { Mrss::EventSubscriber.new }
2110
2110
 
2111
2111
  let(:client) do
2112
2112
  authorized_client_with_retry_writes.tap do |client|