mongo 2.15.0 → 2.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +1 -1
  4. data/lib/mongo/auth/aws/request.rb +0 -1
  5. data/lib/mongo/bulk_write.rb +2 -2
  6. data/lib/mongo/client.rb +49 -5
  7. data/lib/mongo/cluster/periodic_executor.rb +4 -3
  8. data/lib/mongo/cluster/reapers/cursor_reaper.rb +76 -43
  9. data/lib/mongo/cluster/sdam_flow.rb +9 -3
  10. data/lib/mongo/cluster/topology/base.rb +13 -9
  11. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  12. data/lib/mongo/cluster/topology.rb +28 -8
  13. data/lib/mongo/cluster.rb +136 -51
  14. data/lib/mongo/collection/view/aggregation.rb +63 -23
  15. data/lib/mongo/collection/view/builder/aggregation.rb +16 -17
  16. data/lib/mongo/collection/view/builder/map_reduce.rb +12 -49
  17. data/lib/mongo/collection/view/builder.rb +0 -4
  18. data/lib/mongo/collection/view/change_stream.rb +7 -3
  19. data/lib/mongo/collection/view/iterable.rb +60 -27
  20. data/lib/mongo/collection/view/map_reduce.rb +41 -15
  21. data/lib/mongo/collection/view/readable.rb +84 -52
  22. data/lib/mongo/collection/view/writable.rb +201 -175
  23. data/lib/mongo/collection/view.rb +15 -21
  24. data/lib/mongo/collection.rb +34 -14
  25. data/lib/mongo/cursor/kill_spec.rb +38 -0
  26. data/lib/mongo/cursor.rb +72 -31
  27. data/lib/mongo/database/view.rb +5 -3
  28. data/lib/mongo/database.rb +6 -6
  29. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  30. data/lib/mongo/error/missing_service_id.rb +26 -0
  31. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  32. data/lib/mongo/error/notable.rb +7 -0
  33. data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
  34. data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
  35. data/lib/mongo/error.rb +5 -0
  36. data/lib/mongo/grid/fs_bucket.rb +21 -2
  37. data/lib/mongo/id.rb +7 -5
  38. data/lib/mongo/index/view.rb +22 -41
  39. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
  40. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  41. data/lib/mongo/monitoring/event/command_started.rb +2 -0
  42. data/lib/mongo/monitoring/publishable.rb +2 -2
  43. data/lib/mongo/operation/aggregate/command.rb +8 -0
  44. data/lib/mongo/operation/context.rb +19 -1
  45. data/lib/mongo/operation/count/command.rb +6 -0
  46. data/lib/mongo/operation/count/op_msg.rb +6 -0
  47. data/lib/mongo/operation/create/command.rb +7 -1
  48. data/lib/mongo/operation/create/op_msg.rb +7 -0
  49. data/lib/mongo/operation/create_index/command.rb +17 -1
  50. data/lib/mongo/operation/create_index/op_msg.rb +17 -4
  51. data/lib/mongo/operation/delete/command.rb +6 -3
  52. data/lib/mongo/operation/delete/legacy.rb +9 -2
  53. data/lib/mongo/operation/delete/op_msg.rb +9 -1
  54. data/lib/mongo/operation/distinct/command.rb +6 -0
  55. data/lib/mongo/operation/distinct/op_msg.rb +7 -0
  56. data/lib/mongo/operation/explain/command.rb +13 -1
  57. data/lib/mongo/operation/explain/legacy.rb +12 -5
  58. data/lib/mongo/operation/explain/op_msg.rb +9 -1
  59. data/lib/mongo/operation/find/builder/command.rb +111 -0
  60. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
  61. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  62. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
  63. data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
  64. data/lib/mongo/operation/find/command.rb +9 -0
  65. data/lib/mongo/operation/find/legacy.rb +10 -1
  66. data/lib/mongo/operation/find/op_msg.rb +12 -0
  67. data/lib/mongo/operation/find.rb +1 -0
  68. data/lib/mongo/operation/get_more/command.rb +1 -0
  69. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  70. data/lib/mongo/operation/get_more/op_msg.rb +1 -0
  71. data/lib/mongo/operation/get_more.rb +1 -0
  72. data/lib/mongo/operation/kill_cursors/command.rb +8 -0
  73. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  74. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -1
  75. data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
  76. data/lib/mongo/operation/kill_cursors.rb +1 -0
  77. data/lib/mongo/operation/map_reduce/command.rb +8 -0
  78. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  79. data/lib/mongo/operation/result.rb +6 -0
  80. data/lib/mongo/operation/shared/executable.rb +19 -1
  81. data/lib/mongo/operation/shared/polymorphic_operation.rb +1 -1
  82. data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
  83. data/lib/mongo/operation/shared/response_handling.rb +1 -0
  84. data/lib/mongo/operation/shared/sessions_supported.rb +28 -12
  85. data/lib/mongo/operation/shared/specifiable.rb +11 -29
  86. data/lib/mongo/operation/shared/validatable.rb +87 -0
  87. data/lib/mongo/operation/shared/write.rb +1 -1
  88. data/lib/mongo/operation/update/command.rb +6 -3
  89. data/lib/mongo/operation/update/legacy.rb +19 -11
  90. data/lib/mongo/operation/update/op_msg.rb +8 -4
  91. data/lib/mongo/operation/write_command/command.rb +51 -0
  92. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  93. data/lib/mongo/operation/write_command.rb +32 -0
  94. data/lib/mongo/operation.rb +10 -0
  95. data/lib/mongo/protocol/query.rb +35 -18
  96. data/lib/mongo/server/connection.rb +25 -3
  97. data/lib/mongo/server/connection_base.rb +12 -1
  98. data/lib/mongo/server/connection_common.rb +38 -1
  99. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  100. data/lib/mongo/server/connection_pool.rb +100 -27
  101. data/lib/mongo/server/description/features.rb +20 -17
  102. data/lib/mongo/server/description/load_balancer.rb +33 -0
  103. data/lib/mongo/server/description.rb +85 -6
  104. data/lib/mongo/server/monitor/connection.rb +5 -6
  105. data/lib/mongo/server/monitor.rb +2 -1
  106. data/lib/mongo/server/pending_connection.rb +47 -31
  107. data/lib/mongo/server/push_monitor.rb +10 -1
  108. data/lib/mongo/server.rb +73 -26
  109. data/lib/mongo/server_selector/base.rb +31 -5
  110. data/lib/mongo/session/session_pool.rb +11 -0
  111. data/lib/mongo/session.rb +40 -1
  112. data/lib/mongo/socket/ocsp_cache.rb +2 -3
  113. data/lib/mongo/socket/ocsp_verifier.rb +6 -37
  114. data/lib/mongo/socket.rb +1 -5
  115. data/lib/mongo/uri/options_mapper.rb +1 -0
  116. data/lib/mongo/uri/srv_protocol.rb +6 -8
  117. data/lib/mongo/uri.rb +18 -0
  118. data/lib/mongo/utils.rb +0 -13
  119. data/lib/mongo/version.rb +1 -1
  120. data/mongo.gemspec +1 -1
  121. data/spec/integration/auth_spec.rb +31 -1
  122. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  123. data/spec/integration/bulk_write_spec.rb +1 -1
  124. data/spec/integration/change_stream_spec.rb +3 -3
  125. data/spec/integration/client_construction_spec.rb +54 -0
  126. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  127. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  128. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  129. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  130. data/spec/integration/client_spec.rb +2 -0
  131. data/spec/integration/command_monitoring_spec.rb +1 -1
  132. data/spec/integration/command_spec.rb +1 -1
  133. data/spec/integration/connection_spec.rb +52 -35
  134. data/spec/integration/crud_spec.rb +174 -1
  135. data/spec/integration/cursor_pinning_spec.rb +121 -0
  136. data/spec/integration/cursor_reaping_spec.rb +8 -4
  137. data/spec/integration/fork_reconnect_spec.rb +1 -5
  138. data/spec/integration/get_more_spec.rb +1 -1
  139. data/spec/integration/heartbeat_events_spec.rb +1 -1
  140. data/spec/integration/map_reduce_spec.rb +77 -0
  141. data/spec/integration/query_cache_spec.rb +47 -2
  142. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  143. data/spec/integration/read_concern_spec.rb +1 -1
  144. data/spec/integration/read_preference_spec.rb +17 -13
  145. data/spec/integration/reconnect_spec.rb +30 -12
  146. data/spec/integration/retryable_errors_spec.rb +1 -1
  147. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  148. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  149. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  150. data/spec/integration/sdam_events_spec.rb +35 -19
  151. data/spec/integration/sdam_prose_spec.rb +1 -1
  152. data/spec/integration/server_monitor_spec.rb +1 -0
  153. data/spec/integration/server_selector_spec.rb +22 -5
  154. data/spec/integration/server_spec.rb +2 -0
  155. data/spec/integration/srv_monitoring_spec.rb +1 -1
  156. data/spec/integration/step_down_spec.rb +1 -1
  157. data/spec/integration/transaction_pinning_spec.rb +120 -0
  158. data/spec/integration/versioned_api_examples_spec.rb +45 -0
  159. data/spec/integration/x509_auth_spec.rb +1 -1
  160. data/spec/lite_spec_helper.rb +1 -2
  161. data/spec/mongo/address/unix_spec.rb +1 -0
  162. data/spec/mongo/auth/cr_spec.rb +2 -3
  163. data/spec/mongo/auth/ldap_spec.rb +2 -3
  164. data/spec/mongo/auth/scram_spec.rb +2 -3
  165. data/spec/mongo/auth/user/view_spec.rb +1 -1
  166. data/spec/mongo/auth/x509_spec.rb +2 -3
  167. data/spec/mongo/bulk_write_spec.rb +3 -3
  168. data/spec/mongo/client_construction_spec.rb +259 -28
  169. data/spec/mongo/client_spec.rb +6 -4
  170. data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
  171. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  172. data/spec/mongo/cluster_spec.rb +44 -3
  173. data/spec/mongo/collection/view/aggregation_spec.rb +72 -96
  174. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  175. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  176. data/spec/mongo/collection/view/change_stream_spec.rb +1 -1
  177. data/spec/mongo/collection/view/map_reduce_spec.rb +15 -2
  178. data/spec/mongo/collection_crud_spec.rb +7 -2
  179. data/spec/mongo/collection_ddl_spec.rb +1 -1
  180. data/spec/mongo/collection_spec.rb +1 -1
  181. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  182. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  183. data/spec/mongo/cursor_spec.rb +15 -5
  184. data/spec/mongo/database_spec.rb +15 -15
  185. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  186. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  187. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  188. data/spec/mongo/grid/stream_spec.rb +1 -1
  189. data/spec/mongo/index/view_spec.rb +2 -2
  190. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  191. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  192. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  193. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  194. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  195. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  196. data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
  197. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  198. data/spec/mongo/operation/read_preference_op_msg_spec.rb +26 -1
  199. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  200. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  201. data/spec/mongo/query_cache_spec.rb +6 -2
  202. data/spec/mongo/server/connection_common_spec.rb +62 -11
  203. data/spec/mongo/server/connection_pool_spec.rb +73 -7
  204. data/spec/mongo/server/connection_spec.rb +138 -43
  205. data/spec/mongo/server/description_spec.rb +1 -1
  206. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  207. data/spec/mongo/server/monitor_spec.rb +4 -3
  208. data/spec/mongo/server/push_monitor_spec.rb +101 -0
  209. data/spec/mongo/server_selector_spec.rb +136 -15
  210. data/spec/mongo/session/session_pool_spec.rb +42 -10
  211. data/spec/mongo/session_transaction_spec.rb +15 -30
  212. data/spec/mongo/socket/ssl_spec.rb +26 -58
  213. data/spec/mongo/socket/unix_spec.rb +1 -0
  214. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  215. data/spec/mongo/utils_spec.rb +0 -14
  216. data/spec/runners/change_streams/test.rb +1 -1
  217. data/spec/runners/cmap.rb +1 -1
  218. data/spec/runners/connection_string.rb +7 -3
  219. data/spec/runners/crud/operation.rb +5 -3
  220. data/spec/runners/crud/requirement.rb +1 -0
  221. data/spec/runners/crud/verifier.rb +1 -2
  222. data/spec/runners/crud.rb +1 -1
  223. data/spec/runners/sdam.rb +2 -1
  224. data/spec/runners/transactions/test.rb +2 -2
  225. data/spec/runners/unified/assertions.rb +5 -4
  226. data/spec/runners/unified/crud_operations.rb +77 -23
  227. data/spec/runners/unified/ddl_operations.rb +29 -1
  228. data/spec/runners/unified/entity_map.rb +3 -3
  229. data/spec/runners/unified/event_subscriber.rb +2 -2
  230. data/spec/runners/unified/support_operations.rb +16 -3
  231. data/spec/runners/unified/test.rb +18 -3
  232. data/spec/runners/unified.rb +1 -1
  233. data/spec/shared/lib/mrss/cluster_config.rb +6 -1
  234. data/spec/shared/lib/mrss/constraints.rb +11 -5
  235. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  236. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  237. data/spec/shared/share/Dockerfile.erb +5 -4
  238. data/spec/shared/shlib/server.sh +70 -20
  239. data/spec/spec_tests/change_streams_spec.rb +1 -1
  240. data/spec/spec_tests/cmap_spec.rb +4 -1
  241. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  242. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  243. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  244. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  245. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  246. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  247. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  248. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  249. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  250. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  251. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  252. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  253. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  254. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  255. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  256. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  257. data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
  258. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
  259. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
  260. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +91 -0
  261. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +89 -0
  262. data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
  263. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +88 -0
  264. data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
  265. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
  266. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +103 -0
  267. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +98 -0
  268. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  269. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  270. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  271. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  272. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
  273. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
  274. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
  275. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
  276. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
  277. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
  278. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
  279. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
  280. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
  281. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
  282. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
  283. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
  284. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
  285. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
  286. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
  287. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
  288. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
  289. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
  290. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
  291. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
  292. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
  293. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
  294. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
  295. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
  296. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
  297. data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
  298. data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
  299. data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
  300. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
  301. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  302. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  303. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  304. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  305. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  306. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  307. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  308. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  309. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  310. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  311. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  312. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  313. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  314. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  315. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  316. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  317. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  318. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  319. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  320. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  321. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  322. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  323. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  324. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  325. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  326. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  327. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  328. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  329. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  330. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  331. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  332. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  333. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  334. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  335. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  336. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  337. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  338. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  339. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  340. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  341. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  342. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  343. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  344. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  345. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  346. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  347. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  348. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  349. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  350. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +69 -0
  351. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
  352. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
  353. data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
  354. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  355. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  356. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  357. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  358. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  359. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  360. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  361. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  362. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  363. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  364. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  365. data/spec/spec_tests/sdam_spec.rb +1 -1
  366. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  367. data/spec/spec_tests/sessions_unified_spec.rb +13 -0
  368. data/spec/spec_tests/uri_options_spec.rb +4 -4
  369. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  370. data/spec/stress/push_monitor_close_spec.rb +44 -0
  371. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  372. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  373. data/spec/support/common_shortcuts.rb +2 -3
  374. data/spec/support/matchers.rb +13 -0
  375. data/spec/support/shared/auth_context.rb +16 -0
  376. data/spec/support/shared/session.rb +2 -2
  377. data/spec/support/spec_config.rb +10 -11
  378. data/spec/support/using_hash.rb +31 -0
  379. data/spec/support/utils.rb +1 -1
  380. data.tar.gz.sig +3 -4
  381. metadata +1111 -1029
  382. metadata.gz.sig +2 -3
  383. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  384. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  385. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  386. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  387. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  388. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  389. data/lib/mongo/server/context.rb +0 -72
  390. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  391. data/spec/runners/unified/using_hash.rb +0 -34
  392. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  393. data/spec/support/event_subscriber.rb +0 -221
