144 lines
4.2 KiB
YAML
144 lines
4.2 KiB
YAML
---
|
|
description: cancel-server-check
|
|
|
|
schemaVersion: "1.4"
|
|
|
|
runOnRequirements:
|
|
# General failCommand requirements (this file does not use appName
|
|
# with failCommand).
|
|
- minServerVersion: "4.0"
|
|
topologies:
|
|
- replicaset
|
|
serverless: forbid
|
|
- minServerVersion: "4.2"
|
|
topologies:
|
|
- sharded
|
|
serverless: forbid
|
|
|
|
createEntities:
|
|
- client:
|
|
id: &setupClient setupClient
|
|
useMultipleMongoses: false
|
|
|
|
initialData: &initialData
|
|
- collectionName: &collectionName cancel-server-check
|
|
databaseName: &databaseName sdam-tests
|
|
documents: []
|
|
|
|
tests:
|
|
- description: Cancel server check
|
|
operations:
|
|
- name: createEntities
|
|
object: testRunner
|
|
arguments:
|
|
entities:
|
|
- client:
|
|
id: &client client
|
|
useMultipleMongoses: false
|
|
observeEvents:
|
|
- serverDescriptionChangedEvent
|
|
- poolClearedEvent
|
|
uriOptions:
|
|
retryWrites: true
|
|
heartbeatFrequencyMS: 10000
|
|
# Server selection timeout MUST be less than heartbeatFrequencyMS for
|
|
# this test. This setting ensures that the retried insert will fail
|
|
# after 5 seconds if the driver does not properly cancel the in progress
|
|
# check.
|
|
serverSelectionTimeoutMS: 5000
|
|
appname: cancelServerCheckTest
|
|
- database:
|
|
id: &database database
|
|
client: *client
|
|
databaseName: *databaseName
|
|
- collection:
|
|
id: &collection collection
|
|
database: *database
|
|
collectionName: *collectionName
|
|
# Perform an operation to ensure the node is discovered.
|
|
- name: insertOne
|
|
object: *collection
|
|
arguments:
|
|
document:
|
|
_id: 1
|
|
# Configure the next inserts to fail with a non-timeout network error.
|
|
# This should:
|
|
# 1) Mark the server Unknown
|
|
# 2) Clear the connection pool
|
|
# 3) Cancel the in progress hello or legacy hello check and close the Monitor
|
|
# connection
|
|
# 4) The write will be then we retried, server selection will request an
|
|
# immediate check, and block for ~500ms until the next Monitor check
|
|
# proceeds.
|
|
# 5) The write will succeed on the second attempt.
|
|
- name: failPoint
|
|
object: testRunner
|
|
arguments:
|
|
failPoint:
|
|
configureFailPoint: failCommand
|
|
mode:
|
|
times: 1
|
|
data:
|
|
failCommands:
|
|
- insert
|
|
closeConnection: true
|
|
client: *setupClient
|
|
- name: insertOne
|
|
object: *collection
|
|
arguments:
|
|
document:
|
|
_id: 2
|
|
expectResult:
|
|
insertedId: 2
|
|
# The first error should mark the server Unknown and then clear the pool.
|
|
- name: waitForEvent
|
|
object: testRunner
|
|
arguments:
|
|
client: *client
|
|
event:
|
|
serverDescriptionChangedEvent:
|
|
newDescription:
|
|
type: Unknown
|
|
count: 1
|
|
- name: waitForEvent
|
|
object: testRunner
|
|
arguments:
|
|
client: *client
|
|
event:
|
|
poolClearedEvent: {}
|
|
count: 1
|
|
# Perform another operation to ensure the node still selectable.
|
|
- name: insertOne
|
|
object: *collection
|
|
arguments:
|
|
document:
|
|
_id: 3
|
|
expectResult:
|
|
insertedId: 3
|
|
# Assert the server was marked Unknown and pool was cleared exactly once.
|
|
- name: assertEventCount
|
|
object: testRunner
|
|
arguments:
|
|
client: *client
|
|
event:
|
|
serverDescriptionChangedEvent:
|
|
newDescription:
|
|
type: Unknown
|
|
count: 1
|
|
- name: assertEventCount
|
|
object: testRunner
|
|
arguments:
|
|
client: *client
|
|
event:
|
|
poolClearedEvent: {}
|
|
count: 1
|
|
|
|
# Order of operations is non-deterministic so we cannot check events.
|
|
outcome:
|
|
- collectionName: *collectionName
|
|
databaseName: *databaseName
|
|
documents:
|
|
- _id: 1
|
|
- _id: 2
|
|
- _id: 3
|