mongo 2.15.0 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +1 -1
  4. data/lib/mongo/bulk_write.rb +2 -2
  5. data/lib/mongo/client.rb +45 -5
  6. data/lib/mongo/cluster/periodic_executor.rb +4 -3
  7. data/lib/mongo/cluster/reapers/cursor_reaper.rb +76 -43
  8. data/lib/mongo/cluster/sdam_flow.rb +9 -3
  9. data/lib/mongo/cluster/topology/base.rb +13 -9
  10. data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
  11. data/lib/mongo/cluster/topology.rb +28 -8
  12. data/lib/mongo/cluster.rb +136 -51
  13. data/lib/mongo/collection/view/aggregation.rb +5 -10
  14. data/lib/mongo/collection/view/builder/aggregation.rb +6 -5
  15. data/lib/mongo/collection/view/builder/map_reduce.rb +12 -49
  16. data/lib/mongo/collection/view/builder.rb +0 -4
  17. data/lib/mongo/collection/view/iterable.rb +58 -24
  18. data/lib/mongo/collection/view/map_reduce.rb +39 -15
  19. data/lib/mongo/collection/view/readable.rb +60 -51
  20. data/lib/mongo/collection/view/writable.rb +178 -175
  21. data/lib/mongo/collection/view.rb +15 -21
  22. data/lib/mongo/collection.rb +13 -13
  23. data/lib/mongo/cursor/kill_spec.rb +38 -0
  24. data/lib/mongo/cursor.rb +72 -31
  25. data/lib/mongo/database/view.rb +1 -1
  26. data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
  27. data/lib/mongo/error/missing_service_id.rb +26 -0
  28. data/lib/mongo/error/no_service_connection_available.rb +49 -0
  29. data/lib/mongo/error/notable.rb +7 -0
  30. data/lib/mongo/error.rb +3 -0
  31. data/lib/mongo/grid/fs_bucket.rb +21 -2
  32. data/lib/mongo/id.rb +7 -5
  33. data/lib/mongo/index/view.rb +22 -41
  34. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +7 -4
  35. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  36. data/lib/mongo/monitoring/event/command_started.rb +2 -0
  37. data/lib/mongo/monitoring/publishable.rb +2 -2
  38. data/lib/mongo/operation/aggregate/command.rb +8 -0
  39. data/lib/mongo/operation/context.rb +19 -1
  40. data/lib/mongo/operation/count/command.rb +6 -0
  41. data/lib/mongo/operation/count/op_msg.rb +6 -0
  42. data/lib/mongo/operation/create/command.rb +7 -1
  43. data/lib/mongo/operation/create/op_msg.rb +7 -0
  44. data/lib/mongo/operation/create_index/command.rb +17 -1
  45. data/lib/mongo/operation/create_index/op_msg.rb +17 -4
  46. data/lib/mongo/operation/delete/command.rb +6 -3
  47. data/lib/mongo/operation/delete/legacy.rb +9 -2
  48. data/lib/mongo/operation/delete/op_msg.rb +8 -1
  49. data/lib/mongo/operation/distinct/command.rb +6 -0
  50. data/lib/mongo/operation/distinct/op_msg.rb +7 -0
  51. data/lib/mongo/operation/explain/command.rb +13 -1
  52. data/lib/mongo/operation/explain/legacy.rb +12 -5
  53. data/lib/mongo/operation/explain/op_msg.rb +9 -1
  54. data/lib/mongo/operation/find/builder/command.rb +110 -0
  55. data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +10 -14
  56. data/lib/mongo/operation/find/builder/legacy.rb +123 -0
  57. data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +31 -25
  58. data/lib/mongo/{cursor → operation/find}/builder.rb +4 -4
  59. data/lib/mongo/operation/find/command.rb +9 -0
  60. data/lib/mongo/operation/find/legacy.rb +10 -1
  61. data/lib/mongo/operation/find/op_msg.rb +12 -0
  62. data/lib/mongo/operation/find.rb +1 -0
  63. data/lib/mongo/operation/get_more/command.rb +1 -0
  64. data/lib/mongo/operation/get_more/command_builder.rb +38 -0
  65. data/lib/mongo/operation/get_more/op_msg.rb +1 -0
  66. data/lib/mongo/operation/get_more.rb +1 -0
  67. data/lib/mongo/operation/kill_cursors/command.rb +8 -0
  68. data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
  69. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -1
  70. data/lib/mongo/operation/kill_cursors/op_msg.rb +10 -0
  71. data/lib/mongo/operation/kill_cursors.rb +1 -0
  72. data/lib/mongo/operation/map_reduce/command.rb +8 -0
  73. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  74. data/lib/mongo/operation/shared/executable.rb +15 -1
  75. data/lib/mongo/operation/shared/polymorphic_operation.rb +1 -1
  76. data/lib/mongo/operation/shared/read_preference_supported.rb +3 -1
  77. data/lib/mongo/operation/shared/response_handling.rb +1 -0
  78. data/lib/mongo/operation/shared/sessions_supported.rb +12 -12
  79. data/lib/mongo/operation/shared/specifiable.rb +11 -29
  80. data/lib/mongo/operation/shared/validatable.rb +87 -0
  81. data/lib/mongo/operation/shared/write.rb +1 -1
  82. data/lib/mongo/operation/update/command.rb +6 -3
  83. data/lib/mongo/operation/update/legacy.rb +19 -11
  84. data/lib/mongo/operation/update/op_msg.rb +7 -4
  85. data/lib/mongo/operation/write_command/command.rb +51 -0
  86. data/lib/mongo/operation/write_command/op_msg.rb +43 -0
  87. data/lib/mongo/operation/write_command.rb +32 -0
  88. data/lib/mongo/operation.rb +10 -0
  89. data/lib/mongo/protocol/query.rb +35 -18
  90. data/lib/mongo/server/connection.rb +25 -3
  91. data/lib/mongo/server/connection_base.rb +12 -1
  92. data/lib/mongo/server/connection_common.rb +38 -1
  93. data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
  94. data/lib/mongo/server/connection_pool.rb +100 -27
  95. data/lib/mongo/server/description/features.rb +17 -16
  96. data/lib/mongo/server/description/load_balancer.rb +33 -0
  97. data/lib/mongo/server/description.rb +85 -6
  98. data/lib/mongo/server/monitor/connection.rb +5 -6
  99. data/lib/mongo/server/monitor.rb +2 -1
  100. data/lib/mongo/server/pending_connection.rb +47 -31
  101. data/lib/mongo/server/push_monitor.rb +10 -1
  102. data/lib/mongo/server.rb +73 -26
  103. data/lib/mongo/server_selector/base.rb +5 -1
  104. data/lib/mongo/session/session_pool.rb +11 -0
  105. data/lib/mongo/session.rb +21 -1
  106. data/lib/mongo/socket/ocsp_verifier.rb +6 -37
  107. data/lib/mongo/uri/options_mapper.rb +1 -0
  108. data/lib/mongo/uri/srv_protocol.rb +6 -8
  109. data/lib/mongo/uri.rb +18 -0
  110. data/lib/mongo/utils.rb +0 -7
  111. data/lib/mongo/version.rb +1 -1
  112. data/mongo.gemspec +1 -1
  113. data/spec/integration/auth_spec.rb +31 -1
  114. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  115. data/spec/integration/bulk_write_spec.rb +1 -1
  116. data/spec/integration/change_stream_spec.rb +3 -3
  117. data/spec/integration/client_construction_spec.rb +54 -0
  118. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  119. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  120. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  121. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  122. data/spec/integration/client_spec.rb +2 -0
  123. data/spec/integration/command_monitoring_spec.rb +1 -1
  124. data/spec/integration/command_spec.rb +1 -1
  125. data/spec/integration/connection_spec.rb +52 -35
  126. data/spec/integration/crud_spec.rb +174 -1
  127. data/spec/integration/cursor_pinning_spec.rb +121 -0
  128. data/spec/integration/cursor_reaping_spec.rb +8 -4
  129. data/spec/integration/fork_reconnect_spec.rb +1 -5
  130. data/spec/integration/get_more_spec.rb +1 -1
  131. data/spec/integration/heartbeat_events_spec.rb +1 -1
  132. data/spec/integration/map_reduce_spec.rb +77 -0
  133. data/spec/integration/query_cache_spec.rb +47 -2
  134. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  135. data/spec/integration/read_concern_spec.rb +1 -1
  136. data/spec/integration/read_preference_spec.rb +1 -1
  137. data/spec/integration/reconnect_spec.rb +30 -12
  138. data/spec/integration/retryable_errors_spec.rb +1 -1
  139. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  140. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  141. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  142. data/spec/integration/sdam_events_spec.rb +35 -19
  143. data/spec/integration/sdam_prose_spec.rb +1 -1
  144. data/spec/integration/server_monitor_spec.rb +1 -0
  145. data/spec/integration/server_selector_spec.rb +22 -5
  146. data/spec/integration/server_spec.rb +2 -0
  147. data/spec/integration/srv_monitoring_spec.rb +1 -1
  148. data/spec/integration/step_down_spec.rb +1 -1
  149. data/spec/integration/transaction_pinning_spec.rb +120 -0
  150. data/spec/integration/versioned_api_examples_spec.rb +45 -0
  151. data/spec/integration/x509_auth_spec.rb +1 -1
  152. data/spec/lite_spec_helper.rb +1 -2
  153. data/spec/mongo/address/unix_spec.rb +1 -0
  154. data/spec/mongo/auth/cr_spec.rb +2 -3
  155. data/spec/mongo/auth/ldap_spec.rb +2 -3
  156. data/spec/mongo/auth/scram_spec.rb +2 -3
  157. data/spec/mongo/auth/user/view_spec.rb +1 -1
  158. data/spec/mongo/auth/x509_spec.rb +2 -3
  159. data/spec/mongo/bulk_write_spec.rb +3 -3
  160. data/spec/mongo/client_construction_spec.rb +259 -28
  161. data/spec/mongo/client_spec.rb +6 -4
  162. data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
  163. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  164. data/spec/mongo/cluster_spec.rb +44 -3
  165. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  166. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  167. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  168. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  169. data/spec/mongo/collection_crud_spec.rb +7 -2
  170. data/spec/mongo/collection_ddl_spec.rb +1 -1
  171. data/spec/mongo/collection_spec.rb +1 -1
  172. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  173. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  174. data/spec/mongo/cursor_spec.rb +15 -5
  175. data/spec/mongo/database_spec.rb +15 -15
  176. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  177. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  178. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  179. data/spec/mongo/grid/stream_spec.rb +1 -1
  180. data/spec/mongo/index/view_spec.rb +2 -2
  181. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  182. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  183. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  184. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  185. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  186. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  187. data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
  188. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  189. data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
  190. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  191. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  192. data/spec/mongo/query_cache_spec.rb +6 -2
  193. data/spec/mongo/server/connection_common_spec.rb +62 -11
  194. data/spec/mongo/server/connection_pool_spec.rb +73 -7
  195. data/spec/mongo/server/connection_spec.rb +138 -43
  196. data/spec/mongo/server/description_spec.rb +1 -1
  197. data/spec/mongo/server/monitor/connection_spec.rb +22 -0
  198. data/spec/mongo/server/monitor_spec.rb +4 -3
  199. data/spec/mongo/server/push_monitor_spec.rb +101 -0
  200. data/spec/mongo/session/session_pool_spec.rb +42 -10
  201. data/spec/mongo/session_transaction_spec.rb +15 -30
  202. data/spec/mongo/socket/unix_spec.rb +1 -0
  203. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  204. data/spec/runners/change_streams/test.rb +1 -1
  205. data/spec/runners/cmap.rb +1 -1
  206. data/spec/runners/connection_string.rb +7 -3
  207. data/spec/runners/crud/operation.rb +5 -3
  208. data/spec/runners/crud/requirement.rb +1 -0
  209. data/spec/runners/crud.rb +1 -1
  210. data/spec/runners/sdam.rb +2 -1
  211. data/spec/runners/transactions/test.rb +2 -2
  212. data/spec/runners/unified/assertions.rb +2 -3
  213. data/spec/runners/unified/event_subscriber.rb +2 -2
  214. data/spec/runners/unified/support_operations.rb +10 -2
  215. data/spec/runners/unified/test.rb +3 -0
  216. data/spec/runners/unified.rb +1 -1
  217. data/spec/shared/lib/mrss/cluster_config.rb +6 -1
  218. data/spec/shared/lib/mrss/constraints.rb +11 -5
  219. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  220. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  221. data/spec/shared/share/Dockerfile.erb +5 -4
  222. data/spec/shared/shlib/server.sh +70 -20
  223. data/spec/spec_tests/change_streams_spec.rb +1 -1
  224. data/spec/spec_tests/cmap_spec.rb +4 -1
  225. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  226. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  227. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  228. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  229. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  230. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  231. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  232. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  233. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  234. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  235. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  236. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  237. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  238. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  239. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  240. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  241. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  242. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  243. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  244. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  245. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  246. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  247. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  248. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  249. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  250. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  251. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  252. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  253. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  254. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  255. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  256. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  257. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  258. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  259. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  260. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  261. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  262. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  263. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  264. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  265. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  266. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  267. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  268. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  269. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  270. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  271. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  272. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  273. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  274. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  275. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  276. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  277. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  278. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  279. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  280. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  281. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  282. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  283. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  284. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  285. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  286. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  287. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  288. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  289. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  290. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  291. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  292. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  293. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  294. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  295. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  296. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  297. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  298. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  299. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  300. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  301. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  302. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  303. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  304. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  305. data/spec/spec_tests/sdam_spec.rb +1 -1
  306. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  307. data/spec/spec_tests/uri_options_spec.rb +4 -4
  308. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  309. data/spec/stress/push_monitor_close_spec.rb +44 -0
  310. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  311. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  312. data/spec/support/common_shortcuts.rb +2 -3
  313. data/spec/support/matchers.rb +13 -0
  314. data/spec/support/shared/auth_context.rb +16 -0
  315. data/spec/support/shared/session.rb +2 -2
  316. data/spec/support/spec_config.rb +10 -11
  317. data/spec/support/using_hash.rb +31 -0
  318. data/spec/support/utils.rb +1 -1
  319. data.tar.gz.sig +0 -0
  320. metadata +1077 -1029
  321. metadata.gz.sig +0 -0
  322. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  323. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  324. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  325. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  326. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  327. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  328. data/lib/mongo/server/context.rb +0 -72
  329. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  330. data/spec/runners/unified/using_hash.rb +0 -34
  331. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  332. data/spec/support/event_subscriber.rb +0 -221
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2015-2020 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
+ module Operation
20
+ class Find
21
+ module Builder
22
+
23
+ # Builds a legacy OP_QUERY specification from options.
24
+ #
25
+ # @api private
26
+ module Legacy
27
+
28
+ # Mappings from driver options to legacy server values.
29
+ #
30
+ # @since 2.2.0
31
+ DRIVER_MAPPINGS = {
32
+ comment: '$comment',
33
+ explain: '$explain',
34
+ hint: '$hint',
35
+ max_scan: '$maxScan',
36
+ max_time_ms: '$maxTimeMS',
37
+ max_value: '$max',
38
+ min_value: '$min',
39
+ show_disk_loc: '$showDiskLoc',
40
+ snapshot: '$snapshot',
41
+ sort: '$orderby',
42
+ return_key: '$returnKey',
43
+ }.freeze
44
+
45
+ module_function def selector(spec, connection)
46
+ if Lint.enabled?
47
+ if spec.keys.any? { |k| String === k }
48
+ raise Error::LintError, "The spec must contain symbol keys only"
49
+ end
50
+ end
51
+
52
+ # Server versions that do not have the find command feature
53
+ # (versions older than 3.2) do not support the allow_disk_use option
54
+ # but perform no validation and will not raise an error if it is
55
+ # specified. If the allow_disk_use option is specified, raise an error
56
+ # to alert the user.
57
+ unless spec[:allow_disk_use].nil?
58
+ raise Error::UnsupportedOption.allow_disk_use_error
59
+ end
60
+
61
+ if spec[:collation] && !connection.features.collation_enabled?
62
+ raise Error::UnsupportedCollation
63
+ end
64
+
65
+ modifiers = {}
66
+ DRIVER_MAPPINGS.each do |k, server_k|
67
+ unless (value = spec[k]).nil?
68
+ modifiers[server_k] = value
69
+ end
70
+ end
71
+
72
+ selector = spec[:filter] || BSON::Document.new
73
+ # Write nil into rp if not talking to mongos, rather than false
74
+ rp = if connection.description.mongos?
75
+ read_pref_formatted(spec)
76
+ end
77
+ if modifiers.any? || rp
78
+ selector = {'$query' => selector}.update(modifiers)
79
+
80
+ if rp
81
+ selector['$readPreference'] = rp
82
+ end
83
+ end
84
+
85
+ selector
86
+ end
87
+
88
+ module_function def query_options(spec, connection)
89
+ query_options = {
90
+ project: spec[:projection],
91
+ skip: spec[:skip],
92
+ limit: spec[:limit],
93
+ # batch_size is converted to batchSize by Mongo::Protocol::Query.
94
+ batch_size: spec[:batch_size],
95
+ }
96
+
97
+ unless (flags = Builder::Flags.map_flags(spec)).empty?
98
+ query_options[:flags] = ((query_options[:flags] || []) + flags).uniq
99
+ end
100
+
101
+ query_options
102
+ end
103
+
104
+ private
105
+
106
+ module_function def read_pref_formatted(spec)
107
+ if spec[:read_preference]
108
+ raise ArgumentError, "Spec cannot include :read_preference here, use :read"
109
+ end
110
+
111
+ if read = spec[:read]
112
+ read_pref = ServerSelector.get(read).to_mongos
113
+ Mongo::Lint.validate_camel_case_read_preference(read_pref)
114
+ read_pref
115
+ else
116
+ nil
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -16,64 +16,70 @@
16
16
  # limitations under the License.
