File: poc-retryable-writes.yml

package info (click to toggle)
golang-mongodb-mongo-driver 1.8.1%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 18,500 kB
  • sloc: perl: 533; ansic: 491; python: 432; makefile: 187; sh: 72
file content (210 lines) | stat: -rw-r--r-- 6,466 bytes parent folder | download | duplicates (3)
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
description: "poc-retryable-writes"

schemaVersion: "1.0"

runOnRequirements:
  - minServerVersion: "3.6"
    topologies: [ replicaset ]

createEntities:
  - client:
      id: &client0 client0
      useMultipleMongoses: false
      observeEvents: [ commandStartedEvent ]
  - client:
      id: &client1 client1
      uriOptions: { retryWrites: false }
      useMultipleMongoses: false
      observeEvents: [ commandStartedEvent ]
  - database:
      id: &database0 database0
      client: *client0
      databaseName: &databaseName retryable-writes-tests
  - database:
      id: &database1 database1
      client: *client1
      databaseName: *databaseName
  - collection:
      id: &collection0 collection0
      database: *database0
      collectionName: &collectionName coll
  - collection:
      id: &collection1 collection1
      database: *database1
      collectionName: *collectionName

initialData:
  - collectionName: *collectionName
    databaseName: *databaseName
    documents:
      - { _id: 1, x: 11 }
      - { _id: 2, x: 22 }

tests:
  - description: "FindOneAndUpdate is committed on first attempt"
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client0
          failPoint:
            configureFailPoint: onPrimaryTransactionalWrite
            mode: { times: 1 }
      - name: findOneAndUpdate
        object: *collection0
        arguments:
          filter: { _id: 1 }
          update: { $inc: { x : 1 } }
          returnDocument: Before
        expectResult: { _id: 1, x: 11 }
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 12 }
          - { _id: 2, x: 22 }

  - description: "FindOneAndUpdate is not committed on first attempt"
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client0
          failPoint:
            configureFailPoint: onPrimaryTransactionalWrite
            mode: { times: 1 }
            data: { failBeforeCommitExceptionCode: 1 }
      - name: findOneAndUpdate
        object: *collection0
        arguments:
          filter: { _id: 1 }
          update: { $inc: { x : 1 } }
          returnDocument: Before
        expectResult: { _id: 1, x: 11 }
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 12 }
          - { _id: 2, x: 22 }

  - description: "FindOneAndUpdate is never committed"
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client0
          failPoint:
            configureFailPoint: onPrimaryTransactionalWrite
            mode: { times: 2 }
            data: { failBeforeCommitExceptionCode: 1 }
      - name: findOneAndUpdate
        object: *collection0
        arguments:
          filter: { _id: 1 }
          update: { $inc: { x : 1 } }
          returnDocument: Before
        expectError: { isError: true }
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 11 }
          - { _id: 2, x: 22 }

  - description: "InsertMany succeeds after PrimarySteppedDown"
    runOnRequirements: &failCommand_requirements
      - minServerVersion: "4.0"
        topologies: [ replicaset ]
      - minServerVersion: "4.1.7"
        # Original test uses "sharded", but retryable writes requires a sharded
        # cluster backed by replica sets
        topologies: [ sharded-replicaset ]
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client0
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
              failCommands: [ insert ]
              errorCode: 189 # PrimarySteppedDown
              errorLabels: [  RetryableWriteError ]
      - name: insertMany
        object: *collection0
        arguments:
          documents:
            # Documents are modified from original test for "initialData"
            - { _id: 3, x: 33 }
            - { _id: 4, x: 44 }
          ordered: true
        expectResult:
          # InsertManyResult is optional because all of its fields are optional
          $$unsetOrMatches: { insertedIds: { $$unsetOrMatches: { 0: 3, 1: 4 } } }
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 11 }
          - { _id: 2, x: 22 }
          - { _id: 3, x: 33 }
          - { _id: 4, x: 44 }

  - description: "InsertOne fails after connection failure when retryWrites option is false"
    runOnRequirements: *failCommand_requirements
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client1
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 1 }
            data:
                failCommands: [ insert ]
                closeConnection: true
      - name: insertOne
        object: *collection1
        arguments:
          document: { _id: 3, x: 33 }
        expectError:
          # If retryWrites is false, the driver should not add the
          # RetryableWriteError label to the error.
          errorLabelsOmit: [ RetryableWriteError ]
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 11 }
          - { _id: 2, x: 22 }

  - description: "InsertOne fails after multiple retryable writeConcernErrors"
    runOnRequirements: *failCommand_requirements
    operations:
      - name: failPoint
        object: testRunner
        arguments:
          client: *client0
          failPoint:
            configureFailPoint: failCommand
            mode: { times: 2 }
            data:
              failCommands: [ insert ]
              writeConcernError:
                code: 91 # ShutdownInProgress
                errmsg: "Replication is being shut down"
      - name: insertOne
        object: *collection0
        arguments:
          document: { _id: 3, x: 33 }
        expectError:
          errorLabelsContain: [ RetryableWriteError ]
    outcome:
      - collectionName: *collectionName
        databaseName: *databaseName
        documents:
          - { _id: 1, x: 11 }
          - { _id: 2, x: 22 }
          - { _id: 3, x: 33 }  # The write was still applied