mongo 2.19.3 → 2.20.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 (86) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Rakefile +27 -154
  4. data/lib/mongo/cluster/topology/base.rb +16 -0
  5. data/lib/mongo/cluster.rb +27 -1
  6. data/lib/mongo/collection/view/iterable.rb +1 -0
  7. data/lib/mongo/collection.rb +4 -2
  8. data/lib/mongo/error/transactions_not_supported.rb +34 -0
  9. data/lib/mongo/error.rb +1 -0
  10. data/lib/mongo/grid/fs_bucket.rb +6 -0
  11. data/lib/mongo/monitoring/event/secure.rb +1 -1
  12. data/lib/mongo/operation/shared/executable.rb +43 -27
  13. data/lib/mongo/operation/shared/response_handling.rb +23 -25
  14. data/lib/mongo/retryable/read_worker.rb +7 -6
  15. data/lib/mongo/retryable/write_worker.rb +7 -4
  16. data/lib/mongo/retryable.rb +2 -2
  17. data/lib/mongo/server/app_metadata/environment.rb +64 -9
  18. data/lib/mongo/server/app_metadata.rb +5 -4
  19. data/lib/mongo/server/description/features.rb +1 -0
  20. data/lib/mongo/server_selector/base.rb +32 -6
  21. data/lib/mongo/session/server_session/dirtyable.rb +52 -0
  22. data/lib/mongo/session/server_session.rb +3 -0
  23. data/lib/mongo/session/session_pool.rb +12 -18
  24. data/lib/mongo/session.rb +32 -0
  25. data/lib/mongo/uri.rb +0 -4
  26. data/lib/mongo/version.rb +1 -1
  27. data/mongo.gemspec +1 -7
  28. data/spec/atlas/atlas_connectivity_spec.rb +4 -4
  29. data/spec/faas/ruby-sam-app/Gemfile +9 -0
  30. data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
  31. data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
  32. data/spec/faas/ruby-sam-app/template.yaml +48 -0
  33. data/spec/integration/client_side_encryption/corpus_spec.rb +10 -2
  34. data/spec/integration/retryable_reads_errors_spec.rb +161 -8
  35. data/spec/integration/retryable_writes_errors_spec.rb +156 -0
  36. data/spec/mongo/cluster_spec.rb +36 -0
  37. data/spec/mongo/collection/view/aggregation_spec.rb +6 -1
  38. data/spec/mongo/collection/view/explainable_spec.rb +2 -0
  39. data/spec/mongo/collection_crud_spec.rb +1 -1
  40. data/spec/mongo/operation/insert_spec.rb +1 -1
  41. data/spec/mongo/retryable/write_worker_spec.rb +39 -0
  42. data/spec/mongo/server/app_metadata/environment_spec.rb +135 -0
  43. data/spec/mongo/server/app_metadata_spec.rb +12 -2
  44. data/spec/mongo/server/connection_spec.rb +4 -0
  45. data/spec/mongo/session/session_pool_spec.rb +1 -16
  46. data/spec/mongo/session_transaction_spec.rb +15 -0
  47. data/spec/mongo/uri_spec.rb +0 -9
  48. data/spec/runners/crud/test.rb +0 -8
  49. data/spec/runners/crud.rb +1 -1
  50. data/spec/runners/transactions/test.rb +12 -3
  51. data/spec/runners/unified/assertions.rb +16 -3
  52. data/spec/runners/unified/crud_operations.rb +12 -0
  53. data/spec/runners/unified/support_operations.rb +3 -5
  54. data/spec/runners/unified/test.rb +8 -1
  55. data/spec/shared/lib/mrss/docker_runner.rb +3 -0
  56. data/spec/shared/share/Dockerfile.erb +20 -69
  57. data/spec/shared/shlib/server.sh +1 -0
  58. data/spec/shared/shlib/set_env.sh +5 -28
  59. data/spec/spec_tests/data/client_side_encryption/explain.yml +2 -2
  60. data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
  61. data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
  62. data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +348 -0
  63. data/spec/spec_tests/data/index_management/createSearchIndex.yml +5 -3
  64. data/spec/spec_tests/data/index_management/createSearchIndexes.yml +7 -4
  65. data/spec/spec_tests/data/index_management/dropSearchIndex.yml +2 -1
  66. data/spec/spec_tests/data/index_management/listSearchIndexes.yml +13 -7
  67. data/spec/spec_tests/data/index_management/updateSearchIndex.yml +2 -1
  68. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +3 -6
  69. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +3 -6
  70. data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
  71. data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
  72. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +1 -1
  73. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +7 -7
  74. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
  75. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
  76. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
  77. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -3
  78. data/spec/spec_tests/run_command_unified_spec.rb +13 -0
  79. data/spec/spec_tests/sdam_unified_spec.rb +2 -0
  80. data/spec/support/constraints.rb +6 -0
  81. data/spec/support/ocsp +1 -1
  82. data/spec/support/recording_logger.rb +27 -0
  83. data.tar.gz.sig +0 -0
  84. metadata +1272 -1253
  85. metadata.gz.sig +0 -0
  86. data/spec/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +0 -49
