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,207 @@
1
+ description: "timeoutMS behaves correctly for advanced GridFS API 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
+ observeEvents:
19
+ - commandStartedEvent
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - bucket:
25
+ id: &bucket bucket
26
+ database: *database
27
+ - collection:
28
+ id: &filesCollection filesCollection
29
+ database: *database
30
+ collectionName: &filesCollectionName fs.files
31
+ - collection:
32
+ id: &chunksCollection chunksCollection
33
+ database: *database
34
+ collectionName: &chunksCollectionName fs.chunks
35
+
36
+ initialData:
37
+ - collectionName: *filesCollectionName
38
+ databaseName: *databaseName
39
+ documents:
40
+ - _id: &fileDocumentId { $oid: "000000000000000000000005" }
41
+ length: 8
42
+ chunkSize: 4
43
+ uploadDate: { $date: "1970-01-01T00:00:00.000Z" }
44
+ filename: "length-8"
45
+ contentType: "application/octet-stream"
46
+ aliases: []
47
+ metadata: {}
48
+ - collectionName: *chunksCollectionName
49
+ databaseName: *databaseName
50
+ documents:
51
+ - _id: { $oid: "000000000000000000000005" }
52
+ files_id: *fileDocumentId
53
+ n: 0
54
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
55
+ - _id: { $oid: "000000000000000000000006" }
56
+ files_id: *fileDocumentId
57
+ n: 1
58
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
59
+
60
+ tests:
61
+ # Tests for the "rename" operation.
62
+ # Ruby driver does not support rename for GridFS bucket
63
+
64
+ # - description: "timeoutMS can be overridden for a rename"
65
+ # operations:
66
+ # - name: failPoint
67
+ # object: testRunner
68
+ # arguments:
69
+ # client: *failPointClient
70
+ # failPoint:
71
+ # configureFailPoint: failCommand
72
+ # mode: { times: 1 }
73
+ # data:
74
+ # failCommands: ["update"]
75
+ # blockConnection: true
76
+ # blockTimeMS: 100
77
+ # - name: rename
78
+ # object: *bucket
79
+ # arguments:
80
+ # id: *fileDocumentId
81
+ # newFilename: "foo"
82
+ # timeoutMS: 2000 # The client timeoutMS is 75ms and the operation blocks for 100ms, so 2000ms should let it succeed.
83
+ # expectEvents:
84
+ # - client: *client
85
+ # events:
86
+ # - commandStartedEvent:
87
+ # commandName: update
88
+ # databaseName: *databaseName
89
+ # command:
90
+ # update: *filesCollectionName
91
+ # maxTimeMS: { $$type: ["int", "long"] }
92
+
93
+ # - description: "timeoutMS applied to update during a rename"
94
+ # operations:
95
+ # - name: failPoint
96
+ # object: testRunner
97
+ # arguments:
98
+ # client: *failPointClient
99
+ # failPoint:
100
+ # configureFailPoint: failCommand
101
+ # mode: { times: 1 }
102
+ # data:
103
+ # failCommands: ["update"]
104
+ # blockConnection: true
105
+ # blockTimeMS: 100
106
+ # - name: rename
107
+ # object: *bucket
108
+ # arguments:
109
+ # id: *fileDocumentId
110
+ # newFilename: "foo"
111
+ # expectError:
112
+ # isTimeoutError: true
113
+ # expectEvents:
114
+ # - client: *client
115
+ # events:
116
+ # - commandStartedEvent:
117
+ # commandName: update
118
+ # databaseName: *databaseName
119
+ # command:
120
+ # update: *filesCollectionName
121
+ # maxTimeMS: { $$type: ["int", "long"] }
122
+
123
+ # Tests for the "drop" operation. Any tests that might result in multiple commands being sent do not have expectEvents
124
+ # assertions as these assertions reduce test robustness and can cause flaky failures.
125
+
126
+ - description: "timeoutMS can be overridden for drop"
127
+ operations:
128
+ - name: failPoint
129
+ object: testRunner
130
+ arguments:
131
+ client: *failPointClient
132
+ failPoint:
133
+ configureFailPoint: failCommand
134
+ mode: { times: 1 }
135
+ data:
136
+ failCommands: ["drop"]
137
+ blockConnection: true
138
+ blockTimeMS: 100
139
+ - name: drop
140
+ object: *bucket
141
+ arguments:
142
+ timeoutMS: 2000 # The client timeoutMS is 75ms and the operation blocks for 100ms, so 2000ms should let it succeed.
143
+
144
+ - description: "timeoutMS applied to files collection drop"
145
+ operations:
146
+ - name: failPoint
147
+ object: testRunner
148
+ arguments:
149
+ client: *failPointClient
150
+ failPoint:
151
+ configureFailPoint: failCommand
152
+ mode: { times: 1 }
153
+ data:
154
+ failCommands: ["drop"]
155
+ blockConnection: true
156
+ blockTimeMS: 100
157
+ - name: drop
158
+ object: *bucket
159
+ expectError:
160
+ isTimeoutError: true
161
+ expectEvents:
162
+ - client: *client
163
+ events:
164
+ - commandStartedEvent:
165
+ commandName: drop
166
+ databaseName: *databaseName
167
+ command:
168
+ drop: *filesCollectionName
169
+ maxTimeMS: { $$type: ["int", "long"] }
170
+
171
+ - description: "timeoutMS applied to chunks collection drop"
172
+ operations:
173
+ - name: failPoint
174
+ object: testRunner
175
+ arguments:
176
+ client: *failPointClient
177
+ failPoint:
178
+ configureFailPoint: failCommand
179
+ mode:
180
+ # Skip the drop for the files collection.
181
+ skip: 1
182
+ data:
183
+ failCommands: ["drop"]
184
+ blockConnection: true
185
+ blockTimeMS: 100
186
+ - name: drop
187
+ object: *bucket
188
+ expectError:
189
+ isTimeoutError: true
190
+
191
+ - description: "timeoutMS applied to drop as a whole, not individual parts"
192
+ operations:
193
+ - name: failPoint
194
+ object: testRunner
195
+ arguments:
196
+ client: *failPointClient
197
+ failPoint:
198
+ configureFailPoint: failCommand
199
+ mode: { times: 2 }
200
+ data:
201
+ failCommands: ["drop"]
202
+ blockConnection: true
203
+ blockTimeMS: 50
204
+ - name: drop
205
+ object: *bucket
206
+ expectError:
207
+ isTimeoutError: true
@@ -0,0 +1,152 @@
1
+ description: "timeoutMS behaves correctly for GridFS delete 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
+ observeEvents:
19
+ - commandStartedEvent
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - bucket:
25
+ id: &bucket bucket
26
+ database: *database
27
+ - collection:
28
+ id: &filesCollection filesCollection
29
+ database: *database
30
+ collectionName: &filesCollectionName fs.files
31
+ - collection:
32
+ id: &chunksCollection chunksCollection
33
+ database: *database
34
+ collectionName: &chunksCollectionName fs.chunks
35
+
36
+ initialData:
37
+ - collectionName: *filesCollectionName
38
+ databaseName: *databaseName
39
+ documents:
40
+ - _id: &fileDocumentId { $oid: "000000000000000000000005" }
41
+ length: 8
42
+ chunkSize: 4
43
+ uploadDate: { $date: "1970-01-01T00:00:00.000Z" }
44
+ filename: "length-8"
45
+ contentType: "application/octet-stream"
46
+ aliases: []
47
+ metadata: {}
48
+ - collectionName: *chunksCollectionName
49
+ databaseName: *databaseName
50
+ documents:
51
+ - _id: { $oid: "000000000000000000000005" }
52
+ files_id: *fileDocumentId
53
+ n: 0
54
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
55
+ - _id: { $oid: "000000000000000000000006" }
56
+ files_id: *fileDocumentId
57
+ n: 1
58
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
59
+
60
+ tests:
61
+ - description: "timeoutMS can be overridden for delete"
62
+ operations:
63
+ - name: failPoint
64
+ object: testRunner
65
+ arguments:
66
+ client: *failPointClient
67
+ failPoint:
68
+ configureFailPoint: failCommand
69
+ mode: { times: 1 }
70
+ data:
71
+ failCommands: ["delete"]
72
+ blockConnection: true
73
+ blockTimeMS: 100
74
+ - name: delete
75
+ object: *bucket
76
+ arguments:
77
+ id: *fileDocumentId
78
+ timeoutMS: 1000 # The client timeoutMS is 75ms and the operation blocks for 100ms, so 1000ms should let it succeed.
79
+
80
+ - description: "timeoutMS applied to delete against the files collection"
81
+ operations:
82
+ - name: failPoint
83
+ object: testRunner
84
+ arguments:
85
+ client: *failPointClient
86
+ failPoint:
87
+ configureFailPoint: failCommand
88
+ mode: { times: 1 }
89
+ data:
90
+ failCommands: ["delete"]
91
+ blockConnection: true
92
+ blockTimeMS: 100
93
+ - name: delete
94
+ object: *bucket
95
+ arguments:
96
+ id: *fileDocumentId
97
+ expectError:
98
+ isTimeoutError: true
99
+ expectEvents:
100
+ - client: *client
101
+ events:
102
+ - commandStartedEvent:
103
+ commandName: delete
104
+ databaseName: *databaseName
105
+ command:
106
+ delete: *filesCollectionName
107
+ maxTimeMS: { $$type: ["int", "long"] }
108
+
109
+ - description: "timeoutMS applied to delete against the chunks collection"
110
+ operations:
111
+ - name: failPoint
112
+ object: testRunner
113
+ arguments:
114
+ client: *failPointClient
115
+ failPoint:
116
+ configureFailPoint: failCommand
117
+ mode:
118
+ # The first "delete" will be against the files collection, so we skip it.
119
+ skip: 1
120
+ data:
121
+ failCommands: ["delete"]
122
+ blockConnection: true
123
+ blockTimeMS: 100
124
+ - name: delete
125
+ object: *bucket
126
+ arguments:
127
+ id: *fileDocumentId
128
+ expectError:
129
+ isTimeoutError: true
130
+
131
+ # Test that drivers are not refreshing the timeout between commands. We test this by blocking both "delete" commands
132
+ # for 50ms each. The delete should inherit timeoutMS=75 from the client/database and the server takes over 75ms
133
+ # total, so the operation should fail.
134
+ - description: "timeoutMS applied to entire delete, not individual parts"
135
+ operations:
136
+ - name: failPoint
137
+ object: testRunner
138
+ arguments:
139
+ client: *failPointClient
140
+ failPoint:
141
+ configureFailPoint: failCommand
142
+ mode: { times: 2 }
143
+ data:
144
+ failCommands: ["delete"]
145
+ blockConnection: true
146
+ blockTimeMS: 50
147
+ - name: delete
148
+ object: *bucket
149
+ arguments:
150
+ id: *fileDocumentId
151
+ expectError:
152
+ isTimeoutError: true
@@ -0,0 +1,182 @@
1
+ description: "timeoutMS behaves correctly for GridFS download 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
+ observeEvents:
19
+ - commandStartedEvent
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - bucket:
25
+ id: &bucket bucket
26
+ database: *database
27
+ - collection:
28
+ id: &filesCollection filesCollection
29
+ database: *database
30
+ collectionName: &filesCollectionName fs.files
31
+ - collection:
32
+ id: &chunksCollection chunksCollection
33
+ database: *database
34
+ collectionName: &chunksCollectionName fs.chunks
35
+
36
+ initialData:
37
+ - collectionName: *filesCollectionName
38
+ databaseName: *databaseName
39
+ documents:
40
+ - _id: &fileDocumentId { $oid: "000000000000000000000005" }
41
+ length: 8
42
+ chunkSize: 4
43
+ uploadDate: { $date: "1970-01-01T00:00:00.000Z" }
44
+ filename: "length-8"
45
+ contentType: "application/octet-stream"
46
+ aliases: []
47
+ metadata: {}
48
+ - collectionName: *chunksCollectionName
49
+ databaseName: *databaseName
50
+ documents:
51
+ - _id: { $oid: "000000000000000000000005" }
52
+ files_id: *fileDocumentId
53
+ n: 0
54
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
55
+ - _id: { $oid: "000000000000000000000006" }
56
+ files_id: *fileDocumentId
57
+ n: 1
58
+ data: { $binary: { base64: "ESIzRA==", subType: "00" } } # hex: 11223344
59
+
60
+ tests:
61
+ - description: "timeoutMS can be overridden for download"
62
+ operations:
63
+ - name: failPoint
64
+ object: testRunner
65
+ arguments:
66
+ client: *failPointClient
67
+ failPoint:
68
+ configureFailPoint: failCommand
69
+ mode: { times: 1 }
70
+ data:
71
+ failCommands: ["find"]
72
+ blockConnection: true
73
+ blockTimeMS: 100
74
+ - name: download
75
+ object: *bucket
76
+ arguments:
77
+ id: *fileDocumentId
78
+ timeoutMS: 1000 # The client timeoutMS is 75ms and the operation blocks for 100ms, so 1000ms should let it succeed.
79
+
80
+ - description: "timeoutMS applied to find to get files document"
81
+ operations:
82
+ - name: failPoint
83
+ object: testRunner
84
+ arguments:
85
+ client: *failPointClient
86
+ failPoint:
87
+ configureFailPoint: failCommand
88
+ mode: { times: 1 }
89
+ data:
90
+ failCommands: ["find"]
91
+ blockConnection: true
92
+ blockTimeMS: 100
93
+ - name: download
94
+ object: *bucket
95
+ arguments:
96
+ id: *fileDocumentId
97
+ expectError:
98
+ isTimeoutError: true
99
+ expectEvents:
100
+ - client: *client
101
+ events:
102
+ - commandStartedEvent:
103
+ commandName: find
104
+ databaseName: *databaseName
105
+ command:
106
+ find: *filesCollectionName
107
+ maxTimeMS: { $$type: ["int", "long"] }
108
+
109
+ - description: "timeoutMS applied to find to get chunks"
110
+ operations:
111
+ - name: failPoint
112
+ object: testRunner
113
+ arguments:
114
+ client: *failPointClient
115
+ failPoint:
116
+ configureFailPoint: failCommand
117
+ mode:
118
+ # The first "find" will be against the files collection, so we skip it.
119
+ skip: 1
120
+ data:
121
+ failCommands: ["find"]
122
+ blockConnection: true
123
+ blockTimeMS: 100
124
+ - name: download
125
+ object: *bucket
126
+ arguments:
127
+ id: *fileDocumentId
128
+ expectError:
129
+ isTimeoutError: true
130
+ expectEvents:
131
+ - client: *client
132
+ events:
133
+ - commandStartedEvent:
134
+ commandName: find
135
+ databaseName: *databaseName
136
+ command:
137
+ find: *filesCollectionName
138
+ maxTimeMS: { $$type: ["int", "long"] }
139
+ - commandStartedEvent:
140
+ commandName: find
141
+ databaseName: *databaseName
142
+ command:
143
+ find: *chunksCollectionName
144
+ maxTimeMS: { $$type: ["int", "long"] }
145
+
146
+ # Test that drivers are not refreshing the timeout between commands. We test this by blocking both "find" commands
147
+ # for 50ms each. The download should inherit timeoutMS=75 from the client/database and the server takes over 75ms
148
+ # total, so the operation should fail.
149
+ - description: "timeoutMS applied to entire download, not individual parts"
150
+ operations:
151
+ - name: failPoint
152
+ object: testRunner
153
+ arguments:
154
+ client: *failPointClient
155
+ failPoint:
156
+ configureFailPoint: failCommand
157
+ mode: { times: 2 }
158
+ data:
159
+ failCommands: ["find"]
160
+ blockConnection: true
161
+ blockTimeMS: 50
162
+ - name: download
163
+ object: *bucket
164
+ arguments:
165
+ id: *fileDocumentId
166
+ expectError:
167
+ isTimeoutError: true
168
+ expectEvents:
169
+ - client: *client
170
+ events:
171
+ - commandStartedEvent:
172
+ commandName: find
173
+ databaseName: *databaseName
174
+ command:
175
+ find: *filesCollectionName
176
+ maxTimeMS: { $$type: ["int", "long"] }
177
+ - commandStartedEvent:
178
+ commandName: find
179
+ databaseName: *databaseName
180
+ command:
181
+ find: *chunksCollectionName
182
+ maxTimeMS: { $$type: ["int", "long"] }
@@ -0,0 +1,100 @@
1
+ description: "timeoutMS behaves correctly for GridFS find 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
+ observeEvents:
19
+ - commandStartedEvent
20
+ - database:
21
+ id: &database database
22
+ client: *client
23
+ databaseName: &databaseName test
24
+ - bucket:
25
+ id: &bucket bucket
26
+ database: *database
27
+ - collection:
28
+ id: &filesCollection filesCollection
29
+ database: *database
30
+ collectionName: &filesCollectionName fs.files
31
+ - collection:
32
+ id: &chunksCollection chunksCollection
33
+ database: *database
34
+ collectionName: &chunksCollectionName fs.chunks
35
+
36
+ initialData:
37
+ - collectionName: *filesCollectionName
38
+ databaseName: *databaseName
39
+ documents: []
40
+ - collectionName: *chunksCollectionName
41
+ databaseName: *databaseName
42
+ documents: []
43
+
44
+ tests:
45
+ - description: "timeoutMS can be overridden for a find"
46
+ operations:
47
+ - name: failPoint
48
+ object: testRunner
49
+ arguments:
50
+ client: *failPointClient
51
+ failPoint:
52
+ configureFailPoint: failCommand
53
+ mode: { times: 1 }
54
+ data:
55
+ failCommands: ["find"]
56
+ blockConnection: true
57
+ blockTimeMS: 100
58
+ - name: find
59
+ object: *bucket
60
+ arguments:
61
+ filter: {}
62
+ timeoutMS: 1000 # The client timeoutMS is 75ms and the operation blocks for 100ms, so 1000ms should let it succeed.
63
+ expectEvents:
64
+ - client: *client
65
+ events:
66
+ - commandStartedEvent:
67
+ commandName: find
68
+ databaseName: *databaseName
69
+ command:
70
+ find: *filesCollectionName
71
+ maxTimeMS: { $$type: ["int", "long"] }
72
+
73
+ - description: "timeoutMS applied to find command"
74
+ operations:
75
+ - name: failPoint
76
+ object: testRunner
77
+ arguments:
78
+ client: *failPointClient
79
+ failPoint:
80
+ configureFailPoint: failCommand
81
+ mode: { times: 1 }
82
+ data:
83
+ failCommands: ["find"]
84
+ blockConnection: true
85
+ blockTimeMS: 100
86
+ - name: find
87
+ object: *bucket
88
+ arguments:
89
+ filter: {}
90
+ expectError:
91
+ isTimeoutError: true
92
+ expectEvents:
93
+ - client: *client
94
+ events:
95
+ - commandStartedEvent:
96
+ commandName: find
97
+ databaseName: *databaseName
98
+ command:
99
+ find: *filesCollectionName
100
+ maxTimeMS: { $$type: ["int", "long"] }