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,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"] }