17
17
 
18
18
  module Mongo
19
- class Collection
20
- class View
19
+ module Operation
20
+ class Find
21
21
  module Builder
22
22
 
23
- # Provides behavior for mapping modifiers.
23
+ # Provides behavior for mapping Ruby options to legacy OP_QUERY
24
+ # find modifiers.
24
25
  #
25
- # @since 2.2.0
26
+ # This module is used in two ways:
27
+ # 1. When Collection#find is invoked with the legacy OP_QUERY
28
+ # syntax (:$query argument etc.), this module is used to map
29
+ # the legacy parameters into the Ruby options that normally
30
+ # are used by applications.
31
+ # 2. When sending a find operation using the OP_QUERY protocol,
32
+ # this module is used to map the Ruby find options to the
33
+ # modifiers in the wire protocol message.
34
+ #
35
+ # @api private
26
36
  module Modifiers
27
- extend self
28
37
 
29
- # Mappings from driver options to legacy server values.
30
- #
31
- # @since 2.2.0
38
+ # Mappings from Ruby options to OP_QUERY modifiers.
32
39
  DRIVER_MAPPINGS = BSON::Document.new(
33
- sort: '$orderby',
34
- hint: '$hint',
35
40
  comment: '$comment',
36
- snapshot: '$snapshot',
41
+ explain: '$explain',
42
+ hint: '$hint',
37
43
  max_scan: '$maxScan',
44
+ max_time_ms: '$maxTimeMS',
38
45
  max_value: '$max',
39
46
  min_value: '$min',
40
- max_time_ms: '$maxTimeMS',
41
47
  return_key: '$returnKey',
42
48
  show_disk_loc: '$showDiskLoc',
43
- explain: '$explain'
49
+ snapshot: '$snapshot',
50
+ sort: '$orderby',
44
51
  ).freeze
