mongo 2.20.2 → 2.21.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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +11 -11
  4. data/lib/mongo/address.rb +22 -3
  5. data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
  6. data/lib/mongo/auth/base.rb +1 -1
  7. data/lib/mongo/bulk_write.rb +35 -2
  8. data/lib/mongo/client.rb +38 -6
  9. data/lib/mongo/client_encryption.rb +6 -3
  10. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
  11. data/lib/mongo/cluster/sdam_flow.rb +20 -7
  12. data/lib/mongo/cluster.rb +14 -4
  13. data/lib/mongo/collection/helpers.rb +1 -1
  14. data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
  15. data/lib/mongo/collection/view/aggregation.rb +33 -99
  16. data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
  17. data/lib/mongo/collection/view/change_stream.rb +80 -27
  18. data/lib/mongo/collection/view/iterable.rb +76 -60
  19. data/lib/mongo/collection/view/map_reduce.rb +25 -8
  20. data/lib/mongo/collection/view/readable.rb +79 -30
  21. data/lib/mongo/collection/view/writable.rb +109 -48
  22. data/lib/mongo/collection/view.rb +43 -3
  23. data/lib/mongo/collection.rb +158 -23
  24. data/lib/mongo/crypt/auto_encrypter.rb +4 -6
  25. data/lib/mongo/crypt/binding.rb +4 -4
  26. data/lib/mongo/crypt/context.rb +20 -14
  27. data/lib/mongo/crypt/encryption_io.rb +56 -26
  28. data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
  29. data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
  30. data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
  31. data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
  32. data/lib/mongo/csot_timeout_holder.rb +119 -0
  33. data/lib/mongo/cursor/kill_spec.rb +5 -2
  34. data/lib/mongo/cursor/nontailable.rb +27 -0
  35. data/lib/mongo/cursor.rb +86 -24
  36. data/lib/mongo/cursor_host.rb +82 -0
  37. data/lib/mongo/database/view.rb +81 -14
  38. data/lib/mongo/database.rb +88 -18
  39. data/lib/mongo/error/operation_failure.rb +209 -204
  40. data/lib/mongo/error/server_timeout_error.rb +12 -0
  41. data/lib/mongo/error/socket_timeout_error.rb +3 -1
  42. data/lib/mongo/error/timeout_error.rb +23 -0
  43. data/lib/mongo/error.rb +2 -0
  44. data/lib/mongo/grid/fs_bucket.rb +45 -12
  45. data/lib/mongo/grid/stream/read.rb +15 -1
  46. data/lib/mongo/grid/stream/write.rb +21 -4
  47. data/lib/mongo/index/view.rb +77 -16
  48. data/lib/mongo/operation/context.rb +40 -2
  49. data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
  50. data/lib/mongo/operation/delete/op_msg.rb +2 -1
  51. data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
  52. data/lib/mongo/operation/find/op_msg.rb +45 -0
  53. data/lib/mongo/operation/get_more/op_msg.rb +33 -0
  54. data/lib/mongo/operation/insert/op_msg.rb +3 -2
  55. data/lib/mongo/operation/insert/result.rb +4 -2
  56. data/lib/mongo/operation/list_collections/result.rb +1 -1
  57. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  58. data/lib/mongo/operation/op_msg_base.rb +3 -1
  59. data/lib/mongo/operation/result.rb +26 -5
  60. data/lib/mongo/operation/shared/executable.rb +12 -1
  61. data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
  62. data/lib/mongo/operation/shared/response_handling.rb +3 -3
  63. data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
  64. data/lib/mongo/operation/shared/timed.rb +52 -0
  65. data/lib/mongo/operation/shared/write.rb +4 -1
  66. data/lib/mongo/operation/update/op_msg.rb +2 -1
  67. data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
  68. data/lib/mongo/operation.rb +1 -0
  69. data/lib/mongo/protocol/message.rb +1 -4
  70. data/lib/mongo/protocol/msg.rb +2 -2
  71. data/lib/mongo/retryable/read_worker.rb +69 -29
  72. data/lib/mongo/retryable/write_worker.rb +49 -18
  73. data/lib/mongo/retryable.rb +8 -2
  74. data/lib/mongo/server/connection.rb +11 -5
  75. data/lib/mongo/server/connection_base.rb +22 -2
  76. data/lib/mongo/server/connection_pool.rb +32 -14
  77. data/lib/mongo/server/description/features.rb +1 -1
  78. data/lib/mongo/server/description.rb +18 -5
  79. data/lib/mongo/server/monitor.rb +7 -4
  80. data/lib/mongo/server/pending_connection.rb +7 -3
  81. data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
  82. data/lib/mongo/server.rb +11 -6
  83. data/lib/mongo/server_selector/base.rb +25 -9
  84. data/lib/mongo/session.rb +78 -9
  85. data/lib/mongo/socket/ssl.rb +113 -30
  86. data/lib/mongo/socket/tcp.rb +40 -6
  87. data/lib/mongo/socket.rb +154 -25
  88. data/lib/mongo/uri/options_mapper.rb +1 -0
  89. data/lib/mongo/version.rb +15 -4
  90. data/lib/mongo.rb +1 -0
  91. data/spec/atlas/atlas_connectivity_spec.rb +4 -0
  92. data/spec/atlas/operations_spec.rb +4 -0
  93. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
  94. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
  95. data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
  96. data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
  97. data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
  98. data/spec/integration/connection_pool_populator_spec.rb +2 -0
  99. data/spec/integration/cursor_pinning_spec.rb +15 -60
  100. data/spec/integration/cursor_reaping_spec.rb +1 -1
  101. data/spec/integration/docs_examples_spec.rb +1 -1
  102. data/spec/integration/ocsp_verifier_spec.rb +99 -30
  103. data/spec/integration/operation_failure_code_spec.rb +1 -1
  104. data/spec/integration/operation_failure_message_spec.rb +3 -3
  105. data/spec/integration/reconnect_spec.rb +2 -8
  106. data/spec/integration/retryable_errors_spec.rb +2 -2
  107. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  108. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  109. data/spec/integration/server_spec.rb +4 -3
  110. data/spec/integration/srv_monitoring_spec.rb +3 -2
  111. data/spec/integration/srv_spec.rb +4 -0
  112. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  113. data/spec/kerberos/kerberos_spec.rb +4 -0
  114. data/spec/lite_spec_helper.rb +3 -1
  115. data/spec/mongo/auth/user/view_spec.rb +1 -1
  116. data/spec/mongo/caching_cursor_spec.rb +1 -1
  117. data/spec/mongo/client_encryption_spec.rb +1 -0
  118. data/spec/mongo/client_spec.rb +158 -4
  119. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  120. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  121. data/spec/mongo/collection_spec.rb +5 -6
  122. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  123. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  124. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  125. data/spec/mongo/crypt/handle_spec.rb +1 -1
  126. data/spec/mongo/cursor_spec.rb +26 -9
  127. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  128. data/spec/mongo/operation/context_spec.rb +79 -0
  129. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  130. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  131. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  132. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  133. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  134. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  135. data/spec/mongo/query_cache_spec.rb +243 -225
  136. data/spec/mongo/retryable_spec.rb +1 -0
  137. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  138. data/spec/mongo/socket/ssl_spec.rb +0 -10
  139. data/spec/runners/change_streams/test.rb +2 -2
  140. data/spec/runners/crud/operation.rb +1 -1
  141. data/spec/runners/crud/verifier.rb +3 -1
  142. data/spec/runners/transactions/operation.rb +4 -6
  143. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  144. data/spec/runners/unified/assertions.rb +4 -0
  145. data/spec/runners/unified/change_stream_operations.rb +14 -24
  146. data/spec/runners/unified/crud_operations.rb +82 -59
  147. data/spec/runners/unified/ddl_operations.rb +38 -7
  148. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  149. data/spec/runners/unified/support_operations.rb +43 -4
  150. data/spec/runners/unified/test.rb +22 -10
  151. data/spec/runners/unified.rb +1 -1
  152. data/spec/solo/clean_exit_spec.rb +2 -0
  153. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  157. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  158. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  159. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  160. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  161. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  162. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  184. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  185. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  186. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  187. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  188. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  189. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  190. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  191. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  192. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  193. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  194. data/spec/support/cluster_tools.rb +3 -3
  195. data/spec/support/common_shortcuts.rb +39 -21
  196. data/spec/support/constraints.rb +0 -10
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  199. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  200. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  201. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  202. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  203. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  204. data/spec/support/dns.rb +16 -0
  205. data/spec/support/shared/session.rb +2 -2
  206. data/spec/support/spec_setup.rb +2 -2
  207. data/spec/support/utils.rb +3 -1
  208. metadata +91 -153
  209. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  210. data/spec/shared/CANDIDATE.md +0 -28
  211. data/spec/shared/LICENSE +0 -20
  212. data/spec/shared/bin/get-mongodb-download-url +0 -17
  213. data/spec/shared/bin/s3-copy +0 -45
  214. data/spec/shared/bin/s3-upload +0 -69
  215. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  216. data/spec/shared/lib/mrss/cluster_config.rb +0 -231
  217. data/spec/shared/lib/mrss/constraints.rb +0 -378
  218. data/spec/shared/lib/mrss/docker_runner.rb +0 -298
  219. data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
  220. data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
  221. data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
  222. data/spec/shared/lib/mrss/release/candidate.rb +0 -281
  223. data/spec/shared/lib/mrss/release/product_data.rb +0 -144
  224. data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
  225. data/spec/shared/lib/mrss/session_registry.rb +0 -69
  226. data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
  227. data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
  228. data/spec/shared/lib/mrss/utils.rb +0 -37
  229. data/spec/shared/lib/tasks/candidate.rake +0 -64
  230. data/spec/shared/share/Dockerfile.erb +0 -251
  231. data/spec/shared/share/haproxy-1.conf +0 -16
  232. data/spec/shared/share/haproxy-2.conf +0 -17
  233. data/spec/shared/shlib/config.sh +0 -27
  234. data/spec/shared/shlib/distro.sh +0 -84
  235. data/spec/shared/shlib/server.sh +0 -423
  236. data/spec/shared/shlib/set_env.sh +0 -110
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  247. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  248. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  249. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  250. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  251. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  252. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  253. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  254. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  255. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  256. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  257. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  258. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  259. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  260. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  261. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  262. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  263. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  264. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  265. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  266. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  267. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  268. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  269. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  270. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  271. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  272. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  273. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  274. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  275. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  276. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  277. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  278. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  279. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -0,0 +1,247 @@
1
+ description: "timeoutMS behaves correctly for tailable awaitData cursors"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ createEntities:
9
+ - client:
10
+ id: &failPointClient failPointClient
11
+ useMultipleMongoses: false
12
+ - client:
13
+ id: &client client
14
+ uriOptions:
15
+ timeoutMS: 10
16
+ useMultipleMongoses: false
17
+ observeEvents:
18
+ - commandStartedEvent
19
+ - database:
20
+ id: &database database
21
+ client: *client
22
+ databaseName: &databaseName test
23
+ - collection:
24
+ id: &collection collection
25
+ database: *database
26
+ collectionName: &collectionName coll
27
+
28
+ initialData:
29
+ - collectionName: *collectionName
30
+ databaseName: *databaseName
31
+ createOptions:
32
+ capped: true
33
+ size: 500
34
+ documents:
35
+ - { _id: 0 }
36
+ - { _id: 1 }
37
+
38
+ tests:
39
+ - description: "error if timeoutMode is cursor_lifetime"
40
+ operations:
41
+ - name: find
42
+ object: *collection
43
+ arguments:
44
+ filter: {}
45
+ timeoutMode: cursorLifetime
46
+ cursorType: tailableAwait
47
+ expectError:
48
+ isClientError: true
49
+
50
+ - description: "error if maxAwaitTimeMS is greater than timeoutMS"
51
+ operations:
52
+ - name: find
53
+ object: *collection
54
+ arguments:
55
+ filter: {}
56
+ cursorType: tailableAwait
57
+ timeoutMS: 5
58
+ maxAwaitTimeMS: 10
59
+ expectError:
60
+ isClientError: true
61
+
62
+ - description: "error if maxAwaitTimeMS is equal to timeoutMS"
63
+ operations:
64
+ - name: find
65
+ object: *collection
66
+ arguments:
67
+ filter: {}
68
+ cursorType: tailableAwait
69
+ timeoutMS: 5
70
+ maxAwaitTimeMS: 5
71
+ expectError:
72
+ isClientError: true
73
+
74
+ - description: "timeoutMS applied to find"
75
+ operations:
76
+ - name: failPoint
77
+ object: testRunner
78
+ arguments:
79
+ client: *failPointClient
80
+ failPoint:
81
+ configureFailPoint: failCommand
82
+ mode: { times: 1 }
83
+ data:
84
+ failCommands: ["find"]
85
+ blockConnection: true
86
+ blockTimeMS: 15
87
+ - name: find
88
+ object: *collection
89
+ arguments:
90
+ filter: {}
91
+ cursorType: tailableAwait
92
+ expectError:
93
+ isTimeoutError: true
94
+ expectEvents:
95
+ - client: *client
96
+ events:
97
+ - commandStartedEvent:
98
+ commandName: find
99
+ databaseName: *databaseName
100
+ command:
101
+ find: *collectionName
102
+ tailable: true
103
+ awaitData: true
104
+ maxTimeMS: { $$exists: true }
105
+
106
+ # If maxAwaitTimeMS is not set, timeoutMS should be refreshed for the getMore and the getMore should not have a
107
+ # maxTimeMS field.
108
+ - description: "timeoutMS is refreshed for getMore if maxAwaitTimeMS is not set"
109
+ operations:
110
+ - name: failPoint
111
+ object: testRunner
112
+ arguments:
113
+ client: *failPointClient
114
+ failPoint:
115
+ configureFailPoint: failCommand
116
+ mode: { times: 2 }
117
+ data:
118
+ failCommands: ["find", "getMore"]
119
+ blockConnection: true
120
+ blockTimeMS: 15
121
+ - name: createFindCursor
122
+ object: *collection
123
+ arguments:
124
+ filter: {}
125
+ cursorType: tailableAwait
126
+ timeoutMS: 29
127
+ batchSize: 1
128
+ saveResultAsEntity: &tailableCursor tailableCursor
129
+ # Iterate twice to force a getMore. The first iteration will return the document from the first batch and the
130
+ # second will do a getMore.
131
+ - name: iterateUntilDocumentOrError
132
+ object: *tailableCursor
133
+ - name: iterateUntilDocumentOrError
134
+ object: *tailableCursor
135
+ expectEvents:
136
+ - client: *client
137
+ events:
138
+ - commandStartedEvent:
139
+ commandName: find
140
+ databaseName: *databaseName
141
+ command:
142
+ find: *collectionName
143
+ tailable: true
144
+ awaitData: true
145
+ maxTimeMS: { $$exists: true }
146
+ - commandStartedEvent:
147
+ commandName: getMore
148
+ databaseName: *databaseName
149
+ command:
150
+ getMore: { $$type: ["int", "long"] }
151
+ collection: *collectionName
152
+ maxTimeMS: { $$exists: false }
153
+
154
+ # If maxAwaitTimeMS is set for the initial command, timeoutMS should still be refreshed for the getMore and the
155
+ # getMore command should have a maxTimeMS field.
156
+ - description: "timeoutMS is refreshed for getMore if maxAwaitTimeMS is set"
157
+ operations:
158
+ - name: failPoint
159
+ object: testRunner
160
+ arguments:
161
+ client: *failPointClient
162
+ failPoint:
163
+ configureFailPoint: failCommand
164
+ mode: { times: 2 }
165
+ data:
166
+ failCommands: ["find", "getMore"]
167
+ blockConnection: true
168
+ blockTimeMS: 15
169
+ - name: createFindCursor
170
+ object: *collection
171
+ arguments:
172
+ filter: {}
173
+ cursorType: tailableAwait
174
+ timeoutMS: 29
175
+ batchSize: 1
176
+ maxAwaitTimeMS: 1
177
+ saveResultAsEntity: &tailableCursor tailableCursor
178
+ # Iterate twice to force a getMore.
179
+ - name: iterateUntilDocumentOrError
180
+ object: *tailableCursor
181
+ - name: iterateUntilDocumentOrError
182
+ object: *tailableCursor
183
+ expectEvents:
184
+ - client: *client
185
+ events:
186
+ - commandStartedEvent:
187
+ commandName: find
188
+ databaseName: *databaseName
189
+ command:
190
+ find: *collectionName
191
+ tailable: true
192
+ awaitData: true
193
+ maxTimeMS: { $$exists: true }
194
+ - commandStartedEvent:
195
+ commandName: getMore
196
+ databaseName: *databaseName
197
+ command:
198
+ getMore: { $$type: ["int", "long"] }
199
+ collection: *collectionName
200
+ maxTimeMS: 1
201
+
202
+ # The timeoutMS value should be refreshed for getMore's. This is a failure test. The find inherits timeoutMS=10 from
203
+ # the collection and the getMore blocks for 15ms, causing iteration to fail with a timeout error.
204
+ - description: "timeoutMS is refreshed for getMore - failure"
205
+ operations:
206
+ - name: failPoint
207
+ object: testRunner
208
+ arguments:
209
+ client: *failPointClient
210
+ failPoint:
211
+ configureFailPoint: failCommand
212
+ mode: { times: 1 }
213
+ data:
214
+ failCommands: ["getMore"]
215
+ blockConnection: true
216
+ blockTimeMS: 15
217
+ - name: createFindCursor
218
+ object: *collection
219
+ arguments:
220
+ filter: {}
221
+ cursorType: tailableAwait
222
+ batchSize: 1
223
+ saveResultAsEntity: &tailableCursor tailableCursor
224
+ # Iterate twice to force a getMore.
225
+ - name: iterateUntilDocumentOrError
226
+ object: *tailableCursor
227
+ - name: iterateUntilDocumentOrError
228
+ object: *tailableCursor
229
+ expectError:
230
+ isTimeoutError: true
231
+ expectEvents:
232
+ - client: *client
233
+ events:
234
+ - commandStartedEvent:
235
+ commandName: find
236
+ databaseName: *databaseName
237
+ command:
238
+ find: *collectionName
239
+ tailable: true
240
+ awaitData: true
241
+ maxTimeMS: { $$exists: true }
242
+ - commandStartedEvent:
243
+ commandName: getMore
244
+ databaseName: *databaseName
245
+ command:
246
+ getMore: { $$type: ["int", "long"] }
247
+ collection: *collectionName
@@ -0,0 +1,181 @@
1
+ description: "timeoutMS behaves correctly for tailable non-awaitData cursors"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ createEntities:
9
+ - client:
10
+ id: &failPointClient failPointClient
11
+ useMultipleMongoses: false
12
+ - client:
13
+ id: &client client
14
+ uriOptions:
15
+ timeoutMS: 10
16
+ useMultipleMongoses: false
17
+ observeEvents:
18
+ - commandStartedEvent
19
+ - database:
20
+ id: &database database
21
+ client: *client
22
+ databaseName: &databaseName test
23
+ - collection:
24
+ id: &collection collection
25
+ database: *database
26
+ collectionName: &collectionName coll
27
+
28
+ initialData:
29
+ - collectionName: *collectionName
30
+ databaseName: *databaseName
31
+ createOptions:
32
+ capped: true
33
+ size: 500
34
+ documents:
35
+ - { _id: 0 }
36
+ - { _id: 1 }
37
+
38
+ tests:
39
+ - description: "error if timeoutMode is cursor_lifetime"
40
+ operations:
41
+ - name: find
42
+ object: *collection
43
+ arguments:
44
+ filter: {}
45
+ timeoutMode: cursorLifetime
46
+ cursorType: tailable
47
+ expectError:
48
+ isClientError: true
49
+
50
+ - description: "timeoutMS applied to find"
51
+ operations:
52
+ - name: failPoint
53
+ object: testRunner
54
+ arguments:
55
+ client: *failPointClient
56
+ failPoint:
57
+ configureFailPoint: failCommand
58
+ mode: { times: 1 }
59
+ data:
60
+ failCommands: ["find"]
61
+ blockConnection: true
62
+ blockTimeMS: 15
63
+ - name: find
64
+ object: *collection
65
+ arguments:
66
+ filter: {}
67
+ cursorType: tailable
68
+ expectError:
69
+ isTimeoutError: true
70
+ expectEvents:
71
+ - client: *client
72
+ events:
73
+ # Due to SERVER-51153, the find command should not contain a maxTimeMS field for tailable non-awaitData
74
+ # cursors because that would cap the lifetime of the created cursor.
75
+ - commandStartedEvent:
76
+ commandName: find
77
+ databaseName: *databaseName
78
+ command:
79
+ find: *collectionName
80
+ tailable: true
81
+ awaitData: { $$exists: false }
82
+ maxTimeMS: { $$exists: false }
83
+
84
+ # The timeoutMS option should apply separately to the initial "find" and each getMore. This is a success test. The
85
+ # find is executed with timeoutMS=20 and both find and getMore commands are configured to block for 15ms each. Neither
86
+ # exceeds the timeout so the operation succeeds.
87
+ - description: "timeoutMS is refreshed for getMore - success"
88
+ operations:
89
+ - name: failPoint
90
+ object: testRunner
91
+ arguments:
92
+ client: *failPointClient
93
+ failPoint:
94
+ configureFailPoint: failCommand
95
+ mode: { times: 2 }
96
+ data:
97
+ failCommands: ["find", "getMore"]
98
+ blockConnection: true
99
+ blockTimeMS: 15
100
+ - name: createFindCursor
101
+ object: *collection
102
+ arguments:
103
+ filter: {}
104
+ cursorType: tailable
105
+ timeoutMS: 20
106
+ batchSize: 1
107
+ saveResultAsEntity: &tailableCursor tailableCursor
108
+ # Iterate the cursor twice: the first iteration will return the document from the batch in the find and the
109
+ # second will do a getMore.
110
+ - name: iterateUntilDocumentOrError
111
+ object: *tailableCursor
112
+ - name: iterateUntilDocumentOrError
113
+ object: *tailableCursor
114
+ expectEvents:
115
+ - client: *client
116
+ events:
117
+ - commandStartedEvent:
118
+ commandName: find
119
+ databaseName: *databaseName
120
+ command:
121
+ find: *collectionName
122
+ tailable: true
123
+ awaitData: { $$exists: false }
124
+ maxTimeMS: { $$exists: false }
125
+ - commandStartedEvent:
126
+ commandName: getMore
127
+ databaseName: *databaseName
128
+ command:
129
+ getMore: { $$type: ["int", "long"] }
130
+ collection: *collectionName
131
+ maxTimeMS: { $$exists: false }
132
+
133
+ # The timeoutMS option should apply separately to the initial "find" and each getMore. This is a failure test. The
134
+ # find inherits timeoutMS=10 from the collection and the getMore command blocks for 15ms, causing iteration to fail
135
+ # with a timeout error.
136
+ - description: "timeoutMS is refreshed for getMore - failure"
137
+ operations:
138
+ - name: failPoint
139
+ object: testRunner
140
+ arguments:
141
+ client: *failPointClient
142
+ failPoint:
143
+ configureFailPoint: failCommand
144
+ mode: { times: 1 }
145
+ data:
146
+ failCommands: ["getMore"]
147
+ blockConnection: true
148
+ blockTimeMS: 15
149
+ - name: createFindCursor
150
+ object: *collection
151
+ arguments:
152
+ filter: {}
153
+ cursorType: tailable
154
+ batchSize: 1
155
+ saveResultAsEntity: &tailableCursor tailableCursor
156
+ # Iterate the cursor twice: the first iteration will return the document from the batch in the find and the
157
+ # second will do a getMore.
158
+ - name: iterateUntilDocumentOrError
159
+ object: *tailableCursor
160
+ - name: iterateUntilDocumentOrError
161
+ object: *tailableCursor
162
+ expectError:
163
+ isTimeoutError: true
164
+ expectEvents:
165
+ - client: *client
166
+ events:
167
+ - commandStartedEvent:
168
+ commandName: find
169
+ databaseName: *databaseName
170
+ command:
171
+ find: *collectionName
172
+ tailable: true
173
+ awaitData: { $$exists: false }
174
+ maxTimeMS: { $$exists: false }
175
+ - commandStartedEvent:
176
+ commandName: getMore
177
+ databaseName: *databaseName
178
+ command:
179
+ getMore: { $$type: ["int", "long"] }
180
+ collection: *collectionName
181
+ maxTimeMS: { $$exists: false }
@@ -8,6 +8,8 @@ runOnRequirements:
8
8
  # https://jira.mongodb.org/browse/DRIVERS-291
