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,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