45
52
 
46
- # Mappings from server values to driver options.
47
- #
48
- # @since 2.2.0
53
+ # Mappings from OP_QUERY modifiers to Ruby options.
49
54
  SERVER_MAPPINGS = BSON::Document.new(DRIVER_MAPPINGS.invert).freeze
50
55
 
51
- # Transform the provided server modifiers to driver options.
56
+ # Transform the provided OP_QUERY modifiers to Ruby options.
52
57
  #
53
58
  # @example Transform to driver options.
54
59
  # Modifiers.map_driver_options(modifiers)
55
60
  #
56
61
  # @param [ Hash ] modifiers The modifiers.
57
62
  #
58
- # @return [ BSON::Document ] The driver options.
59
- #
60
- # @since 2.2.0
61
- def self.map_driver_options(modifiers)
63
+ # @return [ BSON::Document ] The Ruby options.
64
+ module_function def map_driver_options(modifiers)
62
65
  Options::Mapper.transform_documents(modifiers, SERVER_MAPPINGS)
63
66
  end
64
67
 
65
- # Transform the provided options into a document of only server
68
+ # Transform the provided Ruby options into a document of OP_QUERY
66
69
  # modifiers.
67
70
  #
71
+ # Accepts both string and symbol keys.
72
+ #
73
+ # The input mapping may contain additional keys that do not map to
74
+ # OP_QUERY modifiers, in which case the extra keys are ignored.
75
+ #
68
76
  # @example Map the server modifiers.
