runOn: - minServerVersion: "4.0" topology: ["replicaset"] - minServerVersion: "4.1.8" topology: ["sharded"] database_name: &database_name "session-tests" collection_name: &collection_name "test" data: - {_id: 1} tests: - description: Clean explicit session is not discarded operations: - name: assertSessionNotDirty object: testRunner arguments: session: session0 - &insert_with_explicit_session name: insertOne object: collection arguments: session: session0 document: {_id: 2} result: insertedId: 2 - name: assertSessionNotDirty object: testRunner arguments: session: session0 - name: endSession object: session0 - &find_with_implicit_session name: find object: collection arguments: filter: {_id: -1} result: [] - name: assertSameLsidOnLastTwoCommands object: testRunner expectations: - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true lsid: session0 command_name: insert database_name: *database_name - command_started_event: command: find: *collection_name filter: {_id: -1} lsid: session0 command_name: find database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - description: Clean implicit session is not discarded operations: - &insert_with_implicit_session name: insertOne object: collection arguments: document: {_id: 2} result: insertedId: 2 - *find_with_implicit_session - name: assertSameLsidOnLastTwoCommands object: testRunner expectations: - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true command_name: insert database_name: *database_name - command_started_event: command: find: *collection_name filter: {_id: -1} command_name: find database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - description: Dirty explicit session is discarded clientOptions: retryWrites: true failPoint: configureFailPoint: failCommand mode: { times: 1 } data: failCommands: ["insert"] closeConnection: true operations: - name: assertSessionNotDirty object: testRunner arguments: session: session0 - *insert_with_explicit_session - name: assertSessionDirty object: testRunner arguments: session: session0 - name: insertOne object: collection arguments: session: session0 document: {_id: 3} result: insertedId: 3 - name: assertSessionDirty object: testRunner arguments: session: session0 - name: endSession object: session0 - *find_with_implicit_session - name: assertDifferentLsidOnLastTwoCommands object: testRunner expectations: - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true lsid: session0 txnNumber: $numberLong: "1" command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true lsid: session0 txnNumber: $numberLong: "1" command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - {_id: 3} ordered: true lsid: session0 txnNumber: $numberLong: "2" command_name: insert database_name: *database_name - command_started_event: command: find: *collection_name filter: {_id: -1} command_name: find database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - {_id: 3} - description: Dirty implicit session is discarded (write) clientOptions: retryWrites: true failPoint: configureFailPoint: failCommand mode: { times: 1 } data: failCommands: ["insert"] closeConnection: true operations: - *insert_with_implicit_session - *find_with_implicit_session - name: assertDifferentLsidOnLastTwoCommands object: testRunner expectations: - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true txnNumber: $numberLong: "1" command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - {_id: 2} ordered: true txnNumber: $numberLong: "1" command_name: insert database_name: *database_name - command_started_event: command: find: *collection_name filter: {_id: -1} command_name: find database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - description: Dirty implicit session is discarded (read) # Enable the failpoint with times:2 so that this test can pass with or # without retryable reads. failPoint: configureFailPoint: failCommand mode: { times: 2 } data: failCommands: ["aggregate"] closeConnection: true operations: - name: aggregate object: collection arguments: pipeline: - $project: _id: 1 error: true - *find_with_implicit_session - name: assertDifferentLsidOnLastTwoCommands object: testRunner # Don't include expectations because a driver may or may not retry the # aggregate depending on if they have implemented the retryable reads spec. outcome: collection: data: - {_id: 1}