351 lines
11 KiB
YAML
351 lines
11 KiB
YAML
runOn:
|
|
-
|
|
minServerVersion: "4.1.8"
|
|
topology: ["sharded"]
|
|
# serverless proxy doesn't use recovery tokens
|
|
serverless: "forbid"
|
|
|
|
database_name: &database_name "transaction-tests"
|
|
collection_name: &collection_name "test"
|
|
|
|
data: []
|
|
|
|
tests:
|
|
- description: commitTransaction explicit retries include recoveryToken
|
|
useMultipleMongoses: true
|
|
operations:
|
|
- name: startTransaction
|
|
object: session0
|
|
- name: insertOne
|
|
object: collection
|
|
arguments:
|
|
session: session0
|
|
document:
|
|
_id: 1
|
|
result:
|
|
insertedId: 1
|
|
- name: commitTransaction
|
|
object: session0
|
|
- name: commitTransaction
|
|
object: session0
|
|
- 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:
|
|
recoveryToken: 42
|
|
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 }
|
|
recoveryToken: 42
|
|
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 }
|
|
recoveryToken: 42
|
|
command_name: commitTransaction
|
|
database_name: admin
|
|
|
|
outcome:
|
|
collection:
|
|
data:
|
|
- _id: 1
|
|
|
|
- description: commitTransaction retry succeeds on new mongos
|
|
useMultipleMongoses: true
|
|
operations:
|
|
- name: startTransaction
|
|
object: session0
|
|
arguments:
|
|
options:
|
|
writeConcern:
|
|
w: majority
|
|
- name: insertOne
|
|
object: collection
|
|
arguments:
|
|
session: session0
|
|
document:
|
|
_id: 1
|
|
result:
|
|
insertedId: 1
|
|
# Enable the fail point only on the Mongos that session0 is pinned to.
|
|
- name: targetedFailPoint
|
|
object: testRunner
|
|
arguments:
|
|
session: session0
|
|
failPoint:
|
|
configureFailPoint: failCommand
|
|
mode: { times: 1 }
|
|
data:
|
|
failCommands: ["commitTransaction"]
|
|
writeConcernError:
|
|
code: 91
|
|
errmsg: Replication is being shut down
|
|
errorLabels: ["RetryableWriteError"]
|
|
# The client sees a retryable writeConcernError on the first
|
|
# commitTransaction due to the fail point but it actually succeeds on the
|
|
# server (SERVER-39346). The retry will succeed both on a new mongos and
|
|
# on the original.
|
|
- 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
|
|
recoveryToken: 42
|
|
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 }
|
|
recoveryToken: 42
|
|
command_name: commitTransaction
|
|
database_name: admin
|
|
|
|
outcome:
|
|
collection:
|
|
data:
|
|
- _id: 1
|
|
|
|
- description: commitTransaction retry fails on new mongos
|
|
useMultipleMongoses: true
|
|
clientOptions:
|
|
# Increase heartbeatFrequencyMS to avoid the race condition where an in
|
|
# flight heartbeat refreshes the first mongoes' SDAM state in between
|
|
# the initial commitTransaction and the retry attempt.
|
|
heartbeatFrequencyMS: 30000
|
|
operations:
|
|
- name: startTransaction
|
|
object: session0
|
|
- name: insertOne
|
|
object: collection
|
|
arguments:
|
|
session: session0
|
|
document:
|
|
_id: 1
|
|
result:
|
|
insertedId: 1
|
|
# Enable the fail point only on the Mongos that session0 is pinned to.
|
|
# Fail hello/legacy hello to prevent the heartbeat requested directly after the
|
|
# retryable commit error from racing with server selection for the retry.
|
|
# Note: times: 7 is slightly artbitrary but it accounts for one failed
|
|
# commit and some SDAM heartbeats. A test runner will have multiple
|
|
# clients connected to this server so this fail point configuration
|
|
# is also racy.
|
|
- name: targetedFailPoint
|
|
object: testRunner
|
|
arguments:
|
|
session: session0
|
|
failPoint:
|
|
configureFailPoint: failCommand
|
|
mode: { times: 7 }
|
|
data:
|
|
failCommands: ["commitTransaction", "isMaster", "hello"]
|
|
closeConnection: true
|
|
# The first commitTransaction sees a retryable connection error due to
|
|
# the fail point and also fails on the server. The retry attempt on a
|
|
# new mongos will wait for the transaction to timeout and will fail
|
|
# because the transaction was aborted. Note that the retry attempt should
|
|
# not select the original mongos because that server's SDAM state is
|
|
# reset by the connection error, heartbeatFrequencyMS is high, and
|
|
# subsequent heartbeats should fail.
|
|
- name: commitTransaction
|
|
object: session0
|
|
result:
|
|
errorLabelsContain: ["TransientTransactionError"]
|
|
errorLabelsOmit: ["UnknownTransactionCommitResult"]
|
|
errorCodeName: NoSuchTransaction
|
|
|
|
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:
|
|
recoveryToken: 42
|
|
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 }
|
|
recoveryToken: 42
|
|
command_name: commitTransaction
|
|
database_name: admin
|
|
|
|
outcome:
|
|
collection:
|
|
data: []
|
|
|
|
- description: abortTransaction sends recoveryToken
|
|
useMultipleMongoses: true
|
|
operations:
|
|
- name: startTransaction
|
|
object: session0
|
|
- name: insertOne
|
|
object: collection
|
|
arguments:
|
|
session: session0
|
|
document:
|
|
_id: 1
|
|
result:
|
|
insertedId: 1
|
|
# Enable the fail point only on the Mongos that session0 is pinned to.
|
|
- name: targetedFailPoint
|
|
object: testRunner
|
|
arguments:
|
|
session: session0
|
|
failPoint:
|
|
configureFailPoint: failCommand
|
|
mode: { times: 1 }
|
|
data:
|
|
failCommands: ["abortTransaction"]
|
|
closeConnection: true
|
|
# The first abortTransaction sees a retryable connection error due to
|
|
# the fail point. The retry attempt on a new mongos will send the
|
|
# recoveryToken. Note that the retry attempt will also fail because the
|
|
# server does not yet support aborting from a new mongos, however this
|
|
# operation should "succeed" since abortTransaction ignores errors.
|
|
- 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:
|
|
recoveryToken: 42
|
|
command_name: abortTransaction
|
|
database_name: admin
|
|
- command_started_event:
|
|
command:
|
|
abortTransaction: 1
|
|
lsid: session0
|
|
txnNumber:
|
|
$numberLong: "1"
|
|
startTransaction:
|
|
autocommit: false
|
|
writeConcern:
|
|
recoveryToken: 42
|
|
command_name: abortTransaction
|
|
database_name: admin
|
|
|
|
outcome:
|
|
collection:
|
|
data: []
|