mongo 2.15.0 → 2.16.1

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 (332) 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 +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 +10 -1
  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/connection_spec.rb +22 -0
  198. data/spec/mongo/server/monitor_spec.rb +4 -3
  199. data/spec/mongo/server/push_monitor_spec.rb +101 -0
  200. data/spec/mongo/session/session_pool_spec.rb +42 -10
  201. data/spec/mongo/session_transaction_spec.rb +15 -30
  202. data/spec/mongo/socket/unix_spec.rb +1 -0
  203. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  204. data/spec/runners/change_streams/test.rb +1 -1
  205. data/spec/runners/cmap.rb +1 -1
  206. data/spec/runners/connection_string.rb +7 -3
  207. data/spec/runners/crud/operation.rb +5 -3
  208. data/spec/runners/crud/requirement.rb +1 -0
  209. data/spec/runners/crud.rb +1 -1
  210. data/spec/runners/sdam.rb +2 -1
  211. data/spec/runners/transactions/test.rb +2 -2
  212. data/spec/runners/unified/assertions.rb +2 -3
  213. data/spec/runners/unified/event_subscriber.rb +2 -2
  214. data/spec/runners/unified/support_operations.rb +10 -2
  215. data/spec/runners/unified/test.rb +3 -0
  216. data/spec/runners/unified.rb +1 -1
  217. data/spec/shared/lib/mrss/cluster_config.rb +6 -1
  218. data/spec/shared/lib/mrss/constraints.rb +11 -5
  219. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  220. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  221. data/spec/shared/share/Dockerfile.erb +5 -4
  222. data/spec/shared/shlib/server.sh +70 -20
  223. data/spec/spec_tests/change_streams_spec.rb +1 -1
  224. data/spec/spec_tests/cmap_spec.rb +4 -1
  225. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  226. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  227. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  228. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  229. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  230. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  231. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  232. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  233. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  234. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  235. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  236. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  237. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  238. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  239. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  240. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  241. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  242. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  243. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  244. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  245. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  246. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  247. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  248. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  249. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  250. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  251. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  252. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  253. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  254. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  255. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  256. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  257. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  258. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  259. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  260. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  261. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  262. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  263. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  264. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  265. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  266. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  267. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  268. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  269. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  270. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  271. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  272. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  273. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  274. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  275. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  276. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  277. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  278. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  279. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  280. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  281. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  282. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  283. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  284. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  285. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  286. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  287. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  288. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  289. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  290. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  291. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  292. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  293. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  294. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  295. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  296. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  297. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  298. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  299. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  300. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  301. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  302. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  303. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  304. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  305. data/spec/spec_tests/sdam_spec.rb +1 -1
  306. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  307. data/spec/spec_tests/uri_options_spec.rb +4 -4
  308. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  309. data/spec/stress/push_monitor_close_spec.rb +44 -0
  310. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  311. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  312. data/spec/support/common_shortcuts.rb +2 -3
  313. data/spec/support/matchers.rb +13 -0
  314. data/spec/support/shared/auth_context.rb +16 -0
  315. data/spec/support/shared/session.rb +2 -2
  316. data/spec/support/spec_config.rb +10 -11
  317. data/spec/support/using_hash.rb +31 -0
  318. data/spec/support/utils.rb +1 -1
  319. data.tar.gz.sig +0 -0
  320. metadata +1077 -1029
  321. metadata.gz.sig +0 -0
  322. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  323. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  324. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  325. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  326. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  327. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  328. data/lib/mongo/server/context.rb +0 -72
  329. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  330. data/spec/runners/unified/using_hash.rb +0 -34
  331. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  332. data/spec/support/event_subscriber.rb +0 -221
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Mongo::Server::PushMonitor do
7
+ before(:all) do
8
+ ClientRegistry.instance.close_all_clients
9
+ end
10
+
11
+ let(:address) do
12
+ default_address
13
+ end
14
+
15
+ let(:listeners) do
16
+ Mongo::Event::Listeners.new
17
+ end
18
+
19
+ let(:monitor_options) do
20
+ {}
21
+ end
22
+
23
+ let(:monitor_app_metadata) do
24
+ Mongo::Server::Monitor::AppMetadata.new(
25
+ server_api: SpecConfig.instance.ruby_options[:server_api],
26
+ )
27
+ end
28
+
29
+ let(:cluster) do
30
+ double('cluster').tap do |cluster|
31
+ allow(cluster).to receive(:run_sdam_flow)
32
+ allow(cluster).to receive(:heartbeat_interval).and_return(1000)
33
+ end
34
+ end
35
+
36
+ let(:server) do
37
+ Mongo::Server.new(address, cluster, Mongo::Monitoring.new, listeners,
38
+ monitoring_io: false)
39
+ end
40
+
41
+ let(:monitor) do
42
+ register_background_thread_object(
43
+ Mongo::Server::Monitor.new(server, listeners, Mongo::Monitoring.new,
44
+ SpecConfig.instance.test_options.merge(cluster: cluster).merge(monitor_options).update(
45
+ app_metadata: monitor_app_metadata,
46
+ push_monitor_app_metadata: monitor_app_metadata))
47
+ )
48
+ end
49
+
50
+ let(:topology_version) do
51
+ Mongo::TopologyVersion.new('processId' => BSON::ObjectId.new, 'counter' => 1)
52
+ end
53
+
54
+ let(:check_document) do
55
+ {hello: 1}
56
+ end
57
+
58
+ let(:push_monitor) do
59
+ described_class.new(monitor, topology_version, monitor.monitoring,
60
+ **monitor.options.merge(check_document: check_document))
61
+ end
62
+
63
+ describe '#do_work' do
64
+ it 'works' do
65
+ lambda do
66
+ push_monitor.do_work
67
+ end.should_not raise_error
68
+ end
69
+
70
+ context 'network error during check' do
71
+ it 'does not propagate the exception' do
72
+ push_monitor
73
+
74
+ expect(Socket).to receive(:getaddrinfo).and_raise(SocketError.new('Test exception'))
75
+ lambda do
76
+ push_monitor.do_work
77
+ end.should_not raise_error
78
+ end
79
+
80
+ it 'throttles checks' do
81
+ push_monitor
82
+
83
+ start = Mongo::Utils.monotonic_time
84
+
85
+ expect(Socket).to receive(:getaddrinfo).and_raise(SocketError.new('Test exception'))
86
+ lambda do
87
+ push_monitor.do_work
88
+ end.should_not raise_error
89
+
90
+ expect(Socket).to receive(:getaddrinfo).and_raise(SocketError.new('Test exception'))
91
+ lambda do
92
+ push_monitor.do_work
93
+ end.should_not raise_error
94
+
95
+ elapsed = Mongo::Utils.monotonic_time - start
96
+ elapsed.should > 0.5
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
 