69
77
  # Modifiers.map_server_modifiers(options)
70
78
  #
71
79
  # @param [ Hash, BSON::Document ] options The options.
72
80
  #
73
81
  # @return [ BSON::Document ] The modifiers.
74
- #
75
- # @since 2.2.0
76
- def self.map_server_modifiers(options)
82
+ module_function def map_server_modifiers(options)
77
83
  Options::Mapper.transform_documents(options, DRIVER_MAPPINGS)
78
84
  end
79
85
  end
@@ -15,7 +15,7 @@
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/op_get_more'
19
- require 'mongo/cursor/builder/op_kill_cursors'
20
- require 'mongo/cursor/builder/get_more_command'
21
- require 'mongo/cursor/builder/kill_cursors_command'
18
+ require 'mongo/operation/find/builder/command'
19
+ require 'mongo/operation/find/builder/flags'
20
+ require 'mongo/operation/find/builder/legacy'
21
+ require 'mongo/operation/find/builder/modifiers'
@@ -33,6 +33,15 @@ module Mongo
33
33
 
34
34
  private
35
35
 
36
+ def selector(connection)
37
+ # The mappings are BSON::Documents and as such store keys as
38
+ # strings, the spec here has symbol keys
39
+ spec = BSON::Document.new(self.spec)
40
+ {
41
+ find: coll_name,
42
+ }.update(Find::Builder::Command.selector(spec, connection))
43
+ end
44
+
36
45
  def message(connection)
