mongo 2.15.1 → 2.16.0.alpha1

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 (326) 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 +42 -18
  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 +62 -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.rb +73 -26
  102. data/lib/mongo/server_selector/base.rb +5 -1
  103. data/lib/mongo/session/session_pool.rb +11 -0
  104. data/lib/mongo/session.rb +21 -1
  105. data/lib/mongo/socket/ocsp_verifier.rb +6 -37
  106. data/lib/mongo/uri/options_mapper.rb +1 -0
  107. data/lib/mongo/uri/srv_protocol.rb +6 -8
  108. data/lib/mongo/uri.rb +18 -0
  109. data/lib/mongo/utils.rb +0 -7
  110. data/lib/mongo/version.rb +1 -1
  111. data/mongo.gemspec +1 -1
  112. data/spec/integration/auth_spec.rb +31 -1
  113. data/spec/integration/awaited_ismaster_spec.rb +1 -1
  114. data/spec/integration/bulk_write_spec.rb +1 -1
  115. data/spec/integration/change_stream_spec.rb +3 -3
  116. data/spec/integration/client_construction_spec.rb +54 -0
  117. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +1 -1
  118. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +1 -1
  119. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +1 -1
  120. data/spec/integration/client_side_encryption/data_key_spec.rb +1 -1
  121. data/spec/integration/client_spec.rb +2 -0
  122. data/spec/integration/command_monitoring_spec.rb +1 -1
  123. data/spec/integration/command_spec.rb +1 -1
  124. data/spec/integration/connection_spec.rb +52 -35
  125. data/spec/integration/crud_spec.rb +174 -1
  126. data/spec/integration/cursor_pinning_spec.rb +121 -0
  127. data/spec/integration/cursor_reaping_spec.rb +8 -4
  128. data/spec/integration/fork_reconnect_spec.rb +1 -5
  129. data/spec/integration/get_more_spec.rb +1 -1
  130. data/spec/integration/heartbeat_events_spec.rb +1 -1
  131. data/spec/integration/map_reduce_spec.rb +77 -0
  132. data/spec/integration/query_cache_spec.rb +2 -2
  133. data/spec/integration/query_cache_transactions_spec.rb +1 -1
  134. data/spec/integration/read_concern_spec.rb +1 -1
  135. data/spec/integration/read_preference_spec.rb +1 -1
  136. data/spec/integration/reconnect_spec.rb +30 -12
  137. data/spec/integration/retryable_errors_spec.rb +1 -1
  138. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  139. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
  140. data/spec/integration/sdam_error_handling_spec.rb +5 -3
  141. data/spec/integration/sdam_events_spec.rb +35 -19
  142. data/spec/integration/sdam_prose_spec.rb +1 -1
  143. data/spec/integration/server_monitor_spec.rb +1 -0
  144. data/spec/integration/server_selector_spec.rb +22 -5
  145. data/spec/integration/server_spec.rb +2 -0
  146. data/spec/integration/srv_monitoring_spec.rb +1 -1
  147. data/spec/integration/step_down_spec.rb +1 -1
  148. data/spec/integration/transaction_pinning_spec.rb +120 -0
  149. data/spec/integration/versioned_api_examples_spec.rb +45 -0
  150. data/spec/integration/x509_auth_spec.rb +1 -1
  151. data/spec/lite_spec_helper.rb +1 -2
  152. data/spec/mongo/address/unix_spec.rb +1 -0
  153. data/spec/mongo/auth/cr_spec.rb +2 -3
  154. data/spec/mongo/auth/ldap_spec.rb +2 -3
  155. data/spec/mongo/auth/scram_spec.rb +2 -3
  156. data/spec/mongo/auth/user/view_spec.rb +1 -1
  157. data/spec/mongo/auth/x509_spec.rb +2 -3
  158. data/spec/mongo/bulk_write_spec.rb +3 -3
  159. data/spec/mongo/client_construction_spec.rb +259 -28
  160. data/spec/mongo/client_spec.rb +6 -4
  161. data/spec/mongo/cluster/cursor_reaper_spec.rb +36 -21
  162. data/spec/mongo/cluster/periodic_executor_spec.rb +3 -1
  163. data/spec/mongo/cluster_spec.rb +44 -3
  164. data/spec/mongo/collection/view/aggregation_spec.rb +1 -1
  165. data/spec/mongo/collection/view/builder/find_command_spec.rb +4 -0
  166. data/spec/mongo/collection/view/builder/op_query_spec.rb +4 -0
  167. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  168. data/spec/mongo/collection_crud_spec.rb +7 -2
  169. data/spec/mongo/collection_ddl_spec.rb +1 -1
  170. data/spec/mongo/collection_spec.rb +1 -1
  171. data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -0
  172. data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -0
  173. data/spec/mongo/cursor_spec.rb +15 -5
  174. data/spec/mongo/database_spec.rb +15 -15
  175. data/spec/mongo/error/operation_failure_heavy_spec.rb +1 -1
  176. data/spec/mongo/grid/fs_bucket_spec.rb +18 -12
  177. data/spec/mongo/grid/stream/write_spec.rb +3 -9
  178. data/spec/mongo/grid/stream_spec.rb +1 -1
  179. data/spec/mongo/index/view_spec.rb +2 -2
  180. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -1
  181. data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +2 -2
  182. data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +2 -2
  183. data/spec/mongo/operation/find/legacy_spec.rb +1 -0
  184. data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
  185. data/spec/mongo/operation/insert/op_msg_spec.rb +1 -1
  186. data/spec/mongo/operation/kill_cursors_spec.rb +4 -1
  187. data/spec/mongo/operation/read_preference_legacy_spec.rb +4 -0
  188. data/spec/mongo/operation/read_preference_op_msg_spec.rb +2 -0
  189. data/spec/mongo/operation/update/bulk_spec.rb +1 -1
  190. data/spec/mongo/operation/update/op_msg_spec.rb +1 -1
  191. data/spec/mongo/query_cache_spec.rb +6 -2
  192. data/spec/mongo/server/connection_common_spec.rb +62 -11
  193. data/spec/mongo/server/connection_pool_spec.rb +73 -7
  194. data/spec/mongo/server/connection_spec.rb +138 -43
  195. data/spec/mongo/server/description_spec.rb +1 -1
  196. data/spec/mongo/server/monitor_spec.rb +4 -3
  197. data/spec/mongo/session/session_pool_spec.rb +42 -10
  198. data/spec/mongo/session_transaction_spec.rb +15 -30
  199. data/spec/mongo/socket/unix_spec.rb +1 -0
  200. data/spec/mongo/uri_option_parsing_spec.rb +38 -5
  201. data/spec/runners/change_streams/test.rb +1 -1
  202. data/spec/runners/cmap.rb +1 -1
  203. data/spec/runners/connection_string.rb +7 -3
  204. data/spec/runners/crud/operation.rb +5 -3
  205. data/spec/runners/crud/requirement.rb +1 -0
  206. data/spec/runners/crud.rb +1 -1
  207. data/spec/runners/sdam.rb +2 -1
  208. data/spec/runners/transactions/test.rb +2 -2
  209. data/spec/runners/unified/assertions.rb +2 -3
  210. data/spec/runners/unified/event_subscriber.rb +2 -2
  211. data/spec/runners/unified/test.rb +3 -0
  212. data/spec/runners/unified.rb +1 -1
  213. data/spec/shared/lib/mrss/constraints.rb +11 -5
  214. data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
  215. data/spec/shared/lib/mrss/server_version_registry.rb +17 -12
  216. data/spec/shared/share/Dockerfile.erb +2 -1
  217. data/spec/shared/shlib/server.sh +70 -20
  218. data/spec/spec_tests/change_streams_spec.rb +1 -1
  219. data/spec/spec_tests/cmap_spec.rb +4 -1
  220. data/spec/spec_tests/command_monitoring_spec.rb +2 -2
  221. data/spec/spec_tests/data/command_monitoring/find.yml +9 -9
  222. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
  223. data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
  224. data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
  225. data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
  226. data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
  227. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
  228. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
  229. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
  230. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
  231. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
  232. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
  233. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
  234. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
  235. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
  236. data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
  237. data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
  238. data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
  239. data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
  240. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +1 -1
  241. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
  242. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +1 -1
  243. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
  244. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +1 -1
  245. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
  246. data/spec/spec_tests/data/retryable_reads/mapReduce.yml +3 -1
  247. data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
  248. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +2 -0
  249. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +2 -0
  250. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +3 -1
  251. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +3 -1
  252. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +2 -0
  253. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +2 -0
  254. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +2 -0
  255. data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
  256. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
  257. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
  258. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
  259. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
  260. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
  261. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
  262. data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
  263. data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
  264. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
  265. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
  266. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
  267. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
  268. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
  269. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
  270. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
  271. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
  272. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
  273. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
  274. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
  275. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
  276. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
  277. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
  278. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
  279. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
  280. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
  281. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
  282. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
  283. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
  284. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
  285. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
  286. data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
  287. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
  288. data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
  289. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +2 -0
  290. data/spec/spec_tests/data/transactions/retryable-abort.yml +2 -0
  291. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +2 -0
  292. data/spec/spec_tests/data/transactions/retryable-commit.yml +2 -0
  293. data/spec/spec_tests/data/transactions/retryable-writes.yml +2 -0
  294. data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
  295. data/spec/spec_tests/load_balancers_spec.rb +15 -0
  296. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  297. data/spec/spec_tests/retryable_writes_spec.rb +1 -1
  298. data/spec/spec_tests/sdam_integration_spec.rb +1 -1
  299. data/spec/spec_tests/sdam_monitoring_spec.rb +10 -5
  300. data/spec/spec_tests/sdam_spec.rb +1 -1
  301. data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
  302. data/spec/spec_tests/uri_options_spec.rb +4 -4
  303. data/spec/stress/fork_reconnect_stress_spec.rb +1 -5
  304. data/spec/support/certificates/atlas-ocsp-ca.crt +82 -90
  305. data/spec/support/certificates/atlas-ocsp.crt +127 -122
  306. data/spec/support/common_shortcuts.rb +2 -3
  307. data/spec/support/matchers.rb +13 -0
  308. data/spec/support/shared/auth_context.rb +16 -0
  309. data/spec/support/shared/session.rb +2 -2
  310. data/spec/support/spec_config.rb +9 -10
  311. data/spec/support/using_hash.rb +31 -0
  312. data/spec/support/utils.rb +1 -1
  313. data.tar.gz.sig +0 -0
  314. metadata +120 -76
  315. metadata.gz.sig +0 -0
  316. data/lib/mongo/collection/view/builder/find_command.rb +0 -173
  317. data/lib/mongo/collection/view/builder/op_query.rb +0 -94
  318. data/lib/mongo/cursor/builder/get_more_command.rb +0 -80
  319. data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -111
  320. data/lib/mongo/cursor/builder/op_get_more.rb +0 -64
  321. data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -106
  322. data/lib/mongo/server/context.rb +0 -72
  323. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -66
  324. data/spec/runners/unified/using_hash.rb +0 -34
  325. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -79
  326. data/spec/support/event_subscriber.rb +0 -221