@@ -0,0 +1,319 @@
1
+ description: runCommand
2
+
3
+ schemaVersion: "1.3"
4
+
5
+ createEntities:
6
+ - client:
7
+ id: &client client
8
+ useMultipleMongoses: false
9
+ observeEvents: [commandStartedEvent]
10
+ - database:
11
+ id: &db db
12
+ client: *client
13
+ databaseName: *db
14
+ - collection:
15
+ id: &collection collection
16
+ database: *db
17
+ collectionName: *collection
18
+ - database:
19
+ id: &dbWithRC dbWithRC
20
+ client: *client
21
+ databaseName: *dbWithRC
22
+ databaseOptions:
23
+ readConcern: { level: 'local' }
24
+ - database:
25
+ id: &dbWithWC dbWithWC
26
+ client: *client
27
+ databaseName: *dbWithWC
28
+ databaseOptions:
29
+ writeConcern: { w: 0 }
30
+ - session:
31
+ id: &session session
32
+ client: *client
33
+ # Stable API test
34
+ - client:
35
+ id: &clientWithStableApi clientWithStableApi
36
+ observeEvents: [commandStartedEvent]
37
+ serverApi:
38
+ version: "1"
39
+ strict: true
40
+ - database:
41
+ id: &dbWithStableApi dbWithStableApi
42
+ client: *clientWithStableApi
43
+ databaseName: *dbWithStableApi
44
+
45
+ initialData:
46
+ - collectionName: *collection
47
+ databaseName: *db
48
+ documents: []
49
+
50
+ tests:
51
+ - description: always attaches $db and implicit lsid to given command and omits default readPreference
52
+ operations:
53
+ - name: runCommand
54
+ object: *db
55
+ arguments:
56
+ commandName: ping
57
+ command: { ping: 1 }
58
+ expectResult: { ok: 1 }
59
+ expectEvents:
60
+ - client: *client
61
+ events:
62
+ - commandStartedEvent:
63
+ command:
64
+ ping: 1
65
+ $db: *db
66
+ lsid: { $$exists: true }
67
+ $readPreference: { $$exists: false }
68
+ commandName: ping
69
+
70
+ - description: always gossips the $clusterTime on the sent command
71
+ runOnRequirements:
72
+ # Only replicasets and sharded clusters have a $clusterTime
73
+ - topologies: [ replicaset, sharded ]
74
+ operations:
75
+ # We have to run one command to obtain a clusterTime to gossip
76
+ - name: runCommand
77
+ object: *db
78
+ arguments:
79
+ commandName: ping
80
+ command: { ping: 1 }
81
+ expectResult: { ok: 1 }
82
+ - name: runCommand
83
+ object: *db
84
+ arguments:
85
+ commandName: ping
86
+ command: { ping: 1 }
87
+ expectResult: { ok: 1 }
88
+ expectEvents:
89
+ - client: *client
90
+ events:
91
+ - commandStartedEvent:
92
+ commandName: ping
93
+ # Only check the shape of the second ping which should have the $clusterTime received from the first operation
94
+ - commandStartedEvent:
95
+ command:
96
+ ping: 1
97
+ $clusterTime: { $$exists: true }
98
+ commandName: ping
99
+
100
+ - description: attaches the provided session lsid to given command
101
+ operations:
102
+ - name: runCommand
103
+ object: *db
104
+ arguments:
105
+ commandName: ping
106
+ command: { ping: 1 }
107
+ session: *session
108
+ expectResult: { ok: 1 }
109
+ expectEvents:
110
+ - client: *client
111
+ events:
112
+ - commandStartedEvent:
113
+ command:
114
+ ping: 1
115
+ lsid: { $$sessionLsid: *session }
116
+ $db: *db
117
+ commandName: ping
118
+
119
+ - description: attaches the provided $readPreference to given command
120
+ runOnRequirements:
121
+ # Exclude single topology, which is most likely a standalone server
122
+ - topologies: [ replicaset, load-balanced, sharded ]
123
+ operations:
124
+ - name: runCommand
125
+ object: *db
126
+ arguments:
127
+ commandName: ping
128
+ command: { ping: 1 }
129
+ readPreference: &readPreference { mode: 'nearest' }
130
+ expectResult: { ok: 1 }
131
+ expectEvents:
132
+ - client: *client
133
+ events:
134
+ - commandStartedEvent:
135
+ command:
136
+ ping: 1
137
+ $readPreference: *readPreference
138
+ $db: *db
139
+ commandName: ping
140
+
141
+ - description: does not attach $readPreference to given command on standalone
142
+ runOnRequirements:
143
+ # This test assumes that the single topology contains a standalone server;
144
+ # however, it is possible for a single topology to contain a direct
145
+ # connection to another server type.
146
+ # See: https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst#topology-type-single
147
+ - topologies: [ single ]
148
+ operations:
149
+ - name: runCommand
150
+ object: *db
151
+ arguments:
152
+ commandName: ping
153
+ command: { ping: 1 }
154
+ readPreference: { mode: 'nearest' }
155
+ expectResult: { ok: 1 }
156
+ expectEvents:
157
+ - client: *client
158
+ events:
159
+ - commandStartedEvent:
160
+ command:
161
+ ping: 1
162
+ $readPreference: { $$exists: false }
163
+ $db: *db
164
+ commandName: ping
165
+
166
+ - description: does not attach primary $readPreference to given command
167
+ operations:
168
+ - name: runCommand
169
+ object: *db
170
+ arguments:
171
+ commandName: ping
172
+ command: { ping: 1 }
173
+ readPreference: { mode: 'primary' }
174
+ expectResult: { ok: 1 }
175
+ expectEvents:
176
+ - client: *client
177
+ events:
178
+ - commandStartedEvent:
179
+ command:
180
+ ping: 1
181
+ $readPreference: { $$exists: false }
182
+ $db: *db
183
+ commandName: ping
184
+
185
+ - description: does not inherit readConcern specified at the db level
186
+ operations:
187
+ - name: runCommand
188
+ object: *dbWithRC
189
+ # Test with a command that supports a readConcern option.
190
+ # expectResult is intentionally omitted because some drivers
191
+ # may automatically convert command responses into cursors.
192
+ arguments:
193
+ commandName: aggregate
194
+ command: { aggregate: *collection, pipeline: [], cursor: {} }
195
+ expectEvents:
196
+ - client: *client
197
+ events:
198
+ - commandStartedEvent:
199
+ command:
200
+ aggregate: *collection
201
+ readConcern: { $$exists: false }
202
+ $db: *dbWithRC
203
+ commandName: aggregate
204
+
205
+ - description: does not inherit writeConcern specified at the db level
206
+ operations:
207
+ - name: runCommand
208
+ object: *dbWithWC
209
+ arguments:
210
+ commandName: insert
211
+ command:
212
+ insert: *collection
213
+ documents: [ { foo: 'bar' } ]
214
+ ordered: true
215
+ expectResult: { ok: 1 }
216
+ expectEvents:
217
+ - client: *client
218
+ events:
219
+ - commandStartedEvent:
220
+ command:
221
+ insert: *collection
222
+ writeConcern: { $$exists: false }
223
+ $db: *dbWithWC
224
+ commandName: insert
225
+
226
+ - description: does not retry retryable errors on given command
227
+ runOnRequirements:
228
+ - minServerVersion: "4.2"
229
+ operations:
230
+ - name: failPoint
231
+ object: testRunner
232
+ arguments:
233
+ client: *client
234
+ failPoint:
235
+ configureFailPoint: failCommand
236
+ mode: { times: 1 }
237
+ data:
238
+ failCommands: [ping]
239
+ closeConnection: true
240
+ - name: runCommand
241
+ object: *db
242
+ arguments:
243
+ commandName: ping
244
+ command: { ping: 1 }
245
+ expectError:
246
+ isClientError: true
247
+
248
+ - description: attaches transaction fields to given command
249
+ runOnRequirements:
250
+ - minServerVersion: "4.0"
251
+ topologies: [ replicaset ]
252
+ - minServerVersion: "4.2"
253
+ topologies: [ sharded, load-balanced ]
254
+ operations:
255
+ - name: withTransaction
256
+ object: *session
257
+ arguments:
258
+ callback:
259
+ - name: runCommand
260
+ object: *db
261
+ arguments:
262
+ session: *session
263
+ commandName: insert
264
+ command:
265
+ insert: *collection
266
+ documents: [ { foo: 'transaction' } ]
267
+ ordered: true
268
+ expectResult: { $$unsetOrMatches: { insertedId: { $$unsetOrMatches: 1 } } }
269
+ expectEvents:
270
+ - client: *client
271
+ events:
272
+ - commandStartedEvent:
273
+ command:
274
+ insert: *collection
275
+ documents: [ { foo: 'transaction' } ]
276
+ ordered: true
277
+ lsid: { $$sessionLsid: *session }
278
+ txnNumber: 1
279
+ startTransaction: true
280
+ autocommit: false
281
+ # omitted fields
282
+ readConcern: { $$exists: false }
283
+ writeConcern: { $$exists: false }
284
+ commandName: insert
285
+ databaseName: *db
286
+ - commandStartedEvent:
287
+ command:
288
+ commitTransaction: 1
289
+ lsid: { $$sessionLsid: *session }
290
+ txnNumber: 1
291
+ autocommit: false
292
+ # omitted fields
293
+ writeConcern: { $$exists: false }
294
+ readConcern: { $$exists: false }
295
+ commandName: commitTransaction
296
+ databaseName: admin
297
+
298
+ - description: attaches apiVersion fields to given command when stableApi is configured on the client
299
+ runOnRequirements:
300
+ - minServerVersion: "5.0"
301
+ operations:
302
+ - name: runCommand
303
+ object: *dbWithStableApi
304
+ arguments:
305
+ commandName: ping
306
+ command:
307
+ ping: 1
308
+ expectResult: { ok: 1 }
309
+ expectEvents:
310
+ - client: *clientWithStableApi
311
+ events:
312
+ - commandStartedEvent:
313
+ command:
314
+ ping: 1
315
+ $db: *dbWithStableApi
316
+ apiVersion: "1"
317
+ apiStrict: true
318
+ apiDeprecationErrors: { $$unsetOrMatches: false }
319
+ commandName: ping
@@ -0,0 +1,351 @@
1
+ description: "driver-sessions-dirty-session-errors"
2
+
3
+ schemaVersion: "1.0"
4
+
5
+ runOnRequirements:
6
+ - minServerVersion: "4.0"
7
+ topologies: [ replicaset ]
8
+ - minServerVersion: "4.1.8"
9
+ topologies: [ sharded ]
10
+
11
+ createEntities:
12
+ - client:
13
+ id: &client0 client0
14
+ useMultipleMongoses: false
15
+ observeEvents: [ commandStartedEvent ]
16
+ - database:
17
+ id: &database0 database0
18
+ client: *client0
19
+ databaseName: &database0Name session-tests
20
+ - collection:
21
+ id: &collection0 collection0
22
+ database: *database0
23
+ collectionName: &collection0Name test
24
+ - session:
25
+ id: &session0 session0
26
+ client: *client0
27
+
28
+ initialData:
29
+ - collectionName: *collection0Name
30
+ databaseName: *database0Name
31
+ documents:
32
+ - { _id: 1 }
33
+
34
+ tests:
35
+ - description: "Dirty explicit session is discarded (insert)"
36
+ operations:
37
+ - name: failPoint
38
+ object: testRunner
39
+ arguments:
40
+ client: *client0
41
+ failPoint:
42
+ configureFailPoint: failCommand
43
+ mode: { times: 1 }
44
+ data:
45
+ failCommands: [ insert ]
46
+ closeConnection: true
47
+ - name: assertSessionNotDirty
48
+ object: testRunner
49
+ arguments:
50
+ session: *session0
51
+ - name: insertOne
52
+ object: *collection0
53
+ arguments:
54
+ session: *session0
55
+ document: { _id: 2 }
56
+ expectResult: { $$unsetOrMatches: { insertedId: { $$unsetOrMatches: 2 } } }
57
+ - name: assertSessionDirty
58
+ object: testRunner
59
+ arguments:
60
+ session: *session0
61
+ - name: insertOne
62
+ object: *collection0
63
+ arguments:
64
+ session: *session0
65
+ document: { _id: 3 }
66
+ expectResult: { $$unsetOrMatches: { insertedId: { $$unsetOrMatches: 3 } } }
67
+ - name: assertSessionDirty
68
+ object: testRunner
69
+ arguments:
70
+ session: *session0
71
+ - name: endSession
72
+ object: *session0
73
+ - &find_with_implicit_session
74
+ name: find
75
+ object: *collection0
76
+ arguments:
77
+ filter: { _id: -1 }
78
+ expectResult: []
79
+ - name: assertDifferentLsidOnLastTwoCommands
80
+ object: testRunner
81
+ arguments:
82
+ client: *client0
83
+ expectEvents:
84
+ - client: *client0
85
+ events:
86
+ - commandStartedEvent: &insert_attempt
87
+ command:
88
+ insert: *collection0Name
89
+ documents:
90
+ - { _id: 2 }
91
+ ordered: true
92
+ lsid: { $$sessionLsid: *session0 }
93
+ txnNumber: 1
94
+ commandName: insert
95
+ databaseName: *database0Name
96
+ - commandStartedEvent: *insert_attempt
97
+ - commandStartedEvent:
98
+ command:
99
+ insert: *collection0Name
100
+ documents:
101
+ - { _id: 3 }
102
+ ordered: true
103
+ lsid: { $$sessionLsid: *session0 }
104
+ txnNumber: 2
105
+ commandName: insert
106
+ databaseName: *database0Name
107
+ - commandStartedEvent: &find_with_implicit_session_event
108
+ command:
109
+ find: *collection0Name
110
+ filter: { _id: -1 }
111
+ # There is no explicit session to use with $$sessionLsid, so
112
+ # just assert an arbitrary lsid document
113
+ lsid: { $$type: object }
114
+ commandName: find
115
+ databaseName: *database0Name
116
+ outcome:
117
+ - collectionName: *collection0Name
118
+ databaseName: *database0Name
119
+ documents:
120
+ - { _id: 1 }
121
+ - { _id: 2 }
122
+ - { _id: 3 }
123
+
124
+ - description: "Dirty explicit session is discarded (findAndModify)"
125
+ operations:
126
+ - name: failPoint
127
+ object: testRunner
128
+ arguments:
129
+ client: *client0
130
+ failPoint:
131
+ configureFailPoint: failCommand
132
+ mode: { times: 1 }
133
+ data:
134
+ failCommands: [ findAndModify ]
135
+ closeConnection: true
136
+ - name: assertSessionNotDirty
137
+ object: testRunner
138
+ arguments:
139
+ session: *session0
140
+ - name: findOneAndUpdate
141
+ object: *collection0
142
+ arguments:
143
+ session: *session0
144
+ filter: { _id: 1 }
145
+ update: { $inc: { x: 1 } }
146
+ returnDocument: Before
147
+ expectResult: { _id: 1 }
148
+ - name: assertSessionDirty
149
+ object: testRunner
150
+ arguments:
151
+ session: *session0
152
+ - name: endSession
153
+ object: *session0
154
+ - *find_with_implicit_session
155
+ - name: assertDifferentLsidOnLastTwoCommands
156
+ object: testRunner
157
+ arguments:
158
+ client: *client0
159
+ expectEvents:
160
+ - client: *client0
161
+ events:
162
+ - commandStartedEvent: &findAndModify_attempt
163
+ command:
164
+ findAndModify: *collection0Name
165
+ query: { _id: 1 }
166
+ update: { $inc: { x: 1 } }
167
+ new: false
168
+ lsid: { $$sessionLsid: *session0 }
169
+ txnNumber: 1
170
+ readConcern: { $$exists: false }
171
+ writeConcern: { $$exists: false }
172
+ commandName: findAndModify
173
+ databaseName: *database0Name
174
+ - commandStartedEvent: *findAndModify_attempt
175
+ - commandStartedEvent: *find_with_implicit_session_event
176
+ outcome:
177
+ - collectionName: *collection0Name
178
+ databaseName: *database0Name
179
+ documents:
180
+ - { _id: 1, x: 1 }
181
+
182
+ - description: "Dirty implicit session is discarded (insert)"
183
+ operations:
184
+ - name: failPoint
185
+ object: testRunner
186
+ arguments:
187
+ client: *client0
188
+ failPoint:
189
+ configureFailPoint: failCommand
190
+ mode: { times: 1 }
191
+ data:
192
+ failCommands: [ insert ]
193
+ closeConnection: true
194
+ - name: insertOne
195
+ object: *collection0
196
+ arguments:
197
+ document: { _id: 2 }
198
+ expectResult: { $$unsetOrMatches: { insertedId: { $$unsetOrMatches: 2 } } }
199
+ - *find_with_implicit_session
200
+ - name: assertDifferentLsidOnLastTwoCommands
201
+ object: testRunner
202
+ arguments:
203
+ client: *client0
204
+ expectEvents:
205
+ - client: *client0
206
+ events:
207
+ - commandStartedEvent: &insert_attempt
208
+ command:
209
+ insert: *collection0Name
210
+ documents:
211
+ - { _id: 2 }
212
+ ordered: true
213
+ lsid: { $$type: object }
214
+ txnNumber: 1
215
+ commandName: insert
216
+ databaseName: *database0Name
217
+ - commandStartedEvent: *insert_attempt
218
+ - commandStartedEvent: *find_with_implicit_session_event
219
+ outcome:
220
+ - collectionName: *collection0Name
221
+ databaseName: *database0Name
222
+ documents:
223
+ - { _id: 1 }
224
+ - { _id: 2 }
225
+
226
+ - description: "Dirty implicit session is discarded (findAndModify)"
227
+ operations:
228
+ - name: failPoint
229
+ object: testRunner
230
+ arguments:
231
+ client: *client0
232
+ failPoint:
233
+ configureFailPoint: failCommand
234
+ mode: { times: 1 }
235
+ data:
236
+ failCommands: [ findAndModify ]
237
+ closeConnection: true
238
+ - name: findOneAndUpdate
239
+ object: *collection0
240
+ arguments:
241
+ filter: { _id: 1 }
242
+ update: { $inc: { x: 1 } }
243
+ returnDocument: Before
244
+ expectResult: { _id: 1 }
245
+ - *find_with_implicit_session
246
+ - name: assertDifferentLsidOnLastTwoCommands
247
+ object: testRunner
248
+ arguments:
249
+ client: *client0
250
+ expectEvents:
251
+ - client: *client0
252
+ events:
253
+ - commandStartedEvent: &findAndModify_attempt
254
+ command:
255
+ findAndModify: *collection0Name
256
+ query: { _id: 1 }
257
+ update: { $inc: { x: 1 } }
258
+ new: false
259
+ lsid: { $$type: object }
260
+ txnNumber: 1
261
+ readConcern: { $$exists: false }
262
+ writeConcern: { $$exists: false }
263
+ commandName: findAndModify
264
+ databaseName: *database0Name
265
+ - commandStartedEvent: *findAndModify_attempt
266
+ - commandStartedEvent: *find_with_implicit_session_event
267
+ outcome:
268
+ - collectionName: *collection0Name
269
+ databaseName: *database0Name
270
+ documents:
271
+ - { _id: 1, x: 1 }
272
+
273
+ - description: "Dirty implicit session is discarded (read returning cursor)"
274
+ operations:
275
+ - name: failPoint
276
+ object: testRunner
277
+ arguments:
278
+ client: *client0
279
+ failPoint:
280
+ configureFailPoint: failCommand
281
+ mode: { times: 1 }
282
+ data:
283
+ failCommands: [ aggregate ]
284
+ closeConnection: true
285
+ - name: aggregate
286
+ object: *collection0
287
+ arguments:
288
+ pipeline: [ { $project: { _id: 1 } } ]
289
+ expectResult: [ { _id: 1 } ]
290
+ - *find_with_implicit_session
291
+ - name: assertDifferentLsidOnLastTwoCommands
292
+ object: testRunner
293
+ arguments:
294
+ client: *client0
295
+ expectEvents:
296
+ - client: *client0
297
+ events:
298
+ - commandStartedEvent: &aggregate_attempt
299
+ command:
300
+ aggregate: *collection0Name
301
+ pipeline: [ { $project: { _id: 1 } } ]
302
+ lsid: { $$type: object }
303
+ commandName: aggregate
304
+ databaseName: *database0Name
305
+ - commandStartedEvent: *aggregate_attempt
306
+ - commandStartedEvent: *find_with_implicit_session_event
307
+ outcome:
308
+ - collectionName: *collection0Name
309
+ databaseName: *database0Name
310
+ documents:
311
+ - { _id: 1 }
312
+
313
+ - description: "Dirty implicit session is discarded (read not returning cursor)"
314
+ operations:
315
+ - name: failPoint
316
+ object: testRunner
317
+ arguments:
318
+ client: *client0
319
+ failPoint:
320
+ configureFailPoint: failCommand
321
+ mode: { times: 1 }
322
+ data:
323
+ failCommands: [ aggregate ]
324
+ closeConnection: true
325
+ - name: countDocuments
326
+ object: *collection0
327
+ arguments:
328
+ filter: {}
329
+ expectResult: 1
330
+ - *find_with_implicit_session
331
+ - name: assertDifferentLsidOnLastTwoCommands
332
+ object: testRunner
333
+ arguments:
334
+ client: *client0
335
+ expectEvents:
336
+ - client: *client0
337
+ events:
338
+ - commandStartedEvent: &countDocuments_attempt
339
+ command:
340
+ aggregate: *collection0Name
341
+ pipeline: [ { $match: {} }, { $group: { _id: 1, n: { $sum: 1 } } } ]
342
+ lsid: { $$type: object }
343
+ commandName: aggregate
344
+ databaseName: *database0Name
345
+ - commandStartedEvent: *countDocuments_attempt
346
+ - commandStartedEvent: *find_with_implicit_session_event
347
+ outcome:
348
+ - collectionName: *collection0Name
349
+ databaseName: *database0Name
350
+ documents:
351
+ - { _id: 1 }
@@ -143,7 +143,7 @@ tests:
143
143
  - description: "readConcern majority with out stage"
144
144
  runOnRequirements:
145
145
  - minServerVersion: "4.1.0"
146
- topologies: [ replicaset, sharded-replicaset ]
146
+ topologies: [ replicaset, sharded ]
147
147
  serverless: "forbid"
148
148
  operations:
149
149
  - name: aggregate