37
46
  Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
38
47
  end
@@ -35,7 +35,16 @@ module Mongo
35
35
  private
36
36
 
37
37
  def message(connection)
38
- Protocol::Query.new(db_name, coll_name, command(connection), options(connection))
38
+ selector = Find::Builder::Legacy.selector(spec, connection)
39
+ options = options(connection).update(
40
+ Find::Builder::Legacy.query_options(spec, connection),
41
+ )
42
+ Protocol::Query.new(
43
+ db_name,
44
+ coll_name,
45
+ selector,
46
+ options,
47
+ )
39
48
  end
40
49
  end
41
50
  end
@@ -28,6 +28,18 @@ module Mongo
28
28
  include CausalConsistencySupported
29
29
  include ExecutableTransactionLabel
30
30
  include PolymorphicResult
31
+
32
+ private
33
+
34
+ def selector(connection)
35
+ # The mappings are BSON::Documents and as such store keys as
36
+ # strings, the spec here has symbol keys.
37
+ spec = BSON::Document.new(self.spec)
38
+ {
39
+ find: coll_name,
40
+ Protocol::Msg::DATABASE_IDENTIFIER => db_name,
41
+ }.update(Find::Builder::Command.selector(spec, connection))
42
+ end
31
43
  end
32
44
  end
33
45
  end