@@ -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
 
@@ -60,11 +60,6 @@ module Mongo
60
60
  # @since 2.0.0
61
61
  CURSOR_ID = :cursor_id.freeze
62
62
 
63
- # The field for cursor ids.
64
- #
65
- # @since 2.0.0
66
- CURSOR_IDS = :cursor_ids.freeze
67
-
68
63
  # The field for an index.
69
64
  #
70
65
  # @since 2.0.0
@@ -238,7 +233,7 @@ module Mongo
238
233
  #
239
234
  # @since 2.0.0
240
235
  def coll_name
241
- spec[COLL_NAME]
236
+ spec.fetch(COLL_NAME)
242
237
  end
243
238
 
244
239
  # The id of the cursor created on the server.
@@ -253,18 +248,6 @@ module Mongo
253
248
  spec[CURSOR_ID]
254
249
  end
255
250
 
256
- # The ids of the cursors to kill from the spec.
257
- #
258
- # @example Get the cursor ids from the spec.
259
- # specifiable.cursor_ids
260
- #
261
- # @return [ Array<Integer> ] The cursor ids.
262
- #
263
- # @since 2.0.0
264
- def cursor_ids
265
- spec[CURSOR_IDS]
266
- end
267
-
268
251
  # Get the index from the specification.
269
252
  #