6
6
  describe Mongo::Session::SessionPool do
7
7
  min_server_fcv '3.6'
8
- require_topology :replica_set, :sharded
8
+ require_topology :replica_set, :sharded, :load_balanced
9
9
  clean_slate_for_all
10
10
 
11
11
  let(:cluster) do
@@ -113,10 +113,26 @@ describe Mongo::Session::SessionPool do
113
113
  pool.checkout
114
114
  end
115
115
 
116
- it 'disposes of the old session and returns a new one' do
117
- expect(checked_out_session).not_to be(old_session_a)
118
- expect(checked_out_session).not_to be(old_session_b)
119
- expect(pool.instance_variable_get(:@queue)).to be_empty
116
+ context "in non load-balanced topology" do
117
+ require_topology :replica_set, :sharded
118
+
119
+ it 'disposes of the old session and returns a new one' do
120
+ old_sessions = [old_session_a, old_session_b]
121
+ expect(old_sessions).not_to include(pool.checkout)
122
+ expect(old_sessions).not_to include(pool.checkout)
123
+ expect(pool.instance_variable_get(:@queue)).to be_empty
124
+ end
125
+ end
126
+
127
+ context "in load-balanced topology" do
128
+ require_topology :load_balanced
129
+
130
+ it 'doed not dispose of the old session' do
131
+ old_sessions = [old_session_a, old_session_b]
132
+ expect(old_sessions).to include(checked_out_session)
133
+ expect(old_sessions).to include(checked_out_session)
134
+ expect(pool.instance_variable_get(:@queue)).to be_empty
135
+ end
120
136
  end
121
137
  end
122
138
  end
@@ -138,10 +154,26 @@ describe Mongo::Session::SessionPool do
138
154
  pool.checkin(old_session_b)
139
155
  end
140
156
 