@@ -19,6 +19,7 @@ require 'mongo/operation/find/command'
19
19
  require 'mongo/operation/find/op_msg'
20
20
  require 'mongo/operation/find/legacy'
21
21
  require 'mongo/operation/find/result'
22
+ require 'mongo/operation/find/builder'
22
23
 
23
24
  module Mongo
24
25
  module Operation
@@ -30,6 +30,7 @@ module Mongo
30
30
  include Limited
31
31
  include ReadPreferenceSupported
32
32
  include PolymorphicResult
33
+ include CommandBuilder
33
34
 
34
35
  private
35
36
 
@@ -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
+ module Operation
20
+ class GetMore
21
+
22
+ # @api private
23
+ module CommandBuilder
24
+
25
+ private
26
+
27
+ def selector(connection)
28
+ {
29
+ getMore: BSON::Int64.new(spec.fetch(:cursor_id)),
30
+ collection: spec.fetch(:coll_name),
31
+ batchSize: spec[:batch_size],
32
+ maxTimeMS: spec[:max_time_ms],
33
+ }.compact
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -27,6 +27,7 @@ module Mongo
27
27
  class OpMsg < OpMsgBase
28
28
  include ExecutableTransactionLabel
29
29
  include PolymorphicResult
30
+ include CommandBuilder
30
31
  end