@@ -6,7 +6,7 @@ require 'spec_helper'
6
6
  describe Mongo::Client do
7
7
  clean_slate
8
8
 
9
- let(:subscriber) { EventSubscriber.new }
9
+ let(:subscriber) { Mrss::EventSubscriber.new }
10
10
 
11
11
  describe '.new' do
12
12
  context 'with scan: false' do
@@ -24,26 +24,8 @@ describe Mongo::Client do
24
24
  end
25
25
 
26
26
  context 'with default scan: true' do
27
- # TODO this test requires there being no outstanding background
28
- # monitoring threads running, as otherwise the scan! expectation
29
- # can be executed on a thread that belongs to one of the global
30
- # clients for instance
31
- it 'performs one round of sdam' do
32
- # Does not work due to
33
- # https://github.com/rspec/rspec-mocks/issues/1242.
34
- #expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
35
- # exactly(SpecConfig.instance.addresses.length).times.and_call_original
36
- c = new_local_client(
37
- SpecConfig.instance.addresses, SpecConfig.instance.test_options)
38
- expect(c.cluster.servers).not_to be_empty
39
- end
40
-
41
- # This checks the case of all initial seeds being removed from
42
- # cluster during SDAM
43
- context 'me mismatch on the only initial seed' do
44
- let(:address) do
45
- ClusterConfig.instance.alternate_address.to_s
46
- end
27
+
28
+ shared_examples 'does not wait for server selection timeout' do
47
29
 
