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
@@ -251,9 +251,9 @@ module Mongo
251
251
  # TODO put the list of read options in a class-level constant when
252
252
  # we figure out what the full set of them is.
253
253
  options = Hash[self.options.reject do |key, value|
254
- %w(read read_preference).include?(key.to_s)
254
+ %w(read read_preference read_concern).include?(key.to_s)
255
255
  end]
256
- options.update(Utils.slice_hash(opts, *TIME_SERIES_OPTIONS.keys))
256
+ options.update(opts.slice(*TIME_SERIES_OPTIONS.keys))
257
257
  # Converting Ruby spelled time series options to server style.
258
258
  TIME_SERIES_OPTIONS.each do |ruby_key, server_key|
259
259
  if options.key?(ruby_key)
@@ -269,17 +269,17 @@ module Mongo
269
269
  else
270
270
  self.write_concern
271
271
  end
272
- server = next_primary(nil, session)
273
- if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
274
- raise Error::UnsupportedCollation
275
- end
276
272
 
277
- Operation::Create.new({
278
- selector: operation,
279
- db_name: database.name,
280
- write_concern: write_concern,
281
- session: session,
282
- }).execute(server, context: Operation::Context.new(client: client, session: session))
273
+ context = Operation::Context.new(client: client, session: session)
274
+ Operation::Create.new(
275
+ selector: operation,
276
+ db_name: database.name,
277
+ write_concern: write_concern,
278
+ session: session,
279
+ # Note that these are collection options, collation isn't
280
+ # taken from options passed to the create method.
281
+ collation: options[:collation] || options['collation'],
282
+ ).execute(next_primary(nil, session), context: context)
283
283
  end
284
284
  end
285
285
 
@@ -353,14 +353,16 @@ module Mongo
353
353
  # @option options [ true, false ] :no_cursor_timeout The server normally times out idle
354
354
  # cursors after an inactivity period (10 minutes) to prevent excess memory use.
355
355
  # Set this option to prevent that.
356
- # @option options [ true, false ] :oplog_replay Internal replication use only - driver
357
- # should not set.
356
+ # @option options [ true, false ] :oplog_replay For internal replication
357
+ # use only, applications should not set this option.
358
358
  # @option options [ Hash ] :projection The fields to include or exclude from each doc
359
359
  # in the result set.
360
360
  # @option options [ Session ] :session The session to use.
361
361
  # @option options [ Integer ] :skip The number of docs to skip before returning results.
362
362
  # @option options [ Hash ] :sort The key and direction pairs by which the result set
363
363
  # will be sorted.
364
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
365
+ # See the server documentation for details.
364
366
  #
365
367
  # @return [ CollectionView ] The collection view.
366
368
  #
@@ -386,6 +388,8 @@ module Mongo
386
388
  # @option options [ Hash ] :collation The collation to use.
387
389
  # @option options [ String ] :comment Associate a comment with the aggregation.
388
390
  # @option options [ String ] :hint The index to use for the aggregation.
391
+ # @option options [ Hash ] :let Mapping of variables to use in the pipeline.
392
+ # See the server documentation for details.
389
393
  # @option options [ Integer ] :max_time_ms The maximum amount of time in
390
394
  # milliseconds to allow the aggregation to run.
391
395
  # @option options [ true, false ] :use_cursor Indicates whether the command
@@ -666,6 +670,8 @@ module Mongo
666
670
  # @option options [ Session ] :session The session to use.
667
671
  # @option options [ Hash | String ] :hint The index to use for this operation.
668
672
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
673
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
674
+ # See the server documentation for details.
669
675
  #
670
676
  # @return [ Result ] The response from the database.
671
677
  #
@@ -686,6 +692,8 @@ module Mongo
686
692
  # @option options [ Session ] :session The session to use.
687
693
  # @option options [ Hash | String ] :hint The index to use for this operation.
688
694
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
695
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
696
+ # See the server documentation for details.
689
697
  #
690
698
  # @return [ Result ] The response from the database.
691
699
  #
@@ -734,6 +742,8 @@ module Mongo
734
742
  # @option options [ Session ] :session The session to use.
735
743
  # @option options [ Hash | String ] :hint The index to use for this operation.
736
744
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
745
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
746
+ # See the server documentation for details.
737
747
  #
738
748
  # @return [ Result ] The response from the database.
739
749
  #