9
9
  maxServerVersion: "7.99"
10
10
  topologies: [ replicaset, sharded, load-balanced ]
11
+ # SERVER-90047: failures against latest server necessitate adding this for now
12
+ maxServerVersion: "8.0.0"
11
13
 
12
14
  _yamlAnchors:
13
15
  readConcern: &readConcern
@@ -61,6 +63,8 @@ tests:
61
63
  - description: "Aggregate with $out includes read preference for 5.0+ server"
62
64
  runOnRequirements:
63
65
  - minServerVersion: "5.0"
66
+ # https://jira.mongodb.org/browse/RUBY-3539
67
+ maxServerVersion: "7.99"
64
68
  serverless: "forbid"
65
69
  operations:
66
70
  - object: *collection0
@@ -11,6 +11,8 @@ runOnRequirements:
11
11
  maxServerVersion: "7.99"
12
12
  topologies: [ replicaset ]
13
13
  serverless: forbid
14
+ # SERVER-90047: failures against latest server necessitate adding this for now
15
+ maxServerVersion: "8.0.0"
14
16
 
15
17
  _yamlAnchors:
16
18
  readConcern: &readConcern
@@ -54,6 +56,8 @@ tests:
54
56
  - description: "Database-level aggregate with $out includes read preference for 5.0+ server"