48
30
  let(:logger) do
49
31
  Logger.new(STDOUT, level: Logger::DEBUG)
@@ -94,6 +76,7 @@ describe Mongo::Client do
94
76
  Mongo::Cluster::Topology::ReplicaSetWithPrimary,
95
77
  Mongo::Cluster::Topology::Single,
96
78
  Mongo::Cluster::Topology::Sharded,
79
+ Mongo::Cluster::Topology::LoadBalanced,
97
80
  ]).to include(actual_class)
98
81
  expect(time_taken).to be < 5
99
82
 
@@ -101,6 +84,44 @@ describe Mongo::Client do
101
84
  client.database.command(ping: 1)
102
85
  end
103
86
  end
87
+
88
+ context 'when cluster is monitored' do
89
+ require_topology :single, :replica_set, :sharded
90
+
91
+ # TODO this test requires there being no outstanding background
92
+ # monitoring threads running, as otherwise the scan! expectation
93
+ # can be executed on a thread that belongs to one of the global
94
+ # clients for instance
95
+ it 'performs one round of sdam' do
96
+ # Does not work due to
97
+ # https://github.com/rspec/rspec-mocks/issues/1242.
98
+ #expect_any_instance_of(Mongo::Server::Monitor).to receive(:scan!).
99
+ # exactly(SpecConfig.instance.addresses.length).times.and_call_original
100
+ c = new_local_client(
101
+ SpecConfig.instance.addresses, SpecConfig.instance.test_options)
102
+ expect(c.cluster.servers).not_to be_empty
103
+ end
104
+
105
+ # This checks the case of all initial seeds being removed from
106
+ # cluster during SDAM
107
+ context 'me mismatch on the only initial seed' do
108
+ let(:address) do
109
+ ClusterConfig.instance.alternate_address.to_s
110
+ end
111
+
112
+ include_examples 'does not wait for server selection timeout'
113
+ end
114
+ end
115
+
116
+ context 'when cluster is not monitored' do
117
+ require_topology :load_balanced
118
+
119
+ let(:address) do
120
+ ClusterConfig.instance.alternate_address.to_s
121
+ end
122
+
123
+ include_examples 'does not wait for server selection timeout'
124
+ end
104
125
  end
