216 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
runOn:
 | 
						|
    -
 | 
						|
        minServerVersion: "4.0"
 | 
						|
        topology: ["replicaset"]
 | 
						|
    -
 | 
						|
        minServerVersion: "4.1.8"
 | 
						|
        topology: ["sharded"]
 | 
						|
 | 
						|
database_name: &database_name "withTransaction-tests"
 | 
						|
collection_name: &collection_name "test"
 | 
						|
 | 
						|
data: []
 | 
						|
 | 
						|
tests:
 | 
						|
  -
 | 
						|
    description: callback succeeds after multiple connection errors
 | 
						|
    failPoint:
 | 
						|
      configureFailPoint: failCommand
 | 
						|
      mode: { times: 2 }
 | 
						|
      data:
 | 
						|
          failCommands: ["insert"]
 | 
						|
          closeConnection: true
 | 
						|
    operations:
 | 
						|
      -
 | 
						|
        name: withTransaction
 | 
						|
        object: session0
 | 
						|
        arguments:
 | 
						|
          callback:
 | 
						|
            operations:
 | 
						|
              -
 | 
						|
                # We do not assert the result here, as insertOne will fail for
 | 
						|
                # the first two executions of the callback before ultimately
 | 
						|
                # succeeding and returning a result. Asserting the state of the
 | 
						|
                # output collection after the test is sufficient.
 | 
						|
                name: insertOne
 | 
						|
                object: collection
 | 
						|
                arguments:
 | 
						|
                  session: session0
 | 
						|
                  document: { _id: 1 }
 | 
						|
    expectations:
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            insert: *collection_name
 | 
						|
            documents:
 | 
						|
              - { _id: 1 }
 | 
						|
            ordered: true
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "1" }
 | 
						|
            startTransaction: true
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: insert
 | 
						|
          database_name: *database_name
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            abortTransaction: 1
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "1" }
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            startTransaction: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: abortTransaction
 | 
						|
          database_name: admin
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            insert: *collection_name
 | 
						|
            documents:
 | 
						|
              - { _id: 1 }
 | 
						|
            ordered: true
 | 
						|
            lsid: session0
 | 
						|
            # second transaction will be causally consistent with the first
 | 
						|
            readConcern: { afterClusterTime: 42 }
 | 
						|
            # txnNumber is incremented when retrying the transaction
 | 
						|
            txnNumber: { $numberLong: "2" }
 | 
						|
            startTransaction: true
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: insert
 | 
						|
          database_name: *database_name
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            abortTransaction: 1
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "2" }
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            startTransaction: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: abortTransaction
 | 
						|
          database_name: admin
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            insert: *collection_name
 | 
						|
            documents:
 | 
						|
              - { _id: 1 }
 | 
						|
            ordered: true
 | 
						|
            lsid: session0
 | 
						|
            # third transaction will be causally consistent with the second
 | 
						|
            readConcern: { afterClusterTime: 42 }
 | 
						|
            # txnNumber is incremented when retrying the transaction
 | 
						|
            txnNumber: { $numberLong: "3" }
 | 
						|
            startTransaction: true
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: insert
 | 
						|
          database_name: *database_name
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            commitTransaction: 1
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "3" }
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            startTransaction: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: commitTransaction
 | 
						|
          database_name: admin
 | 
						|
    outcome:
 | 
						|
      collection:
 | 
						|
        data:
 | 
						|
          - { _id: 1 }
 | 
						|
  -
 | 
						|
    description: callback is not retried after non-transient error (DuplicateKeyError)
 | 
						|
    useMultipleMongoses: true
 | 
						|
    operations:
 | 
						|
      -
 | 
						|
        name: withTransaction
 | 
						|
        object: session0
 | 
						|
        arguments:
 | 
						|
          callback:
 | 
						|
            operations:
 | 
						|
              -
 | 
						|
                name: insertOne
 | 
						|
                object: collection
 | 
						|
                arguments:
 | 
						|
                  session: session0
 | 
						|
                  document: { _id: 1 }
 | 
						|
                result:
 | 
						|
                  insertedId: 1
 | 
						|
              -
 | 
						|
                name: insertOne
 | 
						|
                object: collection
 | 
						|
                arguments:
 | 
						|
                  session: session0
 | 
						|
                  document: { _id: 1 }
 | 
						|
                result:
 | 
						|
                  errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"]
 | 
						|
        result:
 | 
						|
          errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"]
 | 
						|
          # DuplicateKey error code included in the bulk write error message
 | 
						|
          # returned by the server
 | 
						|
          errorContains: E11000
 | 
						|
    expectations:
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            insert: *collection_name
 | 
						|
            documents:
 | 
						|
              - { _id: 1 }
 | 
						|
            ordered: true
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "1" }
 | 
						|
            startTransaction: true
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: insert
 | 
						|
          database_name: *database_name
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            insert: *collection_name
 | 
						|
            documents:
 | 
						|
              - { _id: 1 }
 | 
						|
            ordered: true
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "1" }
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            startTransaction: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: insert
 | 
						|
          database_name: *database_name
 | 
						|
      -
 | 
						|
        command_started_event:
 | 
						|
          command:
 | 
						|
            abortTransaction: 1
 | 
						|
            lsid: session0
 | 
						|
            txnNumber: { $numberLong: "1" }
 | 
						|
            autocommit: false
 | 
						|
            # omitted fields
 | 
						|
            readConcern: ~
 | 
						|
            startTransaction: ~
 | 
						|
            writeConcern: ~
 | 
						|
          command_name: abortTransaction
 | 
						|
          database_name: admin
 | 
						|
    outcome:
 | 
						|
      collection:
 | 
						|
        data: []
 |