252 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| description: "timeoutMS behaves correctly during command execution"
 | |
| 
 | |
| schemaVersion: "1.9"
 | |
| 
 | |
| runOnRequirements:
 | |
|   # The appName filter cannot be used to set a fail point on connection handshakes until server version 4.9 due to
 | |
|   # SERVER-49220/SERVER-49336.
 | |
|   - minServerVersion: "4.9"
 | |
|     # Skip load-balanced and serverless which do not support RTT measurements.
 | |
|     topologies: [ single, replicaset, sharded ]
 | |
|     serverless: forbid
 | |
| 
 | |
| createEntities:
 | |
|   - client:
 | |
|       id: &failPointClient failPointClient
 | |
|       useMultipleMongoses: false
 | |
| 
 | |
| initialData:
 | |
|   # The corresponding entities for the collections defined here are created in test-level createEntities operations.
 | |
|   # This is done so that tests can set fail points that will affect all of the handshakes and heartbeats done by a
 | |
|   # client. The collection and database names are listed here so that the collections will be dropped and re-created at
 | |
|   # the beginning of each test.
 | |
|   - collectionName: ®ularCollectionName coll
 | |
|     databaseName: &databaseName test
 | |
|     documents: []
 | |
|   - collectionName: &timeoutCollectionName timeoutColl
 | |
|     databaseName: &databaseName test
 | |
|     documents: []
 | |
| 
 | |
| tests:
 | |
|   - description: "maxTimeMS value in the command is less than timeoutMS"
 | |
|     operations:
 | |
|       # Artificially increase the server RTT to ~50ms.
 | |
|       - name: failPoint
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           client: *failPointClient
 | |
|           failPoint:
 | |
|             configureFailPoint: failCommand
 | |
|             mode: "alwaysOn"
 | |
|             data:
 | |
|               failCommands: ["hello", "isMaster"]
 | |
|               appName: &appName reduceMaxTimeMSTest
 | |
|               blockConnection: true
 | |
|               blockTimeMS: 50
 | |
|       # Create a client with the app name specified in the fail point and timeoutMS higher than blockTimeMS.
 | |
|       # Also create database and collection entities derived from the new client.
 | |
|       - name: createEntities
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           entities:
 | |
|             - client:
 | |
|                 id: &client client
 | |
|                 useMultipleMongoses: false
 | |
|                 uriOptions:
 | |
|                   appName: *appName
 | |
|                   w: 1  # Override server's w:majority default to speed up the test.
 | |
|                   timeoutMS: 500
 | |
|                   heartbeatFrequencyMS: 500
 | |
|                 observeEvents:
 | |
|                   - commandStartedEvent
 | |
|             - database:
 | |
|                 id: &database database
 | |
|                 client: *client
 | |
|                 databaseName: *databaseName
 | |
|             - collection:
 | |
|                 id: &timeoutCollection timeoutCollection
 | |
|                 database: *database
 | |
|                 collectionName: *timeoutCollectionName
 | |
|       # Do an operation with a large timeout to ensure the servers are discovered.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 1 }
 | |
|           timeoutMS: 100000
 | |
|       # Wait until short-circuiting has been enabled (at least 2 RTT measurements).
 | |
|       - name: wait
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           ms: 1000
 | |
|       # Do an operation with timeoutCollection so the event will include a maxTimeMS field.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 2 }
 | |
|     expectEvents:
 | |
|       - client: *client
 | |
|         events:
 | |
|           - commandStartedEvent:
 | |
|               commandName: insert
 | |
|               databaseName: *databaseName
 | |
|               command:
 | |
|                 insert: *timeoutCollectionName
 | |
|           - commandStartedEvent:
 | |
|               commandName: insert
 | |
|               databaseName: *databaseName
 | |
|               command:
 | |
|                 insert: *timeoutCollectionName
 | |
|                 # GODRIVER-3106: Add a 1 millisecond buffer on the expected 450ms.
 | |
|                 maxTimeMS: { $$lte: 451 }
 | |
| 
 | |
|   - description: "command is not sent if RTT is greater than timeoutMS"
 | |
|     operations:
 | |
|       # Artificially increase the server RTT to ~50ms.
 | |
|       - name: failPoint
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           client: *failPointClient
 | |
|           failPoint:
 | |
|             configureFailPoint: failCommand
 | |
|             mode: "alwaysOn"
 | |
|             data:
 | |
|               failCommands: ["hello", "isMaster"]
 | |
|               appName: &appName rttTooHighTest
 | |
|               blockConnection: true
 | |
|               blockTimeMS: 50
 | |
|       # Create a client with the app name specified in the fail point. Also create database and collection entities
 | |
|       # derived from the new client. There is one collection entity with no timeoutMS and another with a timeoutMS
 | |