270
253
  # @example Get the index specification.
@@ -536,17 +519,6 @@ module Mongo
536
519
  @spec[:txn_num]
537
520
  end
538
521
 
539
- # For createIndexes operations, the number of votes that a primary must
540
- # wait for before commiting an index. Potential values are:
541
- # - an integer from 0 to the number of members of the replica set
542
- # - "majority" indicating that a majority of data bearing nodes must vote
543
- # - "votingMembers" which means that all voting data bearing nodes must vote
544
- #
545
- # @return [ nil | Integer | String ] The commitQuorum value of the operation.
546
- def commit_quorum
547
- @spec[:commit_quorum]
548
- end
549
-
550
522
  # The command.
551
523
  #
552
524
  # @return [ Hash ] The command.
@@ -580,6 +552,16 @@ module Mongo
580
552
  def acknowledged_write?
581
553
  write_concern.nil? || write_concern.acknowledged?
582
554
  end
555
+
556
+ def apply_collation(selector, connection, collation)
557
+ if collation
558
+ unless connection.features.collation_enabled?
559
+ raise Error::UnsupportedCollation
560
+ end
561
+ selector = selector.merge(collation: collation)
562
+ end
563
+ selector
564
+ end
583
565
  end
584
566
  end
585
567
  end
@@ -0,0 +1,87 @@
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
+
21
+ # @api private
22
+ module Validatable
23
+
24
+ def validate_find_options(connection, selector)
25
+ if selector.key?(:hint) &&
26
+ !connection.features.find_and_modify_option_validation_enabled?
27
+ then
28
+ raise Error::UnsupportedOption.hint_error
29
+ end
30
+
31
+ if selector.key?(:arrayFilters) &&
32
+ !connection.features.array_filters_enabled?
33
+ then
34
+ raise Error::UnsupportedArrayFilters
35
+ end
36
+
37
+ if selector.key?(:collation) &&
38
+ !connection.features.collation_enabled?
39
+ then
40
+ raise Error::UnsupportedCollation
41
+ end
42
+ end
43
+
44
+ # selector_or_item here is either:
45
+ # - The selector as used in a findAndModify command, or
46
+ # - One of the array elements in the updates array in an update command.
47
+ def validate_hint_on_update(connection, selector_or_item)
48
+ if selector_or_item.key?(:hint) &&
49
+ !connection.features.update_delete_option_validation_enabled?
50
+ then
51
+ raise Error::UnsupportedOption.hint_error
52
+ end
53
+ end
54
+
55
+ # selector_or_item here is either:
56
+ # - The selector as used in a findAndModify command, or
57
+ # - One of the array elements in the updates array in an update command.
58
+ def validate_array_filters(connection, selector_or_item)
59
+ if selector_or_item.key?(:arrayFilters) &&
60
+ !connection.features.array_filters_enabled?
61
+ then
62
+ raise Error::UnsupportedArrayFilters
63
+ end
64
+ end
65
+
66
+ # selector_or_item here is either:
67
+ # - The selector as used in a findAndModify command, or
68
+ # - One of the array elements in the updates array in an update command.
69
+ def validate_collation(connection, selector_or_item)
70
+ if selector_or_item.key?(:collation) &&
71
+ !connection.features.collation_enabled?
72
+ then
73
+ raise Error::UnsupportedCollation
74
+ end
75
+ end
76
+
77
+ def validate_updates(connection, updates)
78
+ updates.each do |update|
79
+ validate_array_filters(connection, update)
80
+ validate_collation(connection, update)
81
+ validate_hint_on_update(connection, update)
82
+ end
83
+ updates
84
+ end
85
+ end
86
+ end
87
+ end
@@ -35,7 +35,7 @@ module Mongo
35
35
  #
36
36
  # @since 2.5.2
37
37
  def execute(server, context:)
38
- server.with_connection do |connection|
38
+ server.with_connection(service_id: context.service_id) do |connection|
39
39
  validate!(connection)
40
40
  op = if connection.features.op_msg_enabled?
41
41
  self.class::OpMsg.new(spec)