105
126
 
106
127
  context 'with monitoring_io: false' do
@@ -388,10 +409,24 @@ describe Mongo::Client do
388
409
  end.should_not raise_error
389
410
  end
390
411
 
391
- it 'fails server selection due to very small timeout' do
392
- lambda do
393
- client.database.command(ping: 1)
394
- end.should raise_error(Mongo::Error::NoServerAvailable)
412
+ context 'non-lb' do
413
+ require_topology :single, :replica_set, :sharded
414
+
415
+ it 'fails server selection due to very small timeout' do
416
+ lambda do
417
+ client.database.command(ping: 1)
418
+ end.should raise_error(Mongo::Error::NoServerAvailable)
419
+ end
420
+ end
421
+
422
+ context 'lb' do
423
+ require_topology :load_balanced
424
+
425
+ it 'fails the operation after successful server selection' do
426
+ lambda do
427
+ client.database.command(ping: 1)
428
+ end.should raise_error(Mongo::Error::SocketTimeoutError, /socket took over.*to connect/)
429
+ end
395
430
  end
396
431
  end
397
432
 
@@ -412,7 +447,7 @@ describe Mongo::Client do
412
447
  end.should_not raise_error
413
448
  end
414
449
 
415
- it 'fails operations due to very small timeout' do
450
+ it 'fails operations due to very small timeout', retry: 3 do
416
451
  lambda do
