mongo 2.20.1 → 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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +2 -2
  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 +109 -17
  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 +1 -1
  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/operation_failure_code_spec.rb +1 -1
  103. data/spec/integration/operation_failure_message_spec.rb +3 -3
  104. data/spec/integration/retryable_errors_spec.rb +2 -2
  105. data/spec/integration/sdam_error_handling_spec.rb +2 -1
  106. data/spec/integration/search_indexes_prose_spec.rb +4 -0
  107. data/spec/integration/server_spec.rb +4 -3
  108. data/spec/integration/transactions_api_examples_spec.rb +2 -0
  109. data/spec/kerberos/kerberos_spec.rb +4 -0
  110. data/spec/lite_spec_helper.rb +3 -1
  111. data/spec/mongo/auth/user/view_spec.rb +1 -1
  112. data/spec/mongo/caching_cursor_spec.rb +1 -1
  113. data/spec/mongo/client_encryption_spec.rb +1 -0
  114. data/spec/mongo/client_spec.rb +158 -4
  115. data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
  116. data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
  117. data/spec/mongo/collection_spec.rb +5 -6
  118. data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
  119. data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
  120. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
  121. data/spec/mongo/crypt/handle_spec.rb +1 -1
  122. data/spec/mongo/cursor_spec.rb +26 -9
  123. data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
  124. data/spec/mongo/operation/context_spec.rb +79 -0
  125. data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
  126. data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
  127. data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
  128. data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
  129. data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
  130. data/spec/mongo/operation/shared/csot/examples.rb +113 -0
  131. data/spec/mongo/query_cache_spec.rb +243 -225
  132. data/spec/mongo/retryable_spec.rb +1 -0
  133. data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
  134. data/spec/mongo/socket/ssl_spec.rb +0 -10
  135. data/spec/runners/change_streams/test.rb +2 -2
  136. data/spec/runners/crud/operation.rb +1 -1
  137. data/spec/runners/crud/verifier.rb +3 -1
  138. data/spec/runners/transactions/operation.rb +4 -6
  139. data/spec/runners/unified/ambiguous_operations.rb +13 -0
  140. data/spec/runners/unified/assertions.rb +4 -0
  141. data/spec/runners/unified/change_stream_operations.rb +14 -24
  142. data/spec/runners/unified/crud_operations.rb +82 -59
  143. data/spec/runners/unified/ddl_operations.rb +38 -7
  144. data/spec/runners/unified/grid_fs_operations.rb +37 -2
  145. data/spec/runners/unified/support_operations.rb +43 -4
  146. data/spec/runners/unified/test.rb +22 -10
  147. data/spec/runners/unified.rb +1 -1
  148. data/spec/solo/clean_exit_spec.rb +2 -0
  149. data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
  150. data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
  151. data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
  152. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
  153. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
  154. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
  155. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
  156. data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
  157. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
  158. data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
  159. data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
  160. data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
  161. data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
  162. data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
  163. data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
  164. data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
  165. data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
  166. data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
  167. data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
  168. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
  169. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
  170. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
  171. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
  172. data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
  173. data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
  174. data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
  175. data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
  176. data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
  177. data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
  178. data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
  179. data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
  180. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
  181. data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
  182. data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
  183. data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
  184. data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
  185. data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
  186. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
  187. data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
  188. data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
  189. data/spec/support/certificates/atlas-ocsp.crt +107 -107
  190. data/spec/support/cluster_tools.rb +3 -3
  191. data/spec/support/common_shortcuts.rb +2 -2
  192. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
  193. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
  194. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
  195. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
  196. data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
  197. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
  198. data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
  199. data/spec/support/shared/session.rb +2 -2
  200. data/spec/support/spec_setup.rb +2 -2
  201. data/spec/support/utils.rb +3 -1
  202. metadata +78 -91
  203. data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
  204. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
  205. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
  206. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
  207. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
  208. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
  209. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
  210. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
  211. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
  212. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
  213. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
  214. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
  215. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
  216. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
  217. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
  218. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
  219. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
  220. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
  221. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
  222. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
  223. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
  224. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
  225. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
  226. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
  227. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
  228. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
  229. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
  230. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
  231. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
  232. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
  233. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
  234. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
  235. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
  236. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
  237. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
  238. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
  239. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
  240. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
  241. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
  242. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
  243. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
  244. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
  245. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
  246. data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -0,0 +1,250 @@
