mongo 2.15.0 → 2.16.1

Sign up to get free protection for your applications and to get access to all the features.
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