File: sdam-error-handling.yml

package info (click to toggle)
golang-mongodb-mongo-driver 1.8.4%2Bds1-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-backports
  • size: 18,520 kB
  • sloc: perl: 533; ansic: 491; python: 432; makefile: 187; sh: 72
file content (274 lines) | stat: -rw-r--r-- 8,538 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
description: state change errors are correctly handled

schemaVersion: '1.3'

runOnRequirements:
  - topologies: [ load-balanced ]

_yamlAnchors:
  observedEvents: &observedEvents
    - connectionCreatedEvent
    - connectionReadyEvent
    - connectionCheckedOutEvent
    - connectionCheckOutFailedEvent
    - connectionCheckedInEvent
    - connectionClosedEvent
    - poolClearedEvent

createEntities:
  - client:
      id: &failPointClient failPointClient
      useMultipleMongoses: false
  - client:
      id: &singleClient singleClient
      useMultipleMongoses: false
      uriOptions:
        appname: &singleClientAppName lbSDAMErrorTestClient
        retryWrites: false
      observeEvents: *observedEvents
  - database:
      id: &singleDB singleDB
      client: *singleClient
      databaseName: &singleDBName singleDB
  - collection:
      id: &singleColl singleColl
      database: *singleDB
      collectionName: &singleCollName singleColl
  - client:
      id: &multiClient multiClient
      useMultipleMongoses: true
      uriOptions:
        retryWrites: false
      observeEvents: *observedEvents
  - database:
      id: &multiDB multiDB
      client: *multiClient
      databaseName: &multiDBName multiDB
  - collection:
      id: &multiColl multiColl
      database: *multiDB
      collectionName: &multiCollName multiColl

initialData:
  - collectionName: *singleCollName
    databaseName: *singleDBName
    documents:
      - _id: 1
      - _id: 2
      - _id: 3
  - collectionName: *multiCollName
    databaseName: *multiDBName
    documents:
      - _id: 1
      - _id: 2
      - _id: 3

tests:
  - description: only connections for a specific serviceId are closed when pools are cleared
    runOnRequirements:
    # This test assumes that two sequential connections receive different serviceIDs.
    # Sequential connections to a serverless instance may receive the same serviceID.
    - serverless: forbid
    operations:
      # Create two cursors to force two connections.
      - name: createFindCursor
        object: *multiColl
        arguments:
          filter: {}
          batchSize: 2
        saveResultAsEntity: &cursor0 cursor0
      - name: createFindCursor
        object: *multiColl
        arguments:
          filter: {}
          batchSize: 2
        saveResultAsEntity: &cursor1 cursor1
      # Close both cursors to return the connections to the pool.
      - name: close
        object: *cursor0
      - name: close
        object: *cursor1
      # Fail an operation with a state change error.
      - name: failPoint
        object: testRunner
        arguments:
          client: *multiClient
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
              failCommands: [insert]
              errorCode: &errorCode 11600 # InterruptedAtShutdown
      - name: insertOne
        object: *multiColl
        arguments:
          document: { x: 1 }
        expectError:
          errorCode: *errorCode
      # Do another operation to ensure the relevant connection has been closed.
      - name: insertOne
        object: *multiColl
        arguments:
          document: { x: 1 }
    expectEvents:
      - client: *multiClient
        eventType: cmap
        events:
          # Create cursors.
          - connectionCreatedEvent: {}
          - connectionReadyEvent: {}
          - connectionCheckedOutEvent: {}
          - connectionCreatedEvent: {}
          - connectionReadyEvent: {}
          - connectionCheckedOutEvent: {}
          # Close cursors.
          - connectionCheckedInEvent: {}
          - connectionCheckedInEvent: {}
          # Set failpoint.
          - connectionCheckedOutEvent: {}
          - connectionCheckedInEvent: {}
          # First insertOne.
          - connectionCheckedOutEvent: {}
          - poolClearedEvent: {}
          - connectionCheckedInEvent: {}
          - connectionClosedEvent:
              reason: stale
          # Second insertOne.
          - connectionCheckedOutEvent: {}
          - connectionCheckedInEvent: {}

  # This test uses singleClient to ensure that connection attempts are routed
  # to the same mongos on which the failpoint is set.
  - description: errors during the initial connection hello are ignore 
    runOnRequirements:
      # Server version 4.9+ is needed to set a fail point on the initial
      # connection handshake with the appName filter due to SERVER-49336.
      - minServerVersion: '4.9'
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *failPointClient
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
              failCommands: [isMaster]
              closeConnection: true
              appName: *singleClientAppName
      - name: insertOne
        object: *singleColl
        arguments:
          document: { x: 1 }
        expectError:
          isClientError: true
    expectEvents:
      - client: *singleClient
        eventType: cmap
        events:
          - connectionCreatedEvent: {}
          - connectionClosedEvent:
              reason: error
          - connectionCheckOutFailedEvent:
              reason: connectionError

  - description: errors during authentication are processed
    runOnRequirements:
      - auth: true
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *failPointClient
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
              failCommands: [saslContinue]
              closeConnection: true
              appName: *singleClientAppName
      - name: insertOne
        object: *singleColl
        arguments:
          document: { x: 1 }
        expectError:
          isClientError: true
    expectEvents:
      - client: *singleClient
        eventType: cmap
        events:
          - connectionCreatedEvent: {}
          - poolClearedEvent: {}
          - connectionClosedEvent:
              reason: error
          - connectionCheckOutFailedEvent:
              reason: connectionError

  - description: stale errors are ignored
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *failPointClient
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 2 }
            data:
              failCommands: [getMore]
              closeConnection: true
      # Force two connections to be checked out from the pool.
      - name: createFindCursor
        object: *singleColl
        arguments:
          filter: {}
          batchSize: 2
        saveResultAsEntity: &cursor0 cursor0
      - name: createFindCursor
        object: *singleColl
        arguments:
          filter: {}
          batchSize: 2
        saveResultAsEntity: &cursor1 cursor1
      # Iterate cursor0 three times to force a network error.
      - name: iterateUntilDocumentOrError
        object: *cursor0
      - name: iterateUntilDocumentOrError
        object: *cursor0
      - name: iterateUntilDocumentOrError
        object: *cursor0
        expectError:
          isClientError: true
      - name: close
        object: *cursor0
      # Iterate cursor1 three times to force a network error.
      - name: iterateUntilDocumentOrError
        object: *cursor1
      - name: iterateUntilDocumentOrError
        object: *cursor1
      - name: iterateUntilDocumentOrError
        object: *cursor1
        expectError:
          isClientError: true
      - name: close
        object: *cursor1
    expectEvents:
      - client: *singleClient
        eventType: cmap
        events:
          # Events for creating both cursors.
          - connectionCreatedEvent: {}
          - connectionReadyEvent: {}
          - connectionCheckedOutEvent: {}
          - connectionCreatedEvent: {}
          - connectionReadyEvent: {}
          - connectionCheckedOutEvent: {}
          # Events for iterating and closing the first cursor.  The failed
          # getMore should cause a poolClearedEvent to be published.
          - poolClearedEvent: {}
          - connectionCheckedInEvent: {}
          - connectionClosedEvent: {}
          # Events for iterating and closing the second cursor. The failed
          # getMore should not clear the pool because the connection's
          # generation number is stale.
          - connectionCheckedInEvent: {}
          - connectionClosedEvent: {}