|       # that's lower than the fail point's blockTimeMS value.
 | |
|       - name: createEntities
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           entities:
 | |
|             - client:
 | |
|                 id: &client client
 | |
|                 useMultipleMongoses: false
 | |
|                 uriOptions:
 | |
|                   appName: *appName
 | |
|                   w: 1  # Override server's w:majority default to speed up the test.
 | |
|                   timeoutMS: 10
 | |
|                   heartbeatFrequencyMS: 500
 | |
|                 observeEvents:
 | |
|                   - commandStartedEvent
 | |
|             - database:
 | |
|                 id: &database database
 | |
|                 client: *client
 | |
|                 databaseName: *databaseName
 | |
|             - collection:
 | |
|                 id: &timeoutCollection timeoutCollection
 | |
|                 database: *database
 | |
|                 collectionName: *timeoutCollectionName
 | |
|       # Do an operation with a large timeout to ensure the servers are discovered.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 1 }
 | |
|           timeoutMS: 100000
 | |
|       # Wait until short-circuiting has been enabled (at least 2 RTT measurements).
 | |
|       - name: wait
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           ms: 1000
 | |
|       # Do an operation with timeoutCollection which will error.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 2 }
 | |
|         expectError:
 | |
|           isTimeoutError: true
 | |
|       # Do an operation with timeoutCollection which will error.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 3 }
 | |
|         expectError:
 | |
|           isTimeoutError: true
 | |
|       # Do an operation with timeoutCollection which will error.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 4 }
 | |
|         expectError:
 | |
|           isTimeoutError: true
 | |
|     expectEvents:
 | |
|       # There should only be one event, which corresponds to the first
 | |
|       # insertOne call. For the subsequent insertOne calls, drivers should
 | |
|       # fail client-side.
 | |
|       - client: *client
 | |
|         events:
 | |
|           - commandStartedEvent:
 | |
|               commandName: insert
 | |
|               databaseName: *databaseName
 | |
|               command:
 | |
|                 insert: *timeoutCollectionName
 | |
| 
 | |
|   - description: "short-circuit is not enabled with only 1 RTT measurement"
 | |
|     operations:
 | |
|       # Artificially increase the server RTT to ~300ms.
 | |
|       - name: failPoint
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           client: *failPointClient
 | |
|           failPoint:
 | |
|             configureFailPoint: failCommand
 | |
|             mode: "alwaysOn"
 | |
|             data:
 | |
|               failCommands: ["hello", "isMaster"]
 | |
|               appName: &appName reduceMaxTimeMSTest
 | |
|               blockConnection: true
 | |
|               blockTimeMS: 100
 | |
|       # Create a client with the app name specified in the fail point and timeoutMS lower than blockTimeMS.
 | |
|       # Also create database and collection entities derived from the new client.
 | |
|       - name: createEntities
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           entities:
 | |
|             - client:
 | |
|                 id: &client client
 | |
|                 useMultipleMongoses: false
 | |
|                 uriOptions:
 | |
|                   appName: *appName
 | |
|                   w: 1  # Override server's w:majority default to speed up the test.
 | |
|                   timeoutMS: 90
 | |
|                   heartbeatFrequencyMS: 100000  # Override heartbeatFrequencyMS to ensure only 1 RTT is recorded.
 | |
|                 observeEvents:
 | |
|                   - commandStartedEvent
 | |
|             - database:
 | |
|                 id: &database database
 | |
|                 client: *client
 | |
|                 databaseName: *databaseName
 | |
|             - collection:
 | |
|                 id: &timeoutCollection timeoutCollection
 | |
|                 database: *database
 | |
|                 collectionName: *timeoutCollectionName
 | |
|       # Do an operation with a large timeout to ensure the servers are discovered.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 1 }
 | |
|           timeoutMS: 100000
 | |
|       # Do an operation with timeoutCollection which will succeed. If this
 | |
|       # fails it indicates the driver mistakenly used the min RTT even though
 | |
|       # there has only been one sample.
 | |
|       - name: insertOne
 | |
|         object: *timeoutCollection
 | |
|         arguments:
 | |
|           document: { _id: 2 }
 | |
|     expectEvents:
 | |
|       - client: *client
 | |
|         events:
 | |
|           - commandStartedEvent:
 | |
|               commandName: insert
 | |
|               databaseName: *databaseName
 | |
|               command:
 | |
|                 insert: *timeoutCollectionName
 | |
|           - commandStartedEvent:
 | |
|               commandName: insert
 | |
|               databaseName: *databaseName
 | |
|               command:
 | |
|                 insert: *timeoutCollectionName
 | |
|                 maxTimeMS: { $$lte: 450 }
 |