2025-03-17 20:58:26 +01:00

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