141
- it 'disposes of the old sessions instead of adding them to the pool' do
142
- expect(pool.checkout).not_to be(old_session_a)
143
- expect(pool.checkout).not_to be(old_session_b)
144
- expect(pool.instance_variable_get(:@queue)).to be_empty
157
+ context "in non load-balanced topology" do
158
+ require_topology :replica_set, :sharded
159
+
160
+ it 'disposes of the old sessions instead of adding them to the pool' do
161
+ old_sessions = [old_session_a, old_session_b]
162
+ expect(old_sessions).not_to include(pool.checkout)
163
+ expect(old_sessions).not_to include(pool.checkout)
164
+ expect(pool.instance_variable_get(:@queue)).to be_empty
165
+ end
166
+ end
167
+
168
+ context "in load-balanced topology" do
169
+ require_topology :load_balanced
170
+
171
+ it 'does not dispose of the old sessions' do
172
+ old_sessions = [old_session_a, old_session_b]
173
+ expect(old_sessions).to include(pool.checkout)
174
+ expect(old_sessions).to include(pool.checkout)
175
+ expect(pool.instance_variable_get(:@queue)).to be_empty
176
+ end
145
177
  end
146
178
  end
147
179
  end
@@ -160,7 +192,7 @@ describe Mongo::Session::SessionPool do
160
192
  pool.checkout
161
193
  end
162
194
 
163
- let(:subscriber) { EventSubscriber.new }
195
+ let(:subscriber) { Mrss::EventSubscriber.new }
164
196
 
165
197
  let(:client) do
166
198
  authorized_client.tap do |client|
@@ -117,25 +117,15 @@ describe Mongo::Session do
117
117
  max_example_run_time 7
118
118
 
119
119
  it 'times out' do
120
- warp = Mongo::Utils.monotonic_time + 200
121
- entered = false
120
+ start = Mongo::Utils.monotonic_time
122
121
 
123
- Thread.new do
124
- until entered
125
- sleep 0.1
126
- end
127
- allow(Mongo::Utils).to receive(:monotonic_time).and_return(warp)
128
- end
122
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start)
123
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start + 1)
124
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start + 2)
125
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start + 200)
129
126
 
130
127
  expect do
131
128
  session.with_transaction do
132
- entered = true
133
-
134
- # This sleep is to give the interrupting thread a chance to run,
135
- # it significantly affects how much time is burned in this
136
- # looping thread
137
- sleep 0.1
138
-
139
129
  exc = Mongo::Error::OperationFailure.new('timeout test')
140
130
  exc.add_label('TransientTransactionError')
141
131
  raise exc
@@ -148,21 +138,23 @@ describe Mongo::Session do
148
138
  context "timeout with commit raising with #{label}" do
149
139
  max_example_run_time 7
150
140
 
141
+ # JRuby seems to burn through the monotonic time expectations
142
+ # very quickly and the retries of the transaction get the original
143
+ # time which causes the transaction to be stuck there.
144
+ fails_on_jruby
145
+
151
146
  before do
152
147
  # create collection if it does not exist
153
148
  collection.insert_one(a: 1)
154
149
  end
155
150
 
156
- it 'times out' do
157
- warp = Mongo::Utils.monotonic_time + 200
158
- entered = false
151
+ it 'times out', retry: 3 do
152
+ start = Mongo::Utils.monotonic_time
159
153
 
160
- Thread.new do
161
- until entered
162
- sleep 0.1
163
- end
164
- allow(Mongo::Utils).to receive(:monotonic_time).and_return(warp)
154
+ 10.times do |i|
155
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start + i)
165
156
  end
157
+ expect(Mongo::Utils).to receive(:monotonic_time).ordered.and_return(start + 200)
166
158
 
167
159
  exc = Mongo::Error::OperationFailure.new('timeout test')
168
160
  exc.add_label(label)
@@ -171,13 +163,6 @@ describe Mongo::Session do
171
163
 
172
164
  expect do
173
165
  session.with_transaction do
174
- entered = true
175
-
176
- # This sleep is to give the interrupting thread a chance to run,
177
- # it significantly affects how much time is burned in this
178
- # looping thread
179
- sleep 0.1
180
-
181
166
  collection.insert_one(a: 2)
182
167
  end
183
168
  end.to raise_error(Mongo::Error::OperationFailure, 'timeout test')
@@ -4,6 +4,7 @@
4
4
  require 'spec_helper'
5
5
 
6
6
  describe Mongo::Socket::Unix do