1
+ description: "timeoutMS behaves correctly during command execution"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ # The appName filter cannot be used to set a fail point on connection handshakes until server version 4.9 due to
7
+ # SERVER-49220/SERVER-49336.
8
+ - minServerVersion: "4.9"
9
+ # Skip load-balanced and serverless which do not support RTT measurements.
10
+ topologies: [ single, replicaset, sharded ]
11
+ serverless: forbid
12
+
13
+ createEntities:
14
+ - client:
15
+ id: &failPointClient failPointClient
16
+ useMultipleMongoses: false
17
+
18
+ initialData:
19
+ # The corresponding entities for the collections defined here are created in test-level createEntities operations.
20
+ # This is done so that tests can set fail points that will affect all of the handshakes and heartbeats done by a
21
+ # client. The collection and database names are listed here so that the collections will be dropped and re-created at
22
+ # the beginning of each test.
23
+ - collectionName: &regularCollectionName coll
24
+ databaseName: &databaseName test
25
+ documents: []
26
+ - collectionName: &timeoutCollectionName timeoutColl
27
+ databaseName: &databaseName test
28
+ documents: []
29
+
30
+ tests:
31
+ - description: "maxTimeMS value in the command is less than timeoutMS"
32
+ operations:
33
+ # Artificially increase the server RTT to ~50ms.
34
+ - name: failPoint
35
+ object: testRunner
36
+ arguments:
37
+ client: *failPointClient
38
+ failPoint:
39
+ configureFailPoint: failCommand
40
+ mode: "alwaysOn"
41
+ data:
42
+ failCommands: ["hello", "isMaster"]
43
+ appName: &appName reduceMaxTimeMSTest
44
+ blockConnection: true
45
+ blockTimeMS: 50
46
+ # Create a client with the app name specified in the fail point and timeoutMS higher than blockTimeMS.
47
+ # Also create database and collection entities derived from the new client.
48
+ - name: createEntities
49
+ object: testRunner
50
+ arguments:
51
+ entities:
52
+ - client:
53
+ id: &client client
54
+ useMultipleMongoses: false
55
+ uriOptions:
56
+ appName: *appName
57
+ w: 1 # Override server's w:majority default to speed up the test.
58
+ timeoutMS: 500
59
+ heartbeatFrequencyMS: 500
60
+ observeEvents:
61
+ - commandStartedEvent
62
+ - database:
63
+ id: &database database
64
+ client: *client
65
+ databaseName: *databaseName
66
+ - collection:
67
+ id: &timeoutCollection timeoutCollection
68
+ database: *database
69
+ collectionName: *timeoutCollectionName
70
+ # Do an operation with a large timeout to ensure the servers are discovered.
71
+ - name: insertOne
72
+ object: *timeoutCollection
73
+ arguments:
74
+ document: { _id: 1 }
75
+ timeoutMS: 100000
76
+ # Wait until short-circuiting has been enabled (at least 2 RTT measurements).
77
+ - name: wait
78
+ object: testRunner
79
+ arguments:
80
+ ms: 1000
81
+ # Do an operation with timeoutCollection so the event will include a maxTimeMS field.
82
+ - name: insertOne
83
+ object: *timeoutCollection
84
+ arguments:
85
+ document: { _id: 2 }
86
+ expectEvents:
87
+ - client: *client
88
+ events:
89
+ - commandStartedEvent:
90
+ commandName: insert
91
+ databaseName: *databaseName
92
+ command:
93
+ insert: *timeoutCollectionName
94
+ - commandStartedEvent:
95
+ commandName: insert
96
+ databaseName: *databaseName
97
+ command:
98
+ insert: *timeoutCollectionName
99
+ maxTimeMS: { $$lte: 450 }
100
+
101
+ - description: "command is not sent if RTT is greater than timeoutMS"
102
+ operations:
103
+ # Artificially increase the server RTT to ~50ms.
104
+ - name: failPoint
105
+ object: testRunner
106
+ arguments:
107
+ client: *failPointClient
108
+ failPoint:
109
+ configureFailPoint: failCommand
110
+ mode: "alwaysOn"
111
+ data:
112
+ failCommands: ["hello", "isMaster"]
113
+ appName: &appName rttTooHighTest
114
+ blockConnection: true
115
+ blockTimeMS: 50
116
+ # Create a client with the app name specified in the fail point. Also create database and collection entities
117
+ # derived from the new client. There is one collection entity with no timeoutMS and another with a timeoutMS
118
+ # that's lower than the fail point's blockTimeMS value.
119
+ - name: createEntities
120
+ object: testRunner
121
+ arguments:
122
+ entities:
123
+ - client:
124
+ id: &client client
125
+ useMultipleMongoses: false
126
+ uriOptions:
127
+ appName: *appName
128
+ w: 1 # Override server's w:majority default to speed up the test.
129
+ timeoutMS: 10
130
+ heartbeatFrequencyMS: 500
131
+ observeEvents:
132
+ - commandStartedEvent
133
+ - database:
134
+ id: &database database
135
+ client: *client
136
+ databaseName: *databaseName
137
+ - collection:
138
+ id: &timeoutCollection timeoutCollection
139
+ database: *database
140
+ collectionName: *timeoutCollectionName
141
+ # Do an operation with a large timeout to ensure the servers are discovered.
142
+ - name: insertOne
143
+ object: *timeoutCollection
144
+ arguments:
145
+ document: { _id: 1 }
146
+ timeoutMS: 100000
147
+ # Wait until short-circuiting has been enabled (at least 2 RTT measurements).
148
+ - name: wait
149
+ object: testRunner
150
+ arguments:
151
+ ms: 1000
152
+ # Do an operation with timeoutCollection which will error.
153
+ - name: insertOne
154
+ object: *timeoutCollection
155
+ arguments:
156
+ document: { _id: 2 }
157
+ expectError:
158
+ isTimeoutError: true
159
+ # Do an operation with timeoutCollection which will error.
160
+ - name: insertOne
161
+ object: *timeoutCollection
162
+ arguments:
163
+ document: { _id: 3 }
164
+ expectError:
165
+ isTimeoutError: true
166
+ # Do an operation with timeoutCollection which will error.
167
+ - name: insertOne
168
+ object: *timeoutCollection
169
+ arguments:
170
+ document: { _id: 4 }
171
+ expectError:
172
+ isTimeoutError: true
173
+ expectEvents:
174
+ # There should only be one event, which corresponds to the first
175
+ # insertOne call. For the subsequent insertOne calls, drivers should
176
+ # fail client-side.
177
+ - client: *client
178
+ events:
179
+ - commandStartedEvent:
180
+ commandName: insert
181
+ databaseName: *databaseName
182
+ command:
183
+ insert: *timeoutCollectionName
184
+
185
+ - description: "short-circuit is not enabled with only 1 RTT measurement"
186
+ operations:
187
+ # Artificially increase the server RTT to ~300ms.
188
+ - name: failPoint
189
+ object: testRunner
190
+ arguments:
191
+ client: *failPointClient
192
+ failPoint:
193
+ configureFailPoint: failCommand
194
+ mode: "alwaysOn"
195
+ data:
196
+ failCommands: ["hello", "isMaster"]
197
+ appName: &appName reduceMaxTimeMSTest
198
+ blockConnection: true
199
+ blockTimeMS: 100
200
+ # Create a client with the app name specified in the fail point and timeoutMS lower than blockTimeMS.
201
+ # Also create database and collection entities derived from the new client.
202
+ - name: createEntities
203
+ object: testRunner
204
+ arguments:
205
+ entities:
206
+ - client:
207
+ id: &client client
208
+ useMultipleMongoses: false
209
+ uriOptions:
210
+ appName: *appName
211
+ w: 1 # Override server's w:majority default to speed up the test.
212
+ timeoutMS: 90
213
+ heartbeatFrequencyMS: 100000 # Override heartbeatFrequencyMS to ensure only 1 RTT is recorded.
214
+ observeEvents:
215
+ - commandStartedEvent
216
+ - database:
217
+ id: &database database
218
+ client: *client
219
+ databaseName: *databaseName
220
+ - collection:
221
+ id: &timeoutCollection timeoutCollection
222
+ database: *database
223
+ collectionName: *timeoutCollectionName
224
+ # Do an operation with a large timeout to ensure the servers are discovered.
225
+ - name: insertOne
226
+ object: *timeoutCollection
227
+ arguments:
228
+ document: { _id: 1 }
229
+ timeoutMS: 100000
230
+ # Do an operation with timeoutCollection which will succeed. If this
231
+ # fails it indicates the driver mistakenly used the min RTT even though
232
+ # there has only been one sample.
233
+ - name: insertOne
234
+ object: *timeoutCollection
235
+ arguments:
236
+ document: { _id: 2 }
237
+ expectEvents:
238
+ - client: *client
239
+ events:
240
+ - commandStartedEvent:
241
+ commandName: insert
242
+ databaseName: *databaseName
243
+ command:
244
+ insert: *timeoutCollectionName
245
+ - commandStartedEvent:
246
+ commandName: insert
247
+ databaseName: *databaseName
248
+ command:
249
+ insert: *timeoutCollectionName
250
+ maxTimeMS: { $$lte: 450 }
@@ -0,0 +1,113 @@
1
+ description: "timeoutMS behaves correctly for the withTransaction API"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+ topologies: ["replicaset", "sharded"]
8
+
9
+ createEntities:
10
+ - client:
11
+ id: &failPointClient failPointClient
12
+ useMultipleMongoses: false
13
+ - client:
14
+ id: &client client
15
+ uriOptions:
16
+ timeoutMS: 50
17
+ useMultipleMongoses: false
18
+ observeEvents:
19
+ - commandStartedEvent
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - collection:
25
+ id: &collection collection
26
+ database: *database
27
+ collectionName: &collectionName coll
28
+ - session:
29
+ id: &session session
30
+ client: *client
31
+
32
+ initialData:
33
+ - collectionName: *collectionName
34
+ databaseName: *databaseName
35
+ documents: []
36
+
37
+ tests:
38
+ - description: "withTransaction raises a client-side error if timeoutMS is overridden inside the callback"
39
+ operations:
40
+ - name: withTransaction
41
+ object: *session
42
+ arguments:
43
+ callback:
44
+ - name: insertOne
45
+ object: *collection
46
+ arguments:
47
+ document: { _id: 1 }
48
+ session: *session
49
+ timeoutMS: 100
50
+ expectError:
51
+ isClientError: true
52
+ expectEvents:
53
+ # The only operation run fails with a client-side error, so there should be no events for the client.
54
+ - client: *client
55
+ events: []
56
+
57
+ - description: "timeoutMS is not refreshed for each operation in the callback"
58
+ operations:
59
+ - name: failPoint
60
+ object: testRunner
61
+ arguments:
62
+ client: *failPointClient
63
+ failPoint:
64
+ configureFailPoint: failCommand
65
+ mode: { times: 2 }
66
+ data:
67
+ failCommands: ["insert"]
68
+ blockConnection: true
69
+ # Was 30, but JRuby was taking too long in preparing and issuing
70
+ # the operation. We now specify the timeoutMS below, and set this
71
+ # value to just more than half of it (so that two inserts will
72
+ # exceed the timeout, but one won't--or shouldn't).
73
+ blockTimeMS: 51
74
+ - name: withTransaction
75
+ object: *session
76
+ arguments:
77
+ # Was originally not specified here, inheriting the client value of 50ms.
78
+ # That wasn't giving JRuby enough time, so we specify a larger value
79
+ # here.
80
+ timeoutMS: 100
81
+ callback:
82
+ - name: insertOne
83
+ object: *collection
84
+ arguments:
85
+ document: { _id: 1 }
86
+ session: *session
87
+ - name: insertOne
88
+ object: *collection
89
+ arguments:
90
+ document: { _id: 2 }
91
+ session: *session
92
+ expectError:
93
+ isTimeoutError: true
94
+ expectError:
95
+ isTimeoutError: true
96
+ expectEvents:
97
+ - client: *client
98
+ events:
99
+ # Because the second insert expects an error and gets an error, it technically succeeds, so withTransaction
100
+ # will try to run commitTransaction. This will fail client-side, though, because the timeout has already
101
+ # expired, so no command is sent.
102
+ - commandStartedEvent:
103
+ commandName: insert
104
+ databaseName: *databaseName
105
+ command:
106
+ insert: *collectionName
107
+ maxTimeMS: { $$type: ["int", "long"] }
108
+ - commandStartedEvent:
109
+ commandName: insert
110
+ databaseName: *databaseName
111
+ command:
112
+ insert: *collectionName
113
+ maxTimeMS: { $$type: ["int", "long"] }
@@ -0,0 +1,70 @@
1
+ description: "tests for timeoutMS behavior that applies to all cursor types"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client client
8
+ - database:
9
+ id: &database database
10
+ client: *client
11
+ databaseName: &databaseName test
12
+ - collection:
13
+ id: &collection collection
14
+ database: *database
15
+ collectionName: &collectionName coll
16
+
17
+ initialData:
18
+ - collectionName: *collectionName
19
+ databaseName: *databaseName
20
+ documents: []
21
+
22
+ tests:
23
+ - description: "find errors if timeoutMode is set and timeoutMS is not"
24
+ operations:
25
+ - name: find
26
+ object: *collection
27
+ arguments:
28
+ filter: {}
29
+ timeoutMode: cursorLifetime
30
+ expectError:
31
+ isClientError: true
32
+
33
+ - description: "collection aggregate errors if timeoutMode is set and timeoutMS is not"
34
+ operations:
35
+ - name: aggregate
36
+ object: *collection
37
+ arguments:
38
+ pipeline: []
39
+ timeoutMode: cursorLifetime
40
+ expectError:
41
+ isClientError: true
42
+
43
+ - description: "database aggregate errors if timeoutMode is set and timeoutMS is not"
44
+ operations:
45
+ - name: aggregate
46
+ object: *database
47
+ arguments:
48
+ pipeline: []
49
+ timeoutMode: cursorLifetime
50
+ expectError:
51
+ isClientError: true
52
+
53
+ - description: "listCollections errors if timeoutMode is set and timeoutMS is not"
54
+ operations:
55
+ - name: listCollections
56
+ object: *database
57
+ arguments:
58
+ filter: {}
59
+ timeoutMode: cursorLifetime
60
+ expectError:
61
+ isClientError: true
62
+
63
+ - description: "listIndexes errors if timeoutMode is set and timeoutMS is not"
64
+ operations:
65
+ - name: listIndexes
66
+ object: *collection
67
+ arguments:
68
+ timeoutMode: cursorLifetime
69
+ expectError:
70
+ isClientError: true