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,247 @@
1
+ description: "timeoutMS behaves correctly for tailable awaitData cursors"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ createEntities:
9
+ - client:
10
+ id: &failPointClient failPointClient
11
+ useMultipleMongoses: false
12
+ - client:
13
+ id: &client client
14
+ uriOptions:
15
+ timeoutMS: 10
16
+ useMultipleMongoses: false
17
+ observeEvents:
18
+ - commandStartedEvent
19
+ - database:
20
+ id: &database database
21
+ client: *client
22
+ databaseName: &databaseName test
23
+ - collection:
24
+ id: &collection collection
25
+ database: *database
26
+ collectionName: &collectionName coll
27
+
28
+ initialData:
29
+ - collectionName: *collectionName
30
+ databaseName: *databaseName
31
+ createOptions:
32
+ capped: true
33
+ size: 500
34
+ documents:
35
+ - { _id: 0 }
36
+ - { _id: 1 }
37
+
38
+ tests:
39
+ - description: "error if timeoutMode is cursor_lifetime"
40
+ operations:
41
+ - name: find
42
+ object: *collection
43
+ arguments:
44
+ filter: {}
45
+ timeoutMode: cursorLifetime
46
+ cursorType: tailableAwait
47
+ expectError:
48
+ isClientError: true
49
+
50
+ - description: "error if maxAwaitTimeMS is greater than timeoutMS"
51
+ operations:
52
+ - name: find
53
+ object: *collection
54
+ arguments:
55
+ filter: {}
56
+ cursorType: tailableAwait
57
+ timeoutMS: 5
58
+ maxAwaitTimeMS: 10
59
+ expectError:
60
+ isClientError: true
61
+
62
+ - description: "error if maxAwaitTimeMS is equal to timeoutMS"
63
+ operations:
64
+ - name: find
65
+ object: *collection
66
+ arguments:
67
+ filter: {}
68
+ cursorType: tailableAwait
69
+ timeoutMS: 5
70
+ maxAwaitTimeMS: 5
71
+ expectError:
72
+ isClientError: true
73
+
74
+ - description: "timeoutMS applied to find"
75
+ operations:
76
+ - name: failPoint
77
+ object: testRunner
78
+ arguments:
79
+ client: *failPointClient
80
+ failPoint:
81
+ configureFailPoint: failCommand
82
+ mode: { times: 1 }
83
+ data:
84
+ failCommands: ["find"]
85
+ blockConnection: true
86
+ blockTimeMS: 15
87
+ - name: find
88
+ object: *collection
89
+ arguments:
90
+ filter: {}
91
+ cursorType: tailableAwait
92
+ expectError:
93
+ isTimeoutError: true
94
+ expectEvents:
95
+ - client: *client
96
+ events:
97
+ - commandStartedEvent:
98
+ commandName: find
99
+ databaseName: *databaseName
100
+ command:
101
+ find: *collectionName
102
+ tailable: true
103
+ awaitData: true
104
+ maxTimeMS: { $$exists: true }
105
+
106
+ # If maxAwaitTimeMS is not set, timeoutMS should be refreshed for the getMore and the getMore should not have a
107
+ # maxTimeMS field.
108
+ - description: "timeoutMS is refreshed for getMore if maxAwaitTimeMS is not set"
109
+ operations:
110
+ - name: failPoint
111
+ object: testRunner
112
+ arguments:
113
+ client: *failPointClient
114
+ failPoint:
115
+ configureFailPoint: failCommand
116
+ mode: { times: 2 }
117
+ data:
118
+ failCommands: ["find", "getMore"]
119
+ blockConnection: true
120
+ blockTimeMS: 15
121
+ - name: createFindCursor
122
+ object: *collection
123
+ arguments:
124
+ filter: {}
125
+ cursorType: tailableAwait
126
+ timeoutMS: 29
127
+ batchSize: 1
128
+ saveResultAsEntity: &tailableCursor tailableCursor
129
+ # Iterate twice to force a getMore. The first iteration will return the document from the first batch and the
130
+ # second will do a getMore.
131
+ - name: iterateUntilDocumentOrError
132
+ object: *tailableCursor
133
+ - name: iterateUntilDocumentOrError
134
+ object: *tailableCursor
135
+ expectEvents:
136
+ - client: *client
137
+ events:
138
+ - commandStartedEvent:
139
+ commandName: find
140
+ databaseName: *databaseName
141
+ command:
142
+ find: *collectionName
143
+ tailable: true
144
+ awaitData: true
145
+ maxTimeMS: { $$exists: true }
146
+ - commandStartedEvent:
147
+ commandName: getMore
148
+ databaseName: *databaseName
149
+ command:
150
+ getMore: { $$type: ["int", "long"] }
151
+ collection: *collectionName
152
+ maxTimeMS: { $$exists: false }
153
+
154
+ # If maxAwaitTimeMS is set for the initial command, timeoutMS should still be refreshed for the getMore and the
155
+ # getMore command should have a maxTimeMS field.
156
+ - description: "timeoutMS is refreshed for getMore if maxAwaitTimeMS is set"
157
+ operations:
158
+ - name: failPoint
159
+ object: testRunner
160
+ arguments:
161
+ client: *failPointClient
162
+ failPoint:
163
+ configureFailPoint: failCommand
164
+ mode: { times: 2 }
165
+ data:
166
+ failCommands: ["find", "getMore"]
167
+ blockConnection: true
168
+ blockTimeMS: 15
169
+ - name: createFindCursor
170
+ object: *collection
171
+ arguments:
172
+ filter: {}
173
+ cursorType: tailableAwait
174
+ timeoutMS: 29
175
+ batchSize: 1
176
+ maxAwaitTimeMS: 1
177
+ saveResultAsEntity: &tailableCursor tailableCursor
178
+ # Iterate twice to force a getMore.
179
+ - name: iterateUntilDocumentOrError
180
+ object: *tailableCursor
181
+ - name: iterateUntilDocumentOrError
182
+ object: *tailableCursor
183
+ expectEvents:
184
+ - client: *client
185
+ events:
186
+ - commandStartedEvent:
187
+ commandName: find
188
+ databaseName: *databaseName
189
+ command:
190
+ find: *collectionName
191
+ tailable: true
192
+ awaitData: true
193
+ maxTimeMS: { $$exists: true }
194
+ - commandStartedEvent:
195
+ commandName: getMore
196
+ databaseName: *databaseName
197
+ command:
198
+ getMore: { $$type: ["int", "long"] }
199
+ collection: *collectionName
200
+ maxTimeMS: 1
201
+
202
+ # The timeoutMS value should be refreshed for getMore's. This is a failure test. The find inherits timeoutMS=10 from
203
+ # the collection and the getMore blocks for 15ms, causing iteration to fail with a timeout error.
204
+ - description: "timeoutMS is refreshed for getMore - failure"
205
+ operations:
206
+ - name: failPoint
207
+ object: testRunner
208
+ arguments:
209
+ client: *failPointClient
210
+ failPoint:
211
+ configureFailPoint: failCommand
212
+ mode: { times: 1 }
213
+ data:
214
+ failCommands: ["getMore"]
215
+ blockConnection: true
216
+ blockTimeMS: 15
217
+ - name: createFindCursor
218
+ object: *collection
219
+ arguments:
220
+ filter: {}
221
+ cursorType: tailableAwait
222
+ batchSize: 1
223
+ saveResultAsEntity: &tailableCursor tailableCursor
224
+ # Iterate twice to force a getMore.
225
+ - name: iterateUntilDocumentOrError
226
+ object: *tailableCursor
227
+ - name: iterateUntilDocumentOrError
228
+ object: *tailableCursor
229
+ expectError:
230
+ isTimeoutError: true
231
+ expectEvents:
232
+ - client: *client
233
+ events:
234
+ - commandStartedEvent:
235
+ commandName: find
236
+ databaseName: *databaseName
237
+ command:
238
+ find: *collectionName
239
+ tailable: true
240
+ awaitData: true
241
+ maxTimeMS: { $$exists: true }
242
+ - commandStartedEvent:
243
+ commandName: getMore
244
+ databaseName: *databaseName
245
+ command:
246
+ getMore: { $$type: ["int", "long"] }
247
+ collection: *collectionName
@@ -0,0 +1,181 @@
1
+ description: "timeoutMS behaves correctly for tailable non-awaitData cursors"
2
+
3
+ schemaVersion: "1.9"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.4"
7
+
8
+ createEntities:
9
+ - client:
10
+ id: &failPointClient failPointClient
11
+ useMultipleMongoses: false
12
+ - client:
13
+ id: &client client
14
+ uriOptions:
15
+ timeoutMS: 10
16
+ useMultipleMongoses: false
17
+ observeEvents:
18
+ - commandStartedEvent
19
+ - database:
20
+ id: &database database
21
+ client: *client
22
+ databaseName: &databaseName test
23
+ - collection:
24
+ id: &collection collection
25
+ database: *database
26
+ collectionName: &collectionName coll
27
+
28
+ initialData:
29
+ - collectionName: *collectionName
30
+ databaseName: *databaseName
31
+ createOptions:
32
+ capped: true
33
+ size: 500
34
+ documents:
35
+ - { _id: 0 }
36
+ - { _id: 1 }
37
+
38
+ tests:
39
+ - description: "error if timeoutMode is cursor_lifetime"
40
+ operations:
41
+ - name: find
42
+ object: *collection
43
+ arguments:
44
+ filter: {}
45
+ timeoutMode: cursorLifetime
46
+ cursorType: tailable
47
+ expectError:
48
+ isClientError: true
49
+
50
+ - description: "timeoutMS applied to find"
51
+ operations:
52
+ - name: failPoint
53
+ object: testRunner
54
+ arguments:
55
+ client: *failPointClient
56
+ failPoint:
57
+ configureFailPoint: failCommand
58
+ mode: { times: 1 }
59
+ data:
60
+ failCommands: ["find"]
61
+ blockConnection: true
62
+ blockTimeMS: 15
63
+ - name: find
64
+ object: *collection
65
+ arguments:
66
+ filter: {}
67
+ cursorType: tailable
68
+ expectError:
69
+ isTimeoutError: true
70
+ expectEvents:
71
+ - client: *client
72
+ events:
73
+ # Due to SERVER-51153, the find command should not contain a maxTimeMS field for tailable non-awaitData
74
+ # cursors because that would cap the lifetime of the created cursor.
75
+ - commandStartedEvent:
76
+ commandName: find
77
+ databaseName: *databaseName
78
+ command:
79
+ find: *collectionName
80
+ tailable: true
81
+ awaitData: { $$exists: false }
82
+ maxTimeMS: { $$exists: false }
83
+
84
+ # The timeoutMS option should apply separately to the initial "find" and each getMore. This is a success test. The
85
+ # find is executed with timeoutMS=20 and both find and getMore commands are configured to block for 15ms each. Neither
86
+ # exceeds the timeout so the operation succeeds.
87
+ - description: "timeoutMS is refreshed for getMore - success"
88
+ operations:
89
+ - name: failPoint
90
+ object: testRunner
91
+ arguments:
92
+ client: *failPointClient
93
+ failPoint:
94
+ configureFailPoint: failCommand
95
+ mode: { times: 2 }
96
+ data:
97
+ failCommands: ["find", "getMore"]
98
+ blockConnection: true
99
+ blockTimeMS: 15
100
+ - name: createFindCursor
101
+ object: *collection
102
+ arguments:
103
+ filter: {}
104
+ cursorType: tailable
105
+ timeoutMS: 20
106
+ batchSize: 1
107
+ saveResultAsEntity: &tailableCursor tailableCursor
108
+ # Iterate the cursor twice: the first iteration will return the document from the batch in the find and the
109
+ # second will do a getMore.
110
+ - name: iterateUntilDocumentOrError
111
+ object: *tailableCursor
112
+ - name: iterateUntilDocumentOrError
113
+ object: *tailableCursor
114
+ expectEvents:
115
+ - client: *client
116
+ events:
117
+ - commandStartedEvent:
118
+ commandName: find
119
+ databaseName: *databaseName
120
+ command:
121
+ find: *collectionName
122
+ tailable: true
123
+ awaitData: { $$exists: false }
124
+ maxTimeMS: { $$exists: false }
125
+ - commandStartedEvent:
126
+ commandName: getMore
127
+ databaseName: *databaseName
128
+ command:
129
+ getMore: { $$type: ["int", "long"] }
130
+ collection: *collectionName
131
+ maxTimeMS: { $$exists: false }
132
+
133
+ # The timeoutMS option should apply separately to the initial "find" and each getMore. This is a failure test. The
134
+ # find inherits timeoutMS=10 from the collection and the getMore command blocks for 15ms, causing iteration to fail
135
+ # with a timeout error.
136
+ - description: "timeoutMS is refreshed for getMore - failure"
137
+ operations:
138
+ - name: failPoint
139
+ object: testRunner
140
+ arguments:
141
+ client: *failPointClient
142
+ failPoint:
143
+ configureFailPoint: failCommand
144
+ mode: { times: 1 }
145
+ data:
146
+ failCommands: ["getMore"]
147
+ blockConnection: true
148
+ blockTimeMS: 15
149
+ - name: createFindCursor
150
+ object: *collection
151
+ arguments:
152
+ filter: {}
153
+ cursorType: tailable
154
+ batchSize: 1
155
+ saveResultAsEntity: &tailableCursor tailableCursor
156
+ # Iterate the cursor twice: the first iteration will return the document from the batch in the find and the
157
+ # second will do a getMore.
158
+ - name: iterateUntilDocumentOrError
159
+ object: *tailableCursor
160
+ - name: iterateUntilDocumentOrError
161
+ object: *tailableCursor
162
+ expectError:
163
+ isTimeoutError: true
164
+ expectEvents:
165
+ - client: *client
166
+ events:
167
+ - commandStartedEvent:
168
+ commandName: find
169
+ databaseName: *databaseName
170
+ command:
171
+ find: *collectionName
172
+ tailable: true
173
+ awaitData: { $$exists: false }
174
+ maxTimeMS: { $$exists: false }
175
+ - commandStartedEvent:
176
+ commandName: getMore
177
+ databaseName: *databaseName
178
+ command:
179
+ getMore: { $$type: ["int", "long"] }
180
+ collection: *collectionName
181
+ maxTimeMS: { $$exists: false }
@@ -8,6 +8,8 @@ runOnRequirements:
8
8
  # https://jira.mongodb.org/browse/DRIVERS-291