7
+ require_unix_socket
7
8
 
8
9
  let(:path) { "/tmp/mongodb-#{SpecConfig.instance.any_port}.sock" }
9
10
 
@@ -267,19 +267,52 @@ describe Mongo::URI do
267
267
 
268
268
  context 'connect' do
269
269
 
270
- let(:string) { 'mongodb://example.com/?connect=sharded' }
270
+ let(:client) { new_local_client_nmio(string) }
271
271
 
272
- it_behaves_like 'parses successfully'
272
+ shared_examples 'raises an error when client is created' do
273
+ it 'raises an error when client is created' do
274
+ lambda do
275
+ client
276
+ end.should raise_error(ArgumentError, /Invalid :connect option value/)
277
+ end
278
+ end
273
279
 
274
- it 'is a symbol' do
275
- expect(uri.uri_options[:connect]).to eq(:sharded)
280
+ %i(direct sharded replica_set load_balanced).each do |value|
281
+ context "#{value}" do
282
+ let(:string) { "mongodb://example.com/?connect=#{value}" }
283
+
284
+ it_behaves_like 'parses successfully'
285
+
286
+ it 'is a symbol' do
287
+ expect(uri.uri_options[:connect]).to eq(value)
288
+ end
289
+ end
290
+ end
291
+
292
+ %i(replica-set load-balanced).each do |value|
293
+ context "#{value}" do
294
+ let(:string) { "mongodb://example.com/?connect=#{value}" }
295
+
296
+ it_behaves_like 'parses successfully'
297
+
298
+ it 'is a symbol' do
299
+ expect(uri.uri_options[:connect]).to eq(value)
300
+ end
301
+
302
+ include_examples 'raises an error when client is created'
303
+ end
276
304
  end
277
305
 
278
306
  context 'invalid value' do
279
307
  let(:string) { 'mongodb://example.com/?connect=bogus' }
280
308
 
281
- # should raise an error
282
309
  it_behaves_like 'parses successfully'
310
+
311
+ it 'is a symbol' do
312
+ expect(uri.uri_options[:connect]).to eq(:bogus)
313
+ end
314
+
315
+ include_examples 'raises an error when client is created'
283
316
  end
284
317
  end
285
318
 
@@ -89,7 +89,7 @@ module Mongo
89
89
 
90
90
  setup_fail_point(client)
91
91
 
92
- @subscriber = EventSubscriber.new
92
+ @subscriber = Mrss::EventSubscriber.new
93
93
  client.subscribe(Mongo::Monitoring::COMMAND, @subscriber)
94
94
 
95
95
  @target = case @target_type
data/spec/runners/cmap.rb CHANGED
@@ -33,7 +33,7 @@ module Mongo
33
33
  # @return [ Mongo::ConnectionPool ] pool The connection pool to use for operations.
34
34
  attr_reader :pool
35
35
 
36
- # @return [ EventSubscriber ] subscriber The subscriber receiving the CMAP events.
36
+ # @return [ Mrss::EventSubscriber ] subscriber The subscriber receiving the CMAP events.
37
37
  attr_reader :subscriber
38
38
 
39
39
  # Instantiate the new spec.
@@ -147,10 +147,14 @@ module Mongo
147
147
  end
148
148
  end
149
149
 
150
- def options
150
+ def expected_options
151
151
  @spec['options']
152
152
  end
153
153
 
154
+ def non_uri_options
155
+ @spec['parsed_options']
156
+ end
157
+
154
158
  def client
155
159
  @client ||= ClientRegistry.instance.new_local_client(@spec['uri'], monitoring_io: false)
156
160
  rescue Mongo::Error::LintError => e