31
32
  end
32
33
  end
@@ -15,6 +15,7 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
+ require 'mongo/operation/get_more/command_builder'
18
19
  require 'mongo/operation/get_more/command'
19
20
  require 'mongo/operation/get_more/op_msg'
20
21
  require 'mongo/operation/get_more/legacy'
@@ -28,9 +28,17 @@ module Mongo
28
28
  include Specifiable
29
29
  include Executable
30
30
  include Limited
31
+ include CommandBuilder
31
32
 
32
33
  private
33
34
 
35
+ def selector(connection)
36
+ {
37
+ killCursors: coll_name,
38
+ cursors: int64_cursor_ids,
39
+ }
40
+ end
41
+
34
42
  def message(connection)
35
43
  Protocol::Query.new(db_name, Database::COMMAND, selector(connection), options(connection))
36
44
  end
@@ -0,0 +1,35 @@
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
+ module Operation
20
+ class KillCursors
21
+
22
+ # @api private
23
+ module CommandBuilder
24
+
25
+ private
26
+
27
+ def int64_cursor_ids
28
+ spec.fetch(:cursor_ids).map do |id|
29
+ BSON::Int64.new(id)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -27,11 +27,12 @@ module Mongo
27
27
  class Legacy
28
28
  include Specifiable
29
29
  include Executable
30
+ include CommandBuilder
30
31
 
31
32
  private
32
33
 
33
34
  def message(connection)
34
- Protocol::KillCursors.new(coll_name, db_name, cursor_ids)
35
+ Protocol::KillCursors.new(coll_name, db_name, int64_cursor_ids)
35
36
  end
36
37
  end
37
38
  end
@@ -26,6 +26,16 @@ module Mongo
26
26
  # @since 2.5.2
27
27
  class OpMsg < OpMsgBase
28
28
  include ExecutableTransactionLabel
29
+ include CommandBuilder
30
+
31
+ private
32
+
33
+ def selector(connection)
34
+ {
35
+ killCursors: coll_name,
36
+ cursors: int64_cursor_ids,
37
+ }
38
+ end
29
39
  end
30
40
  end
31
41
  end
@@ -15,6 +15,7 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
 
18
+ require 'mongo/operation/kill_cursors/command_builder'
18
19
  require 'mongo/operation/kill_cursors/command'
19
20
  require 'mongo/operation/kill_cursors/op_msg'
20
21
  require 'mongo/operation/kill_cursors/legacy'
@@ -34,6 +34,14 @@ module Mongo
34
34
 
35
35
  private
36
36
 
37
+ def selector(connection)
38
+ super.tap do |selector|
39
+ if selector[:collation] && !connection.features.collation_enabled?
40
+ raise Error::UnsupportedCollation
41
+ end
42
+ end
43
+ end
44
+
37
45
  def message(connection)
38
46
  Protocol::Query.new(db_name, Database::COMMAND, command(connection), options(connection))
39
47
  end
@@ -19,7 +19,7 @@ module Mongo
19
19
  module Operation
20
20
  class MapReduce
21
21
 
22
- # A MongoDB mapreduce operation sent as an op message.
22
+ # A MongoDB map-reduce operation sent as an op message.
23
23
  #
24
24
  # @api private
25
25
  #
@@ -31,6 +31,19 @@ module Mongo
31
31
  add_error_labels(connection, context) do
32
32
  add_server_diagnostics(connection) do
33
33
  get_result(connection, context, options).tap do |result|
34
+ if session
35
+ if session.in_transaction? &&
36
+ connection.description.load_balancer?
37
+ then
38
+ if session.pinned_service_id
39
+ unless session.pinned_service_id == connection.service_id
40
+ raise Error::InternalDriverError, "Expected operation to use service #{session.pinned_session_id} but it used #{connection.service_id}"
41
+ end
42
+ else
43
+ session.pin_to_service(connection.service_id)
44
+ end
45
+ end
46
+ end
34
47
  process_result(result, connection)