@@ -761,6 +771,8 @@ module Mongo
761
771
  # @option options [ Session ] :session The session to use.
762
772
  # @option options [ Hash | String ] :hint The index to use for this operation.
763
773
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
774
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
775
+ # See the server documentation for details.
764
776
  #
765
777
  # @return [ Result ] The response from the database.
766
778
  #
@@ -788,6 +800,8 @@ module Mongo
788
800
  # @option options [ Session ] :session The session to use.
789
801
  # @option options [ Hash | String ] :hint The index to use for this operation.
790
802
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
803
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
804
+ # See the server documentation for details.
791
805
  #
792
806
  # @return [ Result ] The response from the database.
793
807
  #
@@ -816,6 +830,8 @@ module Mongo
816
830
  # @option options [ Session ] :session The session to use.
817
831
  # @option options [ Hash | String ] :hint The index to use for this operation.
818
832
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
833
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
834
+ # See the server documentation for details.
819
835
  #
820
836
  # @return [ BSON::Document, nil ] The document, if found.
821
837
  #
@@ -854,6 +870,8 @@ module Mongo
854
870
  # @option options [ Session ] :session The session to use.
855
871
  # @option options [ Hash | String ] :hint The index to use for this operation.
856
872
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
873
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
874
+ # See the server documentation for details.
857
875
  #
858
876
  # @return [ BSON::Document ] The document.
859
877
  #
@@ -890,6 +908,8 @@ module Mongo
890
908
  # @option options [ Session ] :session The session to use.
891
909
  # @option options [ Hash | String ] :hint The index to use for this operation.
892
910
  # May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
911
+ # @option options [ Hash ] :let Mapping of variables to use in the command.
912
+ # See the server documentation for details.
893
913
  #
894
914
  # @return [ BSON::Document ] The document.
895
915
  #
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Cursor
20
+
21
+ # This class contains the operation specification for KillCursors.
22
+ #
23
+ # Its purpose is to ensure we don't misspell attribute names accidentally.
24
+ #
25
+ # @api private
26
+ class KillSpec
27
+
28
+ def initialize(cursor_id:, coll_name:, db_name:, service_id:)
29
+ @cursor_id = cursor_id
30
+ @coll_name = coll_name
31
+ @db_name = db_name
32
+ @service_id = service_id
33
+ end
34
+
35
+ attr_reader :cursor_id, :coll_name, :db_name, :service_id
36
+ end
37
+ end
38
+ end
data/lib/mongo/cursor.rb CHANGED
@@ -15,8 +15,6 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
- require 'mongo/cursor/builder'
19
-
20
18
  module Mongo
21
19
 
22
20
  # Client-side representation of an iterator over a query result set on
@@ -69,6 +67,10 @@ module Mongo
69
67
  #
70
68
  # @since 2.0.0
71
69
  def initialize(view, result, server, options = {})
70
+ unless result.is_a?(Operation::Result)
71
+ raise ArgumentError, "Second argument must be a Mongo::Operation::Result: #{result.inspect}"
72
+ end
73
+
72
74
  @view = view
73
75
  @server = server
74
76
  @initial_result = result
@@ -82,9 +84,8 @@ module Mongo
82
84
  @session = @options[:session]
83
85
  unless closed?
84
86
  register