9
9
  maxServerVersion: "7.99"
10
10
  topologies: [ replicaset, sharded, load-balanced ]
11
+ # SERVER-90047: failures against latest server necessitate adding this for now
12
+ maxServerVersion: "8.0.0"
11
13
 
12
14
  _yamlAnchors:
13
15
  readConcern: &readConcern
@@ -61,6 +63,8 @@ tests:
61
63
  - description: "Aggregate with $out includes read preference for 5.0+ server"
62
64
  runOnRequirements:
63
65
  - minServerVersion: "5.0"
66
+ # https://jira.mongodb.org/browse/RUBY-3539
67
+ maxServerVersion: "7.99"
64
68
  serverless: "forbid"
65
69
  operations:
66
70
  - object: *collection0
@@ -11,6 +11,8 @@ runOnRequirements:
11
11
  maxServerVersion: "7.99"
12
12
  topologies: [ replicaset ]
13
13
  serverless: forbid
14
+ # SERVER-90047: failures against latest server necessitate adding this for now
15
+ maxServerVersion: "8.0.0"
14
16
 
15
17
  _yamlAnchors:
16
18
  readConcern: &readConcern
@@ -54,6 +56,8 @@ tests:
54
56
  - description: "Database-level aggregate with $out includes read preference for 5.0+ server"