35
48
  end
36
49
  end
@@ -93,7 +106,7 @@ module Mongo
93
106
 
94
107
  def process_result_for_sdam(result, connection)
95
108
  if (result.not_master? || result.node_recovering?) &&
96
- connection.generation >= connection.server.pool.generation
109
+ connection.generation >= connection.server.pool.generation(service_id: connection.service_id)
97
110
  then
98
111
  if result.node_shutting_down?
99
112
  keep_pool = false
@@ -105,6 +118,7 @@ module Mongo
105
118
  connection.server.unknown!(
106
119
  keep_connection_pool: keep_pool,
107
120
  generation: connection.generation,
121
+ service_id: connection.service_id,
108
122
  topology_version: result.topology_version,
109
123
  )
110
124
 
@@ -32,7 +32,7 @@ module Mongo
32
32
  #
33
33
  # @return [ Mongo::Operation::Result ] The operation result.
34
34
  def execute(server, context:, options: {})
35
- server.with_connection do |connection|
35
+ server.with_connection(service_id: context.service_id) do |connection|
36
36
  operation = final_operation(connection)
37
37
  operation.execute(connection, context: context, options: options)
38
38
  end
@@ -96,7 +96,9 @@ module Mongo
96
96
  #
97
97
  # @return [ Hash ] New command document to send to the server.
98
98
  def add_read_preference_legacy(sel, connection)
99
- if read && connection.description.mongos? && read_pref = read.to_mongos
99
+ if read && (
100
+ connection.description.mongos? || connection.description.load_balancer?
101
+ ) && read_pref = read.to_mongos
100
102
  # If the read preference contains only mode and mode is secondary
101
103
  # preferred and we are sending to a pre-OP_MSG server, this read
102
104
  # preference is indicated by the :secondary_ok wire protocol flag
@@ -112,6 +112,7 @@ module Mongo
112
112
  rescue Error, Error::AuthError => e
113
113
  e.add_note("on #{connection.address.seed}")
114
114
  e.generation = connection.generation
115
+ e.service_id = connection.service_id
115
116
  raise e
116
117
  end
117
118
 
@@ -133,7 +133,7 @@ module Mongo
133
133
  end
134
134
  end
135
135
 
136
- sel = selector(connection).dup
136
+ sel = BSON::Document.new(selector(connection))
137
137
  add_write_concern!(sel)
138
138
  sel[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
139
139
 
@@ -169,8 +169,11 @@ module Mongo
169
169
  Lint.assert_type(connection, Server::Connection)
170
170
 
171
171
  # https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#topology-type-single
172
- if connection.description.standalone?
172
+ read_doc = if connection.description.standalone?
173
173
  # Read preference is never sent to standalones.
174
+ nil
175
+ elsif connection.server.load_balancer?
176
+ read&.to_mongos
174
177
  elsif connection.description.mongos?
175
178
  # When server is a mongos:
176
179
  # - $readPreference is never sent when mode is 'primary'
@@ -178,12 +181,7 @@ module Mongo
178
181
  # When mode is 'secondaryPreferred' $readPreference is currently
179
182
  # required to only be sent when a non-mode field (i.e. tag_sets)
180
183
  # is present, but this causes wrong behavior (DRIVERS-1642).
181
- if read
182
- doc = read.to_mongos
183
- if doc
184
- sel['$readPreference'] = doc
185
- end
186
- end
184
+ read&.to_mongos
187
185
  elsif connection.server.cluster.single?
188
186
  # In Single topology:
189
187
  # - If no read preference is specified by the application, the driver
@@ -198,13 +196,15 @@ module Mongo
198
196
  if [nil, 'primary'].include?(read_doc['mode'])
199
197
  read_doc['mode'] = 'primaryPreferred'
200
198
  end
201
- sel['$readPreference'] = read_doc
199
+ read_doc
202
200
  else
203
201
  # In replica sets, read preference is passed to the server if one
204
202
  # is specified by the application, and there is no default.
205
- if read
206
- sel['$readPreference'] = read.to_doc
207
- end
203
+ read&.to_doc
204
+ end
205
+
206
+ if read_doc
207
+ sel['$readPreference'] = read_doc
208
208
  end
209
209
  end
210
210