# Test SDAM error handling. runOn: # failCommand appName requirements - minServerVersion: "4.4" # It seems this spec should not run against LB. topology: ["single", "replicaset", "sharded"] database_name: &database_name "sdam-tests" collection_name: &collection_name "hello-timeout" data: [] tests: - description: Network timeout on Monitor handshake # Configure the initial handshake to fail with a timeout. # Use times: 2 so that the RTT hello is blocked as well. failPoint: configureFailPoint: failCommand mode: { times: 2 } data: failCommands: ["hello", "isMaster"] appName: timeoutMonitorHandshakeTest blockConnection: true blockTimeMS: 1000 clientOptions: retryWrites: false connectTimeoutMS: 250 heartbeatFrequencyMS: 500 appname: timeoutMonitorHandshakeTest operations: # The network error on the initial handshake should mark the server # Unknown (emitting a ServerDescriptionChangedEvent) and clear the pool. - name: waitForEvent object: testRunner arguments: event: ServerMarkedUnknownEvent count: 1 # Perform an operation to ensure the node is discovered. - name: insertMany object: collection arguments: documents: - _id: 1 - _id: 2 # We cannot assert the server was marked Unknown and pool was cleared an # exact number of times because the RTT hello may or may not have # triggered this failpoint as well. # - name: assertEventCount # object: testRunner # arguments: # event: ServerMarkedUnknownEvent # count: 1 # - name: assertEventCount # object: testRunner # arguments: # event: PoolClearedEvent # count: 1 expectations: - command_started_event: command: insert: *collection_name documents: - _id: 1 - _id: 2 command_name: insert database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - description: Network timeout on Monitor check clientOptions: retryWrites: false connectTimeoutMS: 750 heartbeatFrequencyMS: 500 appname: timeoutMonitorCheckTest operations: # Perform an operation to ensure the node is discovered. - name: insertMany object: collection arguments: documents: - _id: 1 - _id: 2 # Configure the next streaming hello check to fail with a timeout. # Use "times: 4" to increase the probability that the Monitor check times # out since the RTT hello may trigger this failpoint one or many times as # well. - name: configureFailPoint object: testRunner arguments: failPoint: configureFailPoint: failCommand mode: { times: 4 } data: failCommands: ["hello", "isMaster"] appName: timeoutMonitorCheckTest blockConnection: true # blockTimeMS is evaluated after the waiting for heartbeatFrequencyMS server-side, so this value only # needs to be greater than connectTimeoutMS. The driver will wait for (500+750)ms and the server will # respond after (500+1000)ms. blockTimeMS: 1000 # The network error on the next check should mark the server Unknown and # clear the pool. - name: waitForEvent object: testRunner arguments: event: ServerMarkedUnknownEvent count: 1 - name: waitForEvent object: testRunner arguments: event: PoolClearedEvent count: 1 # Perform an operation to ensure the node is rediscovered. - name: insertMany object: collection arguments: documents: - _id: 3 - _id: 4 # We cannot assert the server was marked Unknown and pool was cleared an # exact number of times because the RTT hello may have triggered this # failpoint one or many times as well. expectations: - command_started_event: command: insert: *collection_name documents: - _id: 1 - _id: 2 command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - _id: 3 - _id: 4 command_name: insert database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - {_id: 3} - {_id: 4} - description: Driver extends timeout while streaming clientOptions: retryWrites: false connectTimeoutMS: 250 heartbeatFrequencyMS: 500 appname: extendsTimeoutTest operations: # Perform an operation to ensure the node is discovered. - name: insertMany object: collection arguments: documents: - _id: 1 - _id: 2 # Wait for multiple monitor checks to complete. - name: wait object: testRunner arguments: ms: 2000 # Perform an operation to ensure the node is still selectable. - name: insertMany object: collection arguments: documents: - _id: 3 - _id: 4 # Assert that the server was never marked Unknown and the pool was never # cleared. - name: assertEventCount object: testRunner arguments: event: ServerMarkedUnknownEvent count: 0 - name: assertEventCount object: testRunner arguments: event: PoolClearedEvent count: 0 expectations: - command_started_event: command: insert: *collection_name documents: - _id: 1 - _id: 2 command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - _id: 3 - _id: 4 command_name: insert database_name: *database_name outcome: collection: data: - {_id: 1} - {_id: 2} - {_id: 3} - {_id: 4}