bson/testdata/transactions/legacy/error-labels.yml
2025-03-17 20:58:26 +01:00

1277 lines
35 KiB
YAML

runOn:
-
minServerVersion: "4.0"
topology: ["replicaset"]
-
minServerVersion: "4.1.8"
topology: ["sharded"]
# serverless proxy doesn't append error labels to errors in transactions
# caused by failpoints (CLOUDP-88216)
serverless: "forbid"
database_name: &database_name "transaction-tests"
collection_name: &collection_name "test"
data: []
tests:
- description: DuplicateKey errors do not contain transient label
operations:
- name: startTransaction
object: session0
- name: insertMany
object: collection
arguments:
session: session0
documents:
- _id: 1
- _id: 1
result:
errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"]
# DuplicateKey error code included in the bulk write error message
# returned by the server
errorContains: E11000
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: NotWritablePrimary errors contain transient label
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["insert"]
errorCode: 10107 # NotWritablePrimary
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
# Note, the server will return the errorLabel in this case.
errorLabelsContain: ["TransientTransactionError"]
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult"]
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: WriteConflict errors contain transient label
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["insert"]
errorCode: 112 # WriteConflict
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
# Note, the server will return the errorLabel in this case.
errorLabelsContain: ["TransientTransactionError"]
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult"]
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: NoSuchTransaction errors contain transient label
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["insert"]
errorCode: 251 # NoSuchTransaction
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
# Note, the server will return the errorLabel in this case.
errorLabelsContain: ["TransientTransactionError"]
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult"]
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: NoSuchTransaction errors on commit contain transient label
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
errorCode: 251 # NoSuchTransaction
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
# Note, the server will return the errorLabel in this case.
errorLabelsContain: ["TransientTransactionError"]
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult"]
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: commitTransaction
database_name: admin
outcome:
collection:
data: []
- description: add TransientTransactionError label to connection errors, but do not add RetryableWriteError label
failPoint:
configureFailPoint: failCommand
mode: { times: 4 }
data:
failCommands: ["insert", "find", "aggregate", "distinct"]
closeConnection: true
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result: &transient_label_only
errorLabelsContain: ["TransientTransactionError"]
# While a connection error would normally be retryable, these are not because
# they occur within a transaction; ensure the driver does not add the
# RetryableWriteError label to these errors.
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult"]
- name: find
object: collection
arguments:
session: session0
result: *transient_label_only
- name: aggregate
object: collection
arguments:
pipeline:
- $project:
_id: 1
session: session0
result: *transient_label_only
- name: distinct
object: collection
arguments:
fieldName: _id
session: session0
result: *transient_label_only
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
find: *collection_name
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
command_name: find
database_name: *database_name
- command_started_event:
command:
aggregate: *collection_name
pipeline:
- $project:
_id: 1
cursor: {}
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
command_name: aggregate
database_name: *database_name
- command_started_event:
command:
distinct: *collection_name
key: _id
lsid: session0
readConcern:
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
command_name: distinct
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: add RetryableWriteError and UnknownTransactionCommitResult labels to connection errors
failPoint:
configureFailPoint: failCommand
mode: { times: 2 }
data:
failCommands: ["commitTransaction"]
closeConnection: true
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["RetryableWriteError", "UnknownTransactionCommitResult"]
errorLabelsOmit: ["TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: add RetryableWriteError and UnknownTransactionCommitResult labels to retryable commit errors
failPoint:
configureFailPoint: failCommand
mode: { times: 2 }
data:
failCommands: ["commitTransaction"]
errorCode: 11602 # InterruptedDueToReplStateChange
errorLabels: ["RetryableWriteError"]
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["RetryableWriteError", "UnknownTransactionCommitResult"]
errorLabelsOmit: ["TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: add RetryableWriteError and UnknownTransactionCommitResult labels to writeConcernError ShutdownInProgress
failPoint:
configureFailPoint: failCommand
mode: { times: 2 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 91
errmsg: Replication is being shut down
errorLabels: ["RetryableWriteError"]
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["RetryableWriteError", "UnknownTransactionCommitResult"]
errorLabelsOmit: ["TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: do not add RetryableWriteError label to writeConcernError ShutdownInProgress that occurs within transaction
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["insert"]
writeConcernError:
code: 91
errmsg: Replication is being shut down
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
errorLabelsContain: []
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult"]
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
command_name: insert
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: add UnknownTransactionCommitResult label to writeConcernError WriteConcernFailed
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 64 # WriteConcernFailed without wtimeout
errmsg: multiple errors reported
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["UnknownTransactionCommitResult"]
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: add UnknownTransactionCommitResult label to writeConcernError WriteConcernFailed with wtimeout
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 64
codeName: WriteConcernFailed
errmsg: waiting for replication timed out
errInfo: {wtimeout: True}
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["UnknownTransactionCommitResult"]
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: omit UnknownTransactionCommitResult label from writeConcernError UnsatisfiableWriteConcern
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 100 # UnsatisfiableWriteConcern
errmsg: Not enough data-bearing nodes
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError", "UnknownTransactionCommitResult"]
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: omit UnknownTransactionCommitResult label from writeConcernError UnknownReplWriteConcern
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 79 # UnknownReplWriteConcern
errmsg: No write concern mode named 'blah' found in replica set configuration
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsOmit: ["RetryableWriteConcern", "TransientTransactionError", "UnknownTransactionCommitResult"]
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: do not add UnknownTransactionCommitResult label to MaxTimeMSExpired inside transactions
skipReason: "GODRIVER-2348: maxTimeMS is deprecated"
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["aggregate"]
errorCode: 50 # MaxTimeMSExpired
operations:
- name: startTransaction
object: session0
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: aggregate
object: collection
arguments:
pipeline:
- $project:
_id: 1
maxTimeMS: 60000
session: session0
result:
errorLabelsOmit: ["RetryableWriteError", "UnknownTransactionCommitResult", "TransientTransactionError"]
- name: abortTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
aggregate: *collection_name
pipeline:
- $project:
_id: 1
cursor: {}
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
autocommit: false
maxTimeMS: 60000
command_name: aggregate
database_name: *database_name
- command_started_event:
command:
abortTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
command_name: abortTransaction
database_name: admin
outcome:
collection:
data: []
- description: add UnknownTransactionCommitResult label to MaxTimeMSExpired
skipReason: "GODRIVER-2348: maxCommitTimeMS is deprecated"
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
errorCode: 50 # MaxTimeMSExpired
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
maxCommitTimeMS: 60000
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["UnknownTransactionCommitResult"]
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
maxTimeMS: 60000
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
maxTimeMS: 60000
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1
- description: add UnknownTransactionCommitResult label to writeConcernError MaxTimeMSExpired
skipReason: "GODRIVER-2348: maxCommitTimeMS is deprecated"
failPoint:
configureFailPoint: failCommand
mode: { times: 1 }
data:
failCommands: ["commitTransaction"]
writeConcernError:
code: 50 # MaxTimeMSExpired
errmsg: operation exceeded time limit
operations:
- name: startTransaction
object: session0
arguments:
options:
writeConcern:
w: majority
maxCommitTimeMS: 60000
- name: insertOne
object: collection
arguments:
session: session0
document:
_id: 1
result:
insertedId: 1
- name: commitTransaction
object: session0
result:
errorLabelsContain: ["UnknownTransactionCommitResult"]
errorLabelsOmit: ["RetryableWriteError", "TransientTransactionError"]
- name: commitTransaction
object: session0
expectations:
- command_started_event:
command:
insert: *collection_name
documents:
- _id: 1
ordered: true
readConcern:
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction: true
autocommit: false
writeConcern:
command_name: insert
database_name: *database_name
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
writeConcern:
w: majority
maxTimeMS: 60000
command_name: commitTransaction
database_name: admin
- command_started_event:
command:
commitTransaction: 1
lsid: session0
txnNumber:
$numberLong: "1"
startTransaction:
autocommit: false
# commitTransaction applies w:majority on retries
writeConcern: { w: majority, wtimeout: 10000 }
maxTimeMS: 60000
command_name: commitTransaction
database_name: admin
outcome:
collection:
data:
- _id: 1