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,249 @@
1
+ description: "timeoutMS behaves correctly for GridFS upload operations"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+ serverless: forbid # GridFS ops can be slow on serverless.
8
+
9
+ createEntities:
10
+ - client:
11
+ id: &failPointClient failPointClient
12
+ useMultipleMongoses: false
13
+ - client:
14
+ id: &client client
15
+ uriOptions:
16
+ timeoutMS: 75
17
+ useMultipleMongoses: false
18
+ - database:
19
+ id: &database database
20
+ client: *client
21
+ databaseName: &databaseName test
22
+ - bucket:
23
+ id: &bucket bucket
24
+ database: *database
25
+ - collection:
26
+ id: &filesCollection filesCollection
27
+ database: *database
28
+ collectionName: &filesCollectionName fs.files
29
+ - collection:
30
+ id: &chunksCollection chunksCollection
31
+ database: *database
32
+ collectionName: &chunksCollectionName fs.chunks
33
+
34
+ initialData:
35
+ - collectionName: *filesCollectionName
36
+ databaseName: *databaseName
37
+ documents: []
38
+ - collectionName: *chunksCollectionName
39
+ databaseName: *databaseName
40
+ documents: []
41
+
42
+ tests:
43
+ # Many tests in this file do not specify command monitoring expectations because GridFS uploads internally do a
44
+ # number of operations, so expecting an exact set of commands can cause flaky failures.
45
+
46
+ - description: "timeoutMS can be overridden for upload"
47
+ operations:
48
+ - name: failPoint
49
+ object: testRunner
50
+ arguments:
51
+ client: *failPointClient
52
+ failPoint:
53
+ configureFailPoint: failCommand
54
+ mode: { times: 1 }
55
+ data:
56
+ failCommands: ["find"]
57
+ blockConnection: true
58
+ blockTimeMS: 100
59
+ - name: upload
60
+ object: *bucket
61
+ arguments:
62
+ filename: filename
63
+ source: { $$hexBytes: "1122334455" }
64
+ timeoutMS: 1000
65
+
66
+ # On the first write to the bucket, drivers check if the files collection is empty to see if indexes need to be
67
+ # created.
68
+ - description: "timeoutMS applied to initial find on files collection"
69
+ operations:
70
+ - name: failPoint
71
+ object: testRunner
72
+ arguments:
73
+ client: *failPointClient
74
+ failPoint:
75
+ configureFailPoint: failCommand
76
+ mode: { times: 1 }
77
+ data:
78
+ failCommands: ["find"]
79
+ blockConnection: true
80
+ blockTimeMS: 100
81
+ - name: upload
82
+ object: *bucket
83
+ arguments:
84
+ filename: filename
85
+ source: { $$hexBytes: "1122334455" }
86
+ expectError:
87
+ isTimeoutError: true
88
+
89
+ # On the first write to the bucket, drivers check if the files collection has the correct indexes.
90
+ - description: "timeoutMS applied to listIndexes on files collection"
91
+ operations:
92
+ - name: failPoint
93
+ object: testRunner
94
+ arguments:
95
+ client: *failPointClient
96
+ failPoint:
97
+ configureFailPoint: failCommand
98
+ mode: { times: 1 }
99
+ data:
100
+ failCommands: ["listIndexes"]
101
+ blockConnection: true
102
+ blockTimeMS: 100
103
+ - name: upload
104
+ object: *bucket
105
+ arguments:
106
+ filename: filename
107
+ source: { $$hexBytes: "1122334455" }
108
+ expectError:
109
+ isTimeoutError: true
110
+
111
+ # If the files collection is empty when the first write to the bucket occurs, drivers attempt to create an index
112
+ # on the bucket's files collection.
113
+ - description: "timeoutMS applied to index creation for files collection"
114
+ operations:
115
+ - name: failPoint
116
+ object: testRunner
117
+ arguments:
118
+ client: *failPointClient
119
+ failPoint:
120
+ configureFailPoint: failCommand
121
+ mode: { times: 1 }
122
+ data:
123
+ failCommands: ["createIndexes"]
124
+ blockConnection: true
125
+ blockTimeMS: 100
126
+ - name: upload
127
+ object: *bucket
128
+ arguments:
129
+ filename: filename
130
+ source: { $$hexBytes: "1122334455" }
131
+ expectError:
132
+ isTimeoutError: true
133
+
134
+ # On the first write to the bucket, drivers check if the chunks collection has the correct indexes.
135
+ - description: "timeoutMS applied to listIndexes on chunks collection"
136
+ operations:
137
+ - name: failPoint
138
+ object: testRunner
139
+ arguments:
140
+ client: *failPointClient
141
+ failPoint:
142
+ configureFailPoint: failCommand
143
+ # The first listIndexes will be on the files collection, so we skip it.
144
+ mode: { skip: 1 }
145
+ data:
146
+ failCommands: ["listIndexes"]
147
+ blockConnection: true
148
+ blockTimeMS: 100
149
+ - name: upload
150
+ object: *bucket
151
+ arguments:
152
+ filename: filename
153
+ source: { $$hexBytes: "1122334455" }
154
+ expectError:
155
+ isTimeoutError: true
156
+
157
+ # If the files collection is empty when the first write to the bucket occurs, drivers attempt to create an index
158
+ # on the bucket's chunks collection.
159
+ - description: "timeoutMS applied to index creation for chunks collection"
160
+ operations:
161
+ - name: failPoint
162
+ object: testRunner
163
+ arguments:
164
+ client: *failPointClient
165
+ failPoint:
166
+ configureFailPoint: failCommand
167
+ # This index is created after the one on the files collection, so we skip the first createIndexes command
168
+ # and target the second.
169
+ mode: { skip: 1 }
170
+ data:
171
+ failCommands: ["createIndexes"]
172
+ blockConnection: true
173
+ blockTimeMS: 100
174
+ - name: upload
175
+ object: *bucket
176
+ arguments:
177
+ filename: filename
178
+ source: { $$hexBytes: "1122334455" }
179
+ expectError:
180
+ isTimeoutError: true
181
+
182
+ - description: "timeoutMS applied to chunk insertion"
183
+ operations:
184
+ - name: failPoint
185
+ object: testRunner
186
+ arguments:
187
+ client: *failPointClient
188
+ failPoint:
189
+ configureFailPoint: failCommand
190
+ mode: { times: 1 }
191
+ data:
192
+ failCommands: ["insert"]
193
+ blockConnection: true
194
+ blockTimeMS: 100
195
+ - name: upload
196
+ object: *bucket
197
+ arguments:
198
+ filename: filename
199
+ source: { $$hexBytes: "1122334455" }
200
+ expectError:
201
+ isTimeoutError: true
202
+
203
+ - description: "timeoutMS applied to creation of files document"
204
+ operations:
205
+ - name: failPoint
206
+ object: testRunner
207
+ arguments:
208
+ client: *failPointClient
209
+ failPoint:
210
+ configureFailPoint: failCommand
211
+ # Skip the insert to upload the chunk. Because the whole file fits into one chunk, the second insert will
212
+ # be the files document upload.
213
+ mode: { skip: 1 }
214
+ data:
215
+ failCommands: ["insert"]
216
+ blockConnection: true
217
+ blockTimeMS: 100
218
+ - name: upload
219
+ object: *bucket
220
+ arguments:
221
+ filename: filename
222
+ source: { $$hexBytes: "1122334455" }
223
+ expectError:
224
+ isTimeoutError: true
225
+
226
+ # Test that drivers apply timeoutMS to the entire upload rather than refreshing it between individual commands. We
227
+ # test this by blocking the "find" and "listIndexes" commands for 50ms each and performing an upload. The upload
228
+ # should inherit timeoutMS=75 from the client/database and the server takes over 75ms total, so the operation should
229
+ # fail.
230
+ - description: "timeoutMS applied to upload as a whole, not individual parts"
231
+ operations:
232
+ - name: failPoint
233
+ object: testRunner
234
+ arguments:
235
+ client: *failPointClient
236
+ failPoint:
237
+ configureFailPoint: failCommand
238
+ mode: { times: 2 }
239
+ data:
240
+ failCommands: ["find", "listIndexes"]
241
+ blockConnection: true
242
+ blockTimeMS: 50
243
+ - name: upload
244
+ object: *bucket
245
+ arguments:
246
+ filename: filename
247
+ source: { $$hexBytes: "1122334455" }
248
+ expectError:
249
+ isTimeoutError: true
@@ -0,0 +1,204 @@
1
+ description: "legacy timeouts continue to work if timeoutMS is not set"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ initialData:
9
+ - collectionName: &collectionName coll
10
+ databaseName: &databaseName test
11
+ documents: []
12
+
13
+ tests:
14
+ - description: "socketTimeoutMS is not used to derive a maxTimeMS command field"
15
+ operations:
16
+ - name: createEntities
17
+ object: testRunner
18
+ arguments:
19
+ entities:
20
+ - client:
21
+ id: &client client
22
+ observeEvents:
23
+ - commandStartedEvent
24
+ uriOptions:
25
+ socketTimeoutMS: 50000
26
+ - database:
27
+ id: &database database
28
+ client: *client
29
+ databaseName: *databaseName
30
+ - collection:
31
+ id: &collection collection
32
+ database: *database
33
+ collectionName: *collectionName
34
+ - name: insertOne
35
+ object: *collection
36
+ arguments:
37
+ document: { x: 1 }
38
+ expectEvents:
39
+ - client: *client
40
+ events:
41
+ - commandStartedEvent:
42
+ commandName: insert
43
+ databaseName: *databaseName
44
+ command:
45
+ insert: *collectionName
46
+ maxTimeMS: { $$exists: false }
47
+
48
+ - description: "waitQueueTimeoutMS is not used to derive a maxTimeMS command field"
49
+ operations:
50
+ - name: createEntities
51
+ object: testRunner
52
+ arguments:
53
+ entities:
54
+ - client:
55
+ id: &client client
56
+ observeEvents:
57
+ - commandStartedEvent
58
+ uriOptions:
59
+ waitQueueTimeoutMS: 50000
60
+ - database:
61
+ id: &database database
62
+ client: *client
63
+ databaseName: *databaseName
64
+ - collection:
65
+ id: &collection collection
66
+ database: *database
67
+ collectionName: *collectionName
68
+ - name: insertOne
69
+ object: *collection
70
+ arguments:
71
+ document: { x: 1 }
72
+ expectEvents:
73
+ - client: *client
74
+ events:
75
+ - commandStartedEvent:
76
+ commandName: insert
77
+ databaseName: *databaseName
78
+ command:
79
+ insert: *collectionName
80
+ maxTimeMS: { $$exists: false }
81
+
82
+ - description: "wTimeoutMS is not used to derive a maxTimeMS command field"
83
+ operations:
84
+ - name: createEntities
85
+ object: testRunner
86
+ arguments:
87
+ entities:
88
+ - client:
89
+ id: &client client
90
+ observeEvents:
91
+ - commandStartedEvent
92
+ uriOptions:
93
+ wTimeoutMS: &wTimeoutMS 50000
94
+ - database:
95
+ id: &database database
96
+ client: *client
97
+ databaseName: *databaseName
98
+ - collection:
99
+ id: &collection collection
100
+ database: *database
101
+ collectionName: *collectionName
102
+ - name: insertOne
103
+ object: *collection
104
+ arguments:
105
+ document: { x: 1 }
106
+ expectEvents:
107
+ - client: *client
108
+ events:
109
+ - commandStartedEvent:
110
+ commandName: insert
111
+ databaseName: *databaseName
112
+ command:
113
+ insert: *collectionName
114
+ maxTimeMS: { $$exists: false }
115
+ writeConcern:
116
+ wtimeout: *wTimeoutMS
117
+
118
+ # If the maxTimeMS option is set for a specific command, it should be used as the maxTimeMS command field without any
119
+ # modifications. This is different from timeoutMS because in that case, drivers subtract the target server's min
120
+ # RTT from the remaining timeout to derive a maxTimeMS field.
121
+ - description: "maxTimeMS option is used directly as the maxTimeMS field on a command"
122
+ operations:
123
+ - name: createEntities
124
+ object: testRunner
125
+ arguments:
126
+ entities:
127
+ - client:
128
+ id: &client client
129
+ observeEvents:
130
+ - commandStartedEvent
131
+ - database:
132
+ id: &database database
133
+ client: *client
134
+ databaseName: *databaseName
135
+ - collection:
136
+ id: &collection collection
137
+ database: *database
138
+ collectionName: *collectionName
139
+ - name: estimatedDocumentCount
140
+ object: *collection
141
+ arguments:
142
+ maxTimeMS: &maxTimeMS 50000
143
+ expectEvents:
144
+ - client: *client
145
+ events:
146
+ - commandStartedEvent:
147
+ commandName: count
148
+ databaseName: *databaseName
149
+ command:
150
+ count: *collectionName
151
+ maxTimeMS: *maxTimeMS
152
+
153
+ # Same test as above but with the maxCommitTimeMS option.
154
+ - description: "maxCommitTimeMS option is used directly as the maxTimeMS field on a commitTransaction command"
155
+ runOnRequirements:
156
+ # Note: minServerVersion is specified in top-level runOnRequirements
157
+ - topologies: ["replicaset", "sharded"]
158
+ operations:
159
+ - name: createEntities
160
+ object: testRunner
161
+ arguments:
162
+ entities:
163
+ - client:
164
+ id: &client client
165
+ observeEvents:
166
+ - commandStartedEvent
167
+ - database:
168
+ id: &database database
169
+ client: *client
170
+ databaseName: *databaseName
171
+ - collection:
172
+ id: &collection collection
173
+ database: *database
174
+ collectionName: *collectionName
175
+ - session:
176
+ id: &session session
177
+ client: *client
178
+ sessionOptions:
179
+ defaultTransactionOptions:
180
+ maxCommitTimeMS: &maxCommitTimeMS 1000
181
+ - name: startTransaction
182
+ object: *session
183
+ - name: insertOne
184
+ object: *collection
185
+ arguments:
186
+ document: { _id: 1 }
187
+ session: *session
188
+ - name: commitTransaction
189
+ object: *session
190
+ expectEvents:
191
+ - client: *client
192
+ events:
193
+ - commandStartedEvent:
194
+ commandName: insert
195
+ databaseName: *databaseName
196
+ command:
197
+ insert: *collectionName
198
+ maxTimeMS: { $$exists: false }
199
+ - commandStartedEvent:
200
+ commandName: commitTransaction
201
+ databaseName: admin
202
+ command:
203
+ commitTransaction: 1
204
+ maxTimeMS: *maxCommitTimeMS