55
57
  runOnRequirements:
56
58
  - minServerVersion: "5.0"
59
+ # https://jira.mongodb.org/browse/RUBY-3539
60
+ maxServerVersion: "7.99"
57
61
  serverless: "forbid"
58
62
  operations:
59
63
  - object: *database0
@@ -1,3 +1,6 @@
1
+ # This spec is specific to the ruby driver, and is not part of the general
2
+ # `specifications` repo.
3
+
1
4
  description: "find options"
2
5
 
3
6
  schemaVersion: "1.0"
@@ -162,11 +165,30 @@ tests:
162
165
  commandName: find
163
166
  databaseName: *database0Name
164
167
 
168
+ - description: "timeoutMS"
169
+ operations:
170
+ - name: find
171
+ arguments:
172
+ filter: *filter
173
+ timeoutMS: &timeoutMS 1000
174
+ object: *collection0
175
+ expectEvents:
176
+ - client: *client0
177
+ events:
178
+ - commandStartedEvent:
179
+ command:
180
+ find: *collection0Name
181
+ filter: *filter
182
+ maxTimeMS: { $$type: [ int ] }
183
+ commandName: find
184
+ databaseName: *database0Name
185
+
165
186
  - description: "max"
166
187
  operations:
167
188
  - name: find
168
189
  arguments:
169
190
  filter: *filter
191
+ hint: { _id: 1 }
170
192
  max: &max { _id: 10 }
171
193
  object: *collection0
172
194
  expectEvents:
@@ -182,6 +204,11 @@ tests:
182
204
 
183
205
  - description: "min"
184
206
  operations:
207
+ - name: createIndex
208
+ object: *collection0
209
+ arguments:
210
+ name: "name_1"
211
+ keys: { name: 1 }
185
212
  - name: find
186
213
  arguments:
187
214
  filter: *filter
@@ -191,6 +218,8 @@ tests:
191
218
  expectEvents:
192
219
  - client: *client0
193
220
  events:
221
+ - commandStartedEvent:
222
+ commandName: createIndexes
194
223
  - commandStartedEvent:
195
224
  command:
196
225
  find: *collection0Name
@@ -15,18 +15,18 @@ describe 'Server Selection moving average round trip time calculation' do
15
15
 
16
16
  context(spec.description) do
17
17
 
18
- let(:averager) do
19
- Mongo::Server::RoundTripTimeAverager.new
18
+ let(:calculator) do
19
+ Mongo::Server::RoundTripTimeCalculator.new
20
20
  end
21
21
 
22
22
  before do
23
- averager.instance_variable_set(:@average_round_trip_time, spec.average_rtt)
24
- averager.instance_variable_set(:@last_round_trip_time, spec.new_rtt)
25
- averager.send(:update_average_round_trip_time)
23
+ calculator.instance_variable_set(:@average_round_trip_time, spec.average_rtt)
24
+ calculator.instance_variable_set(:@last_round_trip_time, spec.new_rtt)
25
+ calculator.update_average_round_trip_time
26
26
  end
27
27
 
28
28
  it 'correctly calculates the moving average round trip time' do
29
- expect(averager.average_round_trip_time).to eq(spec.new_average_rtt)
29
+ expect(calculator.average_round_trip_time).to eq(spec.new_average_rtt)
30
30
  end
31
31
  end
32
32
  end