417
452
  client.database.command(ping: 1)
418
453
  end.should raise_error(Mongo::Error::SocketTimeoutError)
@@ -1292,6 +1327,192 @@ describe Mongo::Client do
1292
1327
  client.options[:connect].should be :sharded
1293
1328
  end
1294
1329
  end
1330
+
1331
+ context 'load_balanced: true and multiple seeds' do
1332
+ let(:client) do
1333
+ new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
1334
+ load_balanced: true)
1335
+ end
1336
+
1337
+ it 'is rejected' do
1338
+ lambda do
1339
+ client
1340
+ end.should raise_error(ArgumentError, /load_balanced=true cannot be used with multiple seeds/)
1341
+ end
1342
+ end
1343
+
1344
+ context 'load_balanced: false and multiple seeds' do
1345
+ let(:client) do
1346
+ new_local_client_nmio(['127.0.0.1:27017', '127.0.0.2:27017'],
1347
+ load_balanced: false)
1348
+ end
1349
+
1350
+ it 'is accepted' do
1351
+ lambda do
1352
+ client
1353
+ end.should_not raise_error
1354
+ client.options[:load_balanced].should be false
1355
+ end
1356
+ end
1357
+
1358
+ context 'load_balanced: true and direct_connection: true' do
1359
+ let(:client) do
1360
+ new_local_client_nmio(['127.0.0.1:27017'],
1361
+ load_balanced: true, direct_connection: true)
1362
+ end
1363
+
1364
+ it 'is rejected' do
1365
+ lambda do
1366
+ client
1367
+ end.should raise_error(ArgumentError, /direct_connection=true cannot be used with load_balanced=true/)
1368
+ end
1369
+ end
1370
+
1371
+ context 'load_balanced: true and direct_connection: false' do
1372
+ let(:client) do
1373
+ new_local_client_nmio(['127.0.0.1:27017'],
1374
+ load_balanced: true, direct_connection: false)
1375
+ end
1376
+
1377
+ it 'is accepted' do
1378
+ lambda do
1379
+ client
1380
+ end.should_not raise_error
1381
+ client.options[:load_balanced].should be true
1382
+ client.options[:direct_connection].should be false
1383
+ end
1384
+ end
1385
+
1386
+ context 'load_balanced: false and direct_connection: true' do
1387
+ let(:client) do
1388
+ new_local_client_nmio(['127.0.0.1:27017'],
1389
+ load_balanced: false, direct_connection: true)
1390
+ end
1391
+
1392
+ it 'is accepted' do
1393
+ lambda do
1394
+ client
1395
+ end.should_not raise_error
1396
+ client.options[:load_balanced].should be false
1397
+ client.options[:direct_connection].should be true
1398
+ end
1399
+ end
1400
+
1401
+ [:direct, 'direct', :sharded, 'sharded'].each do |v|
1402
+ context "load_balanced: true and connect: #{v.inspect}" do
1403
+ let(:client) do
1404
+ new_local_client_nmio(['127.0.0.1:27017'],
1405
+ load_balanced: true, connect: v)
1406
+ end
1407
+
1408
+ it 'is rejected' do
1409
+ lambda do
1410
+ client
1411
+ end.should raise_error(ArgumentError, /connect=#{v} cannot be used with load_balanced=true/)
1412
+ end
1413
+ end
1414
+ end
1415
+
1416
+ [nil].each do |v|
1417
+ context "load_balanced: true and connect: #{v.inspect}" do
1418
+ let(:client) do
1419
+ new_local_client_nmio(['127.0.0.1:27017'],
1420
+ load_balanced: true, connect: v)
1421
+ end
1422
+
1423
+ it 'is accepted' do
1424
+ lambda do
1425
+ client
1426
+ end.should_not raise_error
1427
+ client.options[:load_balanced].should be true
1428
+ client.options[:connect].should eq v
1429
+ end
1430
+ end
1431
+ end
1432
+
1433
+ [:load_balanced, 'load_balanced'].each do |v|
1434
+ context "load_balanced: true and connect: #{v.inspect}" do
1435
+ let(:client) do
1436
+ new_local_client_nmio(['127.0.0.1:27017'],
1437
+ load_balanced: true, connect: v)
1438
+ end
1439
+
1440
+ it 'is accepted' do
1441
+ lambda do
1442
+ client
1443
+ end.should_not raise_error
1444
+ client.options[:load_balanced].should be true
1445
+ client.options[:connect].should eq v
1446
+ end
1447
+ end
1448
+
1449
+ context "replica_set and connect: #{v.inspect}" do
1450
+ let(:client) do
1451
+ new_local_client_nmio(['127.0.0.1:27017'],
1452
+ replica_set: 'foo', connect: v)
1453
+ end
1454
+
1455
+ it 'is rejected' do
1456
+ lambda do
1457
+ client
1458
+ end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with replica_set option/)
1459
+ end
1460
+ end
1461
+
1462
+ context "direct_connection=true and connect: #{v.inspect}" do
1463
+ let(:client) do
1464
+ new_local_client_nmio(['127.0.0.1:27017'],
1465
+ direct_connection: true, connect: v)
1466
+ end
1467
+
1468
+ it 'is rejected' do
1469
+ lambda do
1470
+ client
1471
+ end.should raise_error(ArgumentError, /Conflicting client options: direct_connection=true and connect=load_balanced/)
1472
+ end
1473
+ end
1474
+
1475
+ context "multiple seed addresses and connect: #{v.inspect}" do
1476
+ let(:client) do
1477
+ new_local_client_nmio(['127.0.0.1:27017', '127.0.0.1:1234'],
1478
+ connect: v)
1479
+ end
1480
+
1481
+ it 'is rejected' do
1482
+ lambda do
1483
+ client
1484
+ end.should raise_error(ArgumentError, /connect=load_balanced cannot be used with multiple seeds/)
1485
+ end
1486
+ end
1487
+ end
1488
+
1489
+ [:replica_set, 'replica_set'].each do |v|
1490
+ context "load_balanced: true and connect: #{v.inspect}" do
1491
+ let(:client) do
1492
+ new_local_client_nmio(['127.0.0.1:27017'],
1493
+ load_balanced: true, connect: v, replica_set: 'x')
1494
+ end
1495
+
1496
+ it 'is rejected' do
1497
+ lambda do
1498
+ client
1499
+ end.should raise_error(ArgumentError, /connect=replica_set cannot be used with load_balanced=true/)
1500
+ end
1501
+ end
1502
+
1503
+ context "load_balanced: true and #{v.inspect} option" do
1504
+ let(:client) do
1505
+ new_local_client_nmio(['127.0.0.1:27017'],
1506
+ load_balanced: true, v => 'rs')
1507
+ end
1508
+
1509
+ it 'is rejected' do
1510
+ lambda do
1511
+ client
1512
+ end.should raise_error(ArgumentError, /load_balanced=true cannot be used with replica_set option/)
1513
+ end
1514
+ end
1515
+ end
1295
1516
  end