@@ -307,14 +311,14 @@ def define_connection_string_spec_tests(test_paths, spec_cls = Mongo::Connection
307
311
  expect(test.client).to match_auth(test)
308
312
  end
309
313
 
310
- if test.options
314
+ if test.expected_options
311
315
  it 'creates a client with the correct options' do
312
316
  mapped = Mongo::URI::OptionsMapper.new.ruby_to_smc(test.client.options)
313
317
  # Connection string spec tests do not use canonical URI option names
314
318
  actual = Utils.downcase_keys(mapped)
315
319
  actual.delete('authsource')
316
320
  expected = Mongo::ConnectionString.adjust_expected_mongo_client_options(
317
- test.options,
321
+ test.expected_options,
318
322
  )
319
323
  actual.should == expected
320
324
  end
@@ -376,9 +376,11 @@ module Mongo
376
376
  arguments.merge(arguments['options'] || {}).each do |spec_k, v|
377
377
  ruby_k = ::Utils.underscore(spec_k).to_sym
378
378
 
379
- if v.is_a?(Hash) && v['$numberLong']
380
- v = v['$numberLong'].to_i
381
- end
379
+ ruby_k = {
380
+ min: :min_value,
381
+ max: :max_value,
382
+ show_record_id: :show_disk_loc
383
+ }[ruby_k] || ruby_k
382
384
 
383
385
  if respond_to?("transform_#{ruby_k}", true)
384
386
  v = send("transform_#{ruby_k}", v)
@@ -27,6 +27,7 @@ module Mongo
27
27
  'single' => :single,
28
28
  'sharded' => :sharded,
29
29
  'sharded-replicaset' => :sharded,
30
+ 'load-balanced' => :load_balanced,
30
31
  }[topology].tap do |v|
31
32
  unless v
32
33
  raise "Unknown topology #{topology}"
data/spec/runners/crud.rb CHANGED
@@ -96,7 +96,7 @@ def define_crud_spec_test_examples(spec, req = nil, &block)
96
96
  end
97
97
 
98
98
  let(:event_subscriber) do
99
- EventSubscriber.new
99
+ Mrss::EventSubscriber.new
100
100
  end
101
101
 
102
102
  let(:verifier) { Mongo::CRUD::Verifier.new(test) }
data/spec/runners/sdam.rb CHANGED
@@ -37,6 +37,7 @@ module Mongo
37
37
  when 'PossiblePrimary' then server.unknown?
38
38
  when 'RSGhost' then server.ghost?
39
39
  when 'RSOther' then server.other?
40
+ when 'LoadBalancer' then server.load_balancer?
40
41
  else
41
42
  raise "Unknown type #{type}"
42
43
  end
@@ -252,7 +253,7 @@ module Mongo
252
253
  'server_opening_event' => Mongo::Monitoring::Event::ServerOpening,
253
254
  'topology_description_changed_event' => Mongo::Monitoring::Event::TopologyChanged,
254
255
  'topology_opening_event' => Mongo::Monitoring::Event::TopologyOpening
255
- }
256
+ }.freeze
256
257
 
257
258
  attr_reader :name
258
259
  attr_reader :data
@@ -141,11 +141,11 @@ module Mongo
141
141
  end
142
142
 
143
143
  def command_subscriber
144
- @command_subscriber ||= EventSubscriber.new
144
+ @command_subscriber ||= Mrss::EventSubscriber.new
145
145
  end
146
146
 
147
147
  def sdam_subscriber
148
- @sdam_subscriber ||= EventSubscriber.new(name: 'sdam subscriber')
148
+ @sdam_subscriber ||= Mrss::EventSubscriber.new(name: 'sdam subscriber')
149
149
  end
150
150
 
151
151
  # Run the test.
@@ -4,6 +4,7 @@
4
4
  module Unified
5
5
 
6
6
  module Assertions
7
+ include RSpec::Matchers
7
8
 
8
9
  def assert_result_matches(actual, expected)
9
10
  if Hash === expected
@@ -86,8 +87,6 @@ module Unified
86
87
 
87
88
  def assert_document_matches(actual, expected, msg)
88
89
  unless actual == expected
89
- p actual
90
- p expected
91
90
  raise Error::ResultMismatch, "#{msg} does not match"
92
91
  end
93
92
  end
@@ -130,7 +129,7 @@ module Unified
130
129
  expected_name = expected_name.sub(/Event$/, '').sub(/^(.)/) { $1.upcase }
131
130
  assert_eq(actual.class.name.sub(/.*::/, ''), expected_name, 'Event name does not match')
132
131
  if spec.use('hasServiceId')
133
- # TODO: RUBY-2654
132
+ actual.service_id.should_not be nil
134
133
  end
135
134
  if db_name = spec.use('databaseName')
136
135
  assert_eq(actual.database_name, db_name, 'Database names differ')
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
3
 
4
- require 'support/event_subscriber'
4
+ require 'mrss/event_subscriber'
5
5
 
6
6
  module Unified
7
7
 
8
- class EventSubscriber < ::EventSubscriber
8
+ class EventSubscriber < Mrss::EventSubscriber
9
9
  def ignore_commands(command_names)