55
57
  runOnRequirements:
56
58
  - minServerVersion: "5.0"
59
+ # https://jira.mongodb.org/browse/RUBY-3539
60
+ maxServerVersion: "7.99"
57
61
  serverless: "forbid"
58
62
  operations:
59
63
  - object: *database0
@@ -1,3 +1,6 @@
1
+ # This spec is specific to the ruby driver, and is not part of the general
2
+ # `specifications` repo.
3
+
1
4
  description: "find options"
2
5
 
3
6
  schemaVersion: "1.0"
@@ -162,11 +165,30 @@ tests:
162
165
  commandName: find
163
166
  databaseName: *database0Name
164
167
 
168
+ - description: "timeoutMS"
169
+ operations:
170
+ - name: find
171
+ arguments:
172
+ filter: *filter
173
+ timeoutMS: &timeoutMS 1000
174
+ object: *collection0
175
+ expectEvents:
176
+ - client: *client0
177
+ events:
178
+ - commandStartedEvent:
179
+ command:
180
+ find: *collection0Name
181
+ filter: *filter
182
+ maxTimeMS: { $$type: [ int ] }
183
+ commandName: find
184
+ databaseName: *database0Name
185
+
165
186
  - description: "max"
166
187
  operations:
167
188
  - name: find
168
189
  arguments:
169
190
  filter: *filter
191
+ hint: { _id: 1 }
170
192
  max: &max { _id: 10 }
171
193
  object: *collection0
172
194
  expectEvents:
@@ -182,6 +204,11 @@ tests:
182
204
 
183
205
  - description: "min"
184
206
  operations:
207
+ - name: createIndex
208
+ object: *collection0
209
+ arguments:
210
+ name: "name_1"
211
+ keys: { name: 1 }
185
212
  - name: find
186
213
  arguments:
187
214
  filter: *filter
@@ -191,6 +218,8 @@ tests:
191
218
  expectEvents:
192
219
  - client: *client0
193
220
  events:
221
+ - commandStartedEvent:
222
+ commandName: createIndexes
194
223
  - commandStartedEvent:
195
224
  command:
196
225
  find: *collection0Name
@@ -15,18 +15,18 @@ describe 'Server Selection moving average round trip time calculation' do
15
15
 
16
16
  context(spec.description) do
17
17
 
18
- let(:averager) do
19
- Mongo::Server::RoundTripTimeAverager.new
18
+ let(:calculator) do
19
+ Mongo::Server::RoundTripTimeCalculator.new
20
20
  end
21
21
 
22
22
  before do
23
- averager.instance_variable_set(:@average_round_trip_time, spec.average_rtt)
24
- averager.instance_variable_set(:@last_round_trip_time, spec.new_rtt)
25
- averager.send(:update_average_round_trip_time)
23
+ calculator.instance_variable_set(:@average_round_trip_time, spec.average_rtt)
24
+ calculator.instance_variable_set(:@last_round_trip_time, spec.new_rtt)
25
+ calculator.update_average_round_trip_time
26
26
  end
27
27
 
28
28
  it 'correctly calculates the moving average round trip time' do
29
- expect(averager.average_round_trip_time).to eq(spec.new_average_rtt)
29
+ expect(calculator.average_round_trip_time).to eq(spec.new_average_rtt)
30
30
  end
31
31
  end
32
32
  end