85
- ObjectSpace.define_finalizer(self, self.class.finalize(@cursor_id,
87
+ ObjectSpace.define_finalizer(self, self.class.finalize(kill_spec,
86
88
  cluster,
87
- kill_cursors_op_spec,
88
89
  server,
89
90
  @session))
90
91
  end
@@ -93,23 +94,25 @@ module Mongo
93
94
  # @api private
94
95
  attr_reader :server
95
96
 
97
+ # @api private
98
+ attr_reader :initial_result
99
+
96
100
  # Finalize the cursor for garbage collection. Schedules this cursor to be included
97
101
  # in a killCursors operation executed by the Cluster's CursorReaper.
98
102
  #
99
- # @example Finalize the cursor.
100
- # Cursor.finalize(id, cluster, op, server)
101
- #
102
- # @param [ Integer ] cursor_id The cursor's id.
103
+ # @param [ Cursor::KillSpec ] kill_spec The KillCursor operation specification.
103
104
  # @param [ Mongo::Cluster ] cluster The cluster associated with this cursor and its server.
104
- # @param [ Hash ] op_spec The killCursors operation specification.
105
105
  # @param [ Mongo::Server ] server The server to send the killCursors operation to.
106
106
  #
107
107
  # @return [ Proc ] The Finalizer.
108
108
  #
109
- # @since 2.3.0
110
- def self.finalize(cursor_id, cluster, op_spec, server, session)
109
+ # @api private
110
+ def self.finalize(kill_spec, cluster, server, session)
111
+ unless KillSpec === kill_spec
112
+ raise ArgumentError, "First argument must be a KillSpec: #{kill_spec.inspect}"
113
+ end
111
114
  proc do
112
- cluster.schedule_kill_cursor(cursor_id, op_spec, server)
115
+ cluster.schedule_kill_cursor(kill_spec, server)
113
116
  session.end_session if session && session.implicit?
114
117
  end
115
118
  end
@@ -212,10 +215,12 @@ module Mongo
212
215
  unless closed?
213
216
  if exhausted?
214
217
  close
218
+ @fully_iterated = true
215
219
  raise StopIteration
216
220
  end
217
221
  @documents = get_more
218
222
  else
223
+ @fully_iterated = true
219
224
  raise StopIteration
220
225
  end
221
226
  else
@@ -232,6 +237,9 @@ module Mongo
232
237
  # over the last document, or if the batch is empty
233
238
  if @documents.size <= 1
234
239
  cache_batch_resume_token
240
+ if closed?
241
+ @fully_iterated = true
242
+ end
235
243
  end
236
244
 
237
245
  return @documents.shift
@@ -274,7 +282,13 @@ module Mongo
274
282
 
275
283
  unregister
276
284
  read_with_one_retry do
277
- kill_cursors_operation.execute(@server, context: Operation::Context.new(client: client, session: @session))
285
+ spec = {
286
+ coll_name: collection_name,
287
+ db_name: database.name,
288
+ cursor_ids: [id],
289
+ }
290
+ op = Operation::KillCursors.new(spec)
291
+ execute_operation(op)
278
292
  end
279
293
 
280
294
  nil
@@ -349,7 +363,22 @@ module Mongo
349
363
  # doing so may result in silent data loss, the driver no longer retries
350
364
  # getMore operations in any circumstance.
351
365
  # https://github.com/mongodb/specifications/blob/master/source/retryable-reads/retryable-reads.rst#qa
352
- process(get_more_operation.execute(@server, context: Operation::Context.new(client: client, session: @session)))
366
+ process(execute_operation(get_more_operation))
367
+ end
368
+
369
+ # @api private
370
+ def kill_spec
371
+ KillSpec.new(
372
+ cursor_id: id,
373
+ coll_name: collection_name,
374
+ db_name: database.name,
375
+ service_id: initial_result.connection_description.service_id,
376
+ )
377
+ end
378
+
379
+ # @api private
380
+ def fully_iterated?
381
+ !!@fully_iterated
353
382
  end
354
383
 
355
384
  private
@@ -369,11 +398,24 @@ module Mongo
369
398
  end
370
399
 
371
400
  def get_more_operation
372
- if @server.with_connection { |connection| connection.features }.find_command_enabled?
373
- spec = Builder::GetMoreCommand.new(self, @session).specification
374
- else
375
- spec = Builder::OpGetMore.new(self).specification
376
- end
401
+ spec = {
402
+ session: @session,
403
+ db_name: database.name,
404
+ coll_name: collection_name,
405
+ cursor_id: id,
406
+ # 3.2+ servers use batch_size, 3.0- servers use to_return.
407
+ # TODO should to_return be calculated in the operation layer?
408
+ batch_size: batch_size,
409
+ to_return: to_return,
410
+ max_time_ms: if view.respond_to?(:max_await_time_ms) &&
411
+ view.max_await_time_ms &&
412
+ view.options[:await_data]
413
+ then
414
+ view.max_await_time_ms
415
+ else
416
+ nil
417
+ end,
418
+ }
377
419
  Operation::GetMore.new(spec)
378
420
  end
379
421
 
@@ -381,18 +423,6 @@ module Mongo
381
423
  @session.end_session if @session && @session.implicit?
382
424
  end
383
425
 
384
- def kill_cursors_operation
385
- Operation::KillCursors.new(kill_cursors_op_spec)
386
- end
387
-
388
- def kill_cursors_op_spec
389
- if @server.with_connection { |connection| connection.features }.find_command_enabled?
390
- Builder::KillCursorsCommand.new(self).specification
391
- else
392
- Builder::OpKillCursors.new(self).specification
393
- end
394
- end
395
-
396
426
  def limited?
397
427
  limit ? limit > 0 : false
398
428
  end
@@ -433,5 +463,16 @@ module Mongo
433
463
  def unregister
434
464
  cluster.unregister_cursor(@cursor_id)
435
465
  end
466
+
467
+ def execute_operation(op)
468
+ context = Operation::Context.new(
469
+ client: client,
470
+ session: @session,
471
+ service_id: initial_result.connection_description.service_id,
472
+ )
473
+ op.execute(@server, context: context)
474
+ end
436
475
  end
437
476
  end
477
+
478
+ require 'mongo/cursor/kill_spec'
@@ -28,7 +28,7 @@ module Mongo
28
28
 
29
29
  def_delegators :@database, :cluster, :read_preference, :client
30
30
  # @api private
31
- def_delegators :@database, :server_selector, :read_concern
31
+ def_delegators :@database, :server_selector, :read_concern, :write_concern
32
32
  def_delegators :cluster, :next_primary
33
33
 
34
34
  # @return [ Integer ] batch_size The size of the batch of results
@@ -57,6 +57,7 @@ module Mongo
57
57
  #
58
58
  # See https://docs.mongodb.com/manual/reference/command/listCollections/
59
59
  # for more information and usage.
60
+ # @option options [ Session ] :session The session to use.
60
61
  #
61
62
  # @return [ Array<String> ] The names of all non-system collections.
62
63
  #
@@ -68,7 +69,7 @@ module Mongo
68
69
  send_initial_query(server, session, options.merge(name_only: true))
69
70
  end
70
71
  cursor.map do |info|
71
- if cursor.server.with_connection { |connection| connection.features }.list_collections_enabled?
72
+ if cursor.initial_result.connection_description.features.list_collections_enabled?
72
73
  info['name']
73
74
  else
74
75
  (info['name'] &&
@@ -100,12 +101,13 @@ module Mongo
100
101
  #
101
102
  # See https://docs.mongodb.com/manual/reference/command/listCollections/
102
103
  # for more information and usage.
104
+ # @option options [ Session ] :session The session to use.
103
105
  #
104
106
  # @return [ Array<Hash> ] Info for each collection in the database.
105
107
  #
106
108
  # @since 2.0.5
107
109
  def list_collections(options = {})
108
- session = client.send(:get_session)
110
+ session = client.send(:get_session, options)
109
111
  collections_info(session, ServerSelector.primary, options)
110
112
  end
111
113
 
@@ -253,12 +253,12 @@ module Mongo
253
253
 
254
254
  client.send(:with_session, opts) do |session|
255
255
  read_with_retry(session, preference) do |server|
256
- Operation::Command.new({
257
- :selector => operation.dup,
258
- :db_name => name,
259
- :read => preference,
260
- :session => session
261
- }).execute(server, context: Operation::Context.new(client: client, session: session))
256
+ Operation::Command.new(
257
+ selector: operation.dup,
258
+ db_name: name,
259
+ read: preference,
260
+ session: session,
261
+ ).execute(server, context: Operation::Context.new(client: client, session: session))
262
262
  end
263
263
  end
264
264
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Error
20
+
21
+ # Raised when the driver is in load-balancing mode but a connection
22
+ # is established to something other than a mongos.
23
+ class BadLoadBalancerTarget < Error
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Error
20
+
21
+ # Raised when the driver is in load-balancing mode via the URI option
22
+ # but a connection does not report a value in the serviceId field.
23
+ class MissingServiceId < Error
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Error
20
+
21
+ # Raised when the driver requires a connection to a particular service
22
+ # but no matching connections exist in the connection pool.
23
+ class NoServiceConnectionAvailable < Error
24
+ # @api private
25
+ def initialize(message, address:, service_id:)
26
+ super(message)
27
+
28
+ @address = address
29
+ @service_id = service_id
30
+ end
31
+
32
+ # @return [ Mongo::Address ] The address to which a connection was
33
+ # requested.
34
+ attr_reader :address
35
+
36
+ # @return [ nil | Object ] The service id.
37
+ attr_reader :service_id
38
+
39
+ # @api private
40
+ def self.generate(address:, service_id:)
41
+ new(
42
+ "The connection pool for #{address} does not have a connection for service #{service_id}",
43
+ address: address,
44
+ service_id: service_id,
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -63,6 +63,13 @@ module Mongo
63
63
  # @return [ Integer | nil ] Connection pool generation.
64
64
  attr_accessor :generation
65
65
 
66
+ # Returns service id for the connection on which the error occurred.
67
+ #
68
+ # @return [ Object | nil ] Service id.
69
+ #
70
+ # @api experimental
71
+ attr_accessor :service_id
72
+
66
73
  # @api public
67
74
  def to_s
68
75
  super + notes_tail
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Error
20
+
21
+ # Exception raised if an operation using a snapshot session is
22
+ # directed to a pre-5.0 server.
23
+ class SnapshotSessionInvalidServerVersion < Error
24
+
25
+ # Instantiate the new exception.
26
+ def initialize
27
+ super("Snapshot reads require MongoDB 5.0 or later")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2021 MongoDB Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Mongo
19
+ class Error
20
+
21
+ # Exception raised if a transaction is attempted on a snapshot session.
22
+ class SnapshotSessionTransactionProhibited < Error
23
+
24
+ # Instantiate the new exception.
25
+ def initialize
26
+ super("Transactions are not supported in snapshot sessions")
27
+ end
28
+ end
29
+ end
30
+ end
data/lib/mongo/error.rb CHANGED
@@ -168,6 +168,7 @@ module Mongo
168
168
  end
169
169
 
170
170
  require 'mongo/error/auth_error'
171
+ require 'mongo/error/bad_load_balancer_target'
171
172
  require 'mongo/error/sdam_error_detection'
172
173
  require 'mongo/error/parser'
173
174
  require 'mongo/error/write_retryable'
@@ -217,10 +218,13 @@ require 'mongo/error/mismatched_domain'
217
218
  require 'mongo/error/mongocryptd_spawn_error'
218
219
  require 'mongo/error/multi_index_drop'
219
220
  require 'mongo/error/need_primary_server'
221
+ require 'mongo/error/no_service_connection_available'
220
222
  require 'mongo/error/no_server_available'
221
223
  require 'mongo/error/no_srv_records'
222
224
  require 'mongo/error/session_ended'
223
225
  require 'mongo/error/sessions_not_supported'
226
+ require 'mongo/error/snapshot_session_invalid_server_version'
227
+ require 'mongo/error/snapshot_session_transaction_prohibited'
224
228
  require 'mongo/error/operation_failure'
225
229
  require 'mongo/error/pool_closed_error'
226
230
  require 'mongo/error/raise_original_error'
@@ -235,6 +239,7 @@ require 'mongo/error/missing_file_chunk'
235
239
  require 'mongo/error/missing_password'
236
240
  require 'mongo/error/missing_resume_token'
237
241
  require 'mongo/error/missing_scram_server_signature'
242
+ require 'mongo/error/missing_service_id'
238
243
  require 'mongo/error/server_api_conflict'
239
244
  require 'mongo/error/server_api_not_supported'
240
245
  require 'mongo/error/unknown_payload_type'
@@ -508,8 +508,27 @@ module Mongo
508
508
 
509
509
  def ensure_indexes!
510
510
  if files_collection.find({}, limit: 1, projection: { _id: 1 }).first.nil?
511
- chunks_collection.indexes.create_one(FSBucket::CHUNKS_INDEX, :unique => true)
512
- files_collection.indexes.create_one(FSBucket::FILES_INDEX)
511
+ create_index_if_missing!(files_collection, FSBucket::FILES_INDEX)
512
+ end
513
+
514
+ if chunks_collection.find({}, limit: 1, projection: { _id: 1 }).first.nil?
515
+ create_index_if_missing!(chunks_collection, FSBucket::CHUNKS_INDEX, :unique => true)
516
+ end
517
+ end
518
+
519
+ def create_index_if_missing!(collection, index_spec, options = {})
520
+ indexes_view = collection.indexes
521
+ begin
522
+ if indexes_view.get(index_spec).nil?
523
+ indexes_view.create_one(index_spec, options)
524
+ end
525
+ rescue Mongo::Error::OperationFailure => e
526
+ # proceed with index creation if a NamespaceNotFound error is thrown
527
+ if e.code == 26
528
+ indexes_view.create_one(index_spec, options)
529
+ else
530
+ raise
531
+ end
513
532
  end
514
533
  end
515
534
  end