10
10
  @ignore_commands = command_names
11
11
  end
@@ -208,12 +208,20 @@ module Unified
208
208
  else
209
209
  raise
210
210
  end
211
+ rescue Interrupt
212
+ raise
211
213
  rescue => e
212
- if store_errors
214
+ if store_failures
215
+ STDERR.puts "Error: #{e.class}: #{e} (reporting as failure)"
216
+ entities.get(:failure_list, store_failures) << {
217
+ error: "#{e.class}: #{e}",
218
+ time: Time.now.to_f,
219
+ }
220
+ elsif store_errors
213
221
  STDERR.puts "Error: #{e.class}: #{e}"
214
222
  entities.get(:error_list, store_errors) << {
215
223
  error: "#{e.class}: #{e}",
216
- observedAt: Time.now.to_f,
224
+ time: Time.now.to_f,
217
225
  }
218
226
  else
219
227
  raise
@@ -165,6 +165,9 @@ module Unified
165
165
  database = entities.get(:database, spec.use!('database'))
166
166
  # TODO verify
167
167
  opts = Utils.snakeize_hash(spec.use('collectionOptions') || {})
168
+ if opts.key?(:read_preference)
169
+ opts[:read] = opts.delete(:read_preference)
170
+ end
168
171
  database[spec.use!('collectionName'), opts]
169
172
  when 'bucket'
170
173
  database = entities.get(:database, spec.use!('database'))
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
  # encoding: utf-8
3
3
 
4
+ require 'support/using_hash'
4
5
  require 'runners/unified/error'
5
6
  require 'runners/unified/entity_map'
6
7
  require 'runners/unified/event_subscriber'
7
8
  require 'runners/unified/test'
8
9
  require 'runners/unified/test_group'
9
- require 'runners/unified/using_hash'
10
10
 
11
11
  def define_unified_spec_tests(base_path, paths, expect_failure: false)
12
12
  paths.each do |path|
@@ -209,7 +209,12 @@ module Mrss
209
209
  @server_version = build_info['version']
210
210
  @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
211
211
 
212
- @server_parameters = client.use(:admin).command(getParameter: '*').first
212
+ @server_parameters = begin
213
+ client.use(:admin).command(getParameter: '*').first
214
+ rescue => e
215
+ STDERR.puts("WARNING: Failed to obtain server parameters: #{e.class}: #{e.message}")
216
+ {}
217
+ end
213
218
 
214
219
  if !sharded_ish? && short_server_version >= '3.4'
215
220
  rv = @server_parameters['featureCompatibilityVersion']
@@ -257,10 +257,14 @@ module Mrss
257
257
  end
258
258
  end
259
259
 
260
- def require_multi_shard
260
+ def require_multi_mongos
261
261
  before(:all) do
262
262
  if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length == 1
263
- skip 'Test requires a minimum of two shards if run in sharded topology'
263
+ skip 'Test requires a minimum of two mongoses if run in sharded topology'
264
+ end
265
+
266
+ if ClusterConfig.instance.topology == :load_balanced && SpecConfig.instance.single_mongos?
267
+ skip 'Test requires a minimum of two mongoses if run in load-balanced topology'
264
268
  end
265
269
  end
266
270
  end
@@ -273,17 +277,19 @@ module Mrss
273
277
  #
274
278
  # In load-balanced topology, the same problem can happen when there is
275
279
  # more than one mongos behind the load balancer.
276
- def require_no_multi_shard
280
+ def require_no_multi_mongos
277
281
  before(:all) do
278
282
  if ClusterConfig.instance.topology == :sharded && SpecConfig.instance.addresses.length > 1
279
- skip 'Test requires a single shard if run in sharded topology'
283
+ skip 'Test requires a single mongos if run in sharded topology'
280
284
  end
281
285
  if ClusterConfig.instance.topology == :load_balanced && !SpecConfig.instance.single_mongos?
282
- skip 'Test requires a minimum of two shards if run in sharded topology'
286
+ skip 'Test requires a single mongos, as indicated by SINGLE_MONGOS=1 environment variable, if run in load-balanced topology'
283
287
  end
284
288
  end
285
289
  end
286
290
 
291
+ alias :require_no_multi_shard :require_no_multi_mongos
292
+
287
293
  def require_wired_tiger
288
294
  before(:all) do
289
295
  # Storage detection fails for serverless instances. However, it is safe to