1296
1517
 
1297
1518
  context ':bg_error_backtrace option' do
@@ -2306,7 +2527,12 @@ describe Mongo::Client do
2306
2527
  before do
2307
2528
  client.cluster.next_primary
2308
2529
  events = subscriber.select_started_events(Mongo::Monitoring::Event::ServerHeartbeatStarted)
2309
- events.length.should > 0
2530
+ if ClusterConfig.instance.topology == :load_balanced
2531
+ # No server monitoring in LB topology
2532
+ events.length.should == 0
2533
+ else
2534
+ events.length.should > 0
2535
+ end
2310
2536
  end
2311
2537
 
2312
2538
  it 'does not copy sdam_proc option to new client' do
@@ -2318,7 +2544,12 @@ describe Mongo::Client do
2318
2544
  # Give those some time to be processed.
2319
2545
  sleep 2
2320
2546
 
2321
- expect(subscriber.started_events.length).to be > 0
2547
+ if ClusterConfig.instance.topology == :load_balanced
2548
+ # No server monitoring in LB topology
2549
+ expect(subscriber.started_events.length).to eq 0
2550
+ else
2551
+ expect(subscriber.started_events.length).to be > 0
2552
+ end
2322
2553
  subscriber.started_events.clear
2323
2554
 
2324
2555
  # If this test takes longer than heartbeat interval,
@@ -635,7 +635,7 @@ describe Mongo::Client do
635
635
  root_authorized_client.options.merge(heartbeat_frequency: 100, monitoring: true)
636
636
  end
637
637
 
638
- let(:subscriber) { EventSubscriber.new }
638
+ let(:subscriber) { Mrss::EventSubscriber.new }
639
639
 
640
640
  let(:client) do
641
641
  ClientRegistry.instance.new_local_client(
@@ -939,13 +939,15 @@ describe Mongo::Client do
939
939
  end
940
940
 
941
941
  context 'monitoring present' do
942
+ require_topology :single, :replica_set, :sharded
943
+
942
944
  let(:client) do
943
945
  authorized_client
944
946
  end
945
947
 
946
948
  it 'does not indicate lack of monitoring' do
947
- client.summary.should =~ /servers=.*(STANDALONE|PRIMARY|MONGOS)/
948
- client.summary.should_not =~ /servers=.*(STANDALONE|PRIMARY|MONGOS).*NO-MONITORING/
949
+ client.summary.should =~ /servers=.*(?:STANDALONE|PRIMARY|MONGOS)/
950
+ client.summary.should_not =~ /servers=.*(?:STANDALONE|PRIMARY|MONGOS).*NO-MONITORING/
949
951
  end
950
952
  end
951
953
 
@@ -957,7 +959,7 @@ describe Mongo::Client do
957
959
  end
958
960
 
959
961
  it 'does not indicate lack of monitoring' do
960
- client.summary.should =~ /servers=.*(STANDALONE|PRIMARY|MONGOS).*NO-MONITORING/
962
+ client.summary.should =~ /servers=.*(STANDALONE|PRIMARY|MONGOS|\bLB\b).*NO-MONITORING/
961
963
  end
962
964
  end
963
965
  end
@@ -5,16 +5,18 @@ require 'spec_helper'
5
5
 
6
6
  describe Mongo::Cluster::CursorReaper do
7
7
 
8
+ let(:cluster) { double('cluster') }
9
+
8
10
  before do
9
11
  authorized_collection.drop
10
12
  end
11
13
 
12
14
  let(:reaper) do
13
- described_class.new
15
+ described_class.new(cluster)
14
16
  end
15
17
 
16
- let(:active_cursors) do
17
- reaper.instance_variable_get(:@active_cursors)
18
+ let(:active_cursor_ids) do
19
+ reaper.instance_variable_get(:@active_cursor_ids)
18
20
  end
19
21
 
20
22
  describe '#intialize' do
@@ -24,16 +26,29 @@ describe Mongo::Cluster::CursorReaper do
24
26
  end
25
27
 
26
28
  it 'initializes a set for the list of active cursors' do
27
- expect(reaper.instance_variable_get(:@active_cursors)).to be_a(Set)
29
+ expect(reaper.instance_variable_get(:@active_cursor_ids)).to be_a(Set)
28
30
  end
29
31
  end
30
32
 
31
33
  describe '#schedule_kill_cursor' do
32
34
 
33
- let(:server) { double('server') }
35
+ let(:address) { Mongo::Address.new('localhost') }
36
+ let(:server) do
37
+ double('server').tap do |server|
38
+ allow(server).to receive(:address).and_return(address)
39
+ end
40
+ end
34
41
  let(:cursor_id) { 1 }
35
- let(:op_spec_1) { double('op_spec_1') }
36
- let(:op_spec_2) { double('op_spec_2') }
42
+ let(:cursor_kill_spec_1) do
43
+ Mongo::Cursor::KillSpec.new(
44
+ cursor_id: cursor_id, coll_name: 'c', db_name: 'd', service_id: nil,
45
+ )
46
+ end
47
+ let(:cursor_kill_spec_2) do
48
+ Mongo::Cursor::KillSpec.new(
49
+ cursor_id: cursor_id, coll_name: 'c', db_name: 'q', service_id: nil,
50
+ )
51
+ end
37
52
  let(:to_kill) { reaper.instance_variable_get(:@to_kill)}
38
53
 
39
54
  context 'when the cursor is on the list of active cursors' do
@@ -45,36 +60,36 @@ describe Mongo::Cluster::CursorReaper do
45
60
  context 'when there is not a list already for the server' do
46
61
 
47
62
  before do
48
- reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
63
+ reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
49
64
  end
50
65
 
51
66
  it 'initializes the list of op specs to a set' do
52
- expect(to_kill.keys).to eq([ server ])
53
- expect(to_kill[server]).to eq(Set.new([op_spec_1]))
67
+ expect(to_kill.keys).to eq([ address.seed ])
68
+ expect(to_kill[address.seed]).to eq(Set.new([cursor_kill_spec_1]))
54
69
  end
55
70
  end
56
71
 
57
72
  context 'when there is a list of ops already for the server' do
58
73
 
59
74
  before do
60
- reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
61
- reaper.schedule_kill_cursor(cursor_id, op_spec_2, server)
75
+ reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
76
+ reaper.schedule_kill_cursor(cursor_kill_spec_2, server)
62
77
  end
63
78
 
64
79
  it 'adds the op to the server list' do
65
- expect(to_kill.keys).to eq([ server ])
66
- expect(to_kill[server]).to contain_exactly(op_spec_1, op_spec_2)
80
+ expect(to_kill.keys).to eq([ address.seed ])
81
+ expect(to_kill[address.seed]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
67
82
  end
68
83
 
69
84
  context 'when the same op is added more than once' do
70
85
 
71
86
  before do
72
- reaper.schedule_kill_cursor(cursor_id, op_spec_2, server)
87
+ reaper.schedule_kill_cursor(cursor_kill_spec_2, server)
73
88
  end
74
89
 
75
90
  it 'does not allow duplicates ops for a server' do
76
- expect(to_kill.keys).to eq([ server ])
77
- expect(to_kill[server]).to contain_exactly(op_spec_1, op_spec_2)
91
+ expect(to_kill.keys).to eq([ address.seed ])
92
+ expect(to_kill[address.seed]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
78
93
  end
79
94
  end
80
95
  end
@@ -83,7 +98,7 @@ describe Mongo::Cluster::CursorReaper do
83
98
  context 'when the cursor is not on the list of active cursors' do
84
99
 
85
100
  before do
86
- reaper.schedule_kill_cursor(cursor_id, op_spec_1, server)
101
+ reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
87
102
  end
88
103
 
89
104
  it 'does not add the kill cursors op spec to the list' do
@@ -131,7 +146,7 @@ describe Mongo::Cluster::CursorReaper do
131
146
  end
132
147
 
133
148
  it 'registers the cursor id as active' do
134
- expect(active_cursors).to eq(Set.new([2]))
149
+ expect(active_cursor_ids).to eq(Set.new([2]))
135
150
  end
136
151
  end
137
152
  end
@@ -146,7 +161,7 @@ describe Mongo::Cluster::CursorReaper do
146
161
  end
147
162
 
148
163
  it 'removes the cursor id' do
149
- expect(active_cursors.size).to eq(0)
164
+ expect(active_cursor_ids.size).to eq(0)
150
165
  end
151
166
  end
152
167
  end
@@ -174,7 +189,7 @@ describe Mongo::Cluster::CursorReaper do
174
189
  around do |example|
175
190
  authorized_collection.insert_many(docs)
176
191
  periodic_executor.stop!
177
- cluster.schedule_kill_cursor(cursor.id, cursor.send(:kill_cursors_op_spec),
192
+ cluster.schedule_kill_cursor(cursor.kill_spec,
178
193
  cursor.instance_variable_get(:@server))
179
194
  periodic_executor.flush
180
195
  example.run
@@ -5,8 +5,10 @@ require 'spec_helper'
5
5
 
6
6
  describe Mongo::Cluster::PeriodicExecutor do
7
7
 
8
+ let(:cluster) { double('cluster') }
9
+
8
10
  let(:executor) do
9
- described_class.new
11
+ described_class.new(cluster)
10
12
  end
11
13
 
12
14
  describe '#log_warn' do
@@ -41,6 +41,34 @@ describe Mongo::Cluster do
41
41
  end
42
42
  end
43
43
 
44
+ context 'when topology is load-balanced' do
45
+ require_topology :load_balanced
46
+
47
+ it 'emits SDAM events' do
48
+ allow(monitoring).to receive(:succeeded)
49
+
50
+ register_cluster(
51
+ described_class.new(
52
+ SpecConfig.instance.addresses,
53
+ monitoring,
54
+ SpecConfig.instance.test_options
55
+ )
56
+ )
57
+
58
+ expect(monitoring).to have_received(:succeeded).with(
59
+ Mongo::Monitoring::TOPOLOGY_OPENING, any_args
60
+ )
61
+ expect(monitoring).to have_received(:succeeded).with(
62
+ Mongo::Monitoring::TOPOLOGY_CHANGED, any_args
63
+ ).twice
64
+ expect(monitoring).to have_received(:succeeded).with(
65
+ Mongo::Monitoring::SERVER_OPENING, any_args
66
+ )
67
+ expect(monitoring).to have_received(:succeeded).with(
68
+ Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED, any_args
69
+ )
70
+ end
71
+ end
44
72
  end
45
73
 
46
74
  describe '#==' do
@@ -334,7 +362,7 @@ describe Mongo::Cluster do
334
362
  end
335
363
 
336
364
  let(:monitoring) { Mongo::Monitoring.new }
337
- let(:subscriber) { EventSubscriber.new }
365
+ let(:subscriber) { Mrss::EventSubscriber.new }
338
366
 
339
367
  it 'publishes server closed event once' do
340
368
  monitoring.subscribe(Mongo::Monitoring::SERVER_CLOSED, subscriber)
@@ -425,7 +453,7 @@ describe Mongo::Cluster do
425
453
  end
426
454
 
427
455
  let(:primary_candidates) do
428
- if cluster.single?
456
+ if cluster.single? || cluster.load_balanced?
429
457
  cluster.servers
430
458
  elsif cluster.sharded?
431
459
  cluster.servers
@@ -611,7 +639,17 @@ describe Mongo::Cluster do
611
639
  monitoring_io: false, server_selection_timeout: 0.183))
612
640
  end
613
641
 
614
- it_behaves_like 'does not support sessions'
642
+ context 'in load-balanced topology' do
643
+ require_topology :load_balanced
644
+
645
+ it_behaves_like 'supports sessions'
646
+ end
647
+
648
+ context 'not in load-balanced topology' do
649
+ require_topology :single, :replica_set, :sharded
650
+
651
+ it_behaves_like 'does not support sessions'
652
+ end
615
653
  end
616
654
 
617
655
  context 'when client has contacted servers and then disconnected' do
@@ -761,6 +799,9 @@ describe Mongo::Cluster do
761
799
  let(:default_address) { SpecConfig.instance.addresses.first }
762
800
 
763
801
  context 'cluster has unknown servers' do
802
+ # Servers are never unknown in load-balanced topology.
803
+ require_topology :single, :replica_set, :sharded
804
+
764
805
  it 'includes unknown servers' do
765
806
  cluster.servers_list.each do |server|
766
807
  expect(server).to be_unknown