240 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| ---
 | |
| description: pool-cleared-error
 | |
| 
 | |
| schemaVersion: "1.4"
 | |
| 
 | |
| runOnRequirements:
 | |
|     # This test requires retryable writes, failCommand appName, and
 | |
|     # failCommand blockConnection with closeConnection:true (SERVER-53512).
 | |
|   - minServerVersion: "4.9"
 | |
|     serverless: forbid
 | |
|     topologies:
 | |
|       - replicaset
 | |
|       - sharded
 | |
| 
 | |
| createEntities:
 | |
|   - client:
 | |
|       id: &setupClient setupClient
 | |
|       useMultipleMongoses: false
 | |
| 
 | |
| initialData: &initialData
 | |
|   - collectionName: &collectionName pool-cleared-error
 | |
|     databaseName: &databaseName sdam-tests
 | |
|     documents: []
 | |
| 
 | |
| tests:
 | |
|   - description: PoolClearedError does not mark server unknown
 | |
|     operations:
 | |
|       - name: createEntities
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           entities:
 | |
|             - client:
 | |
|                 id: &client client
 | |
|                 useMultipleMongoses: false
 | |
|                 observeEvents:
 | |
|                   - serverDescriptionChangedEvent
 | |
|                   - poolClearedEvent
 | |
|                 uriOptions:
 | |
|                   retryWrites: true
 | |
|                   maxPoolSize: 1
 | |
|                   appname: poolClearedErrorTest
 | |
|             - 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 insert to fail with a network error which will
 | |
|       # clear the pool leaving it paused until the server is rediscovered.
 | |
|       - name: failPoint
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           failPoint:
 | |
|             configureFailPoint: failCommand
 | |
|             mode:
 | |
|               times: 1
 | |
|             data:
 | |
|               failCommands:
 | |
|                 - insert
 | |
|               blockConnection: true
 | |
|               blockTimeMS: 100
 | |
|               closeConnection: true
 | |
|               appName: poolClearedErrorTest
 | |
|           client: *setupClient
 | |
|       # Start threads.
 | |
|       - name: createEntities
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           entities:
 | |
|             - thread:
 | |
|                 id: &thread0 thread0
 | |
|             - thread:
 | |
|                 id: &thread1 thread1
 | |
|             - thread:
 | |
|                 id: &thread2 thread2
 | |
|             - thread:
 | |
|                 id: &thread3 thread3
 | |
|             - thread:
 | |
|                 id: &thread4 thread4
 | |
|             - thread:
 | |
|                 id: &thread5 thread5
 | |
|       # Perform concurrent insert operations. The first one to execute will
 | |
|       # fail with a network error, mark the server Unknown, clear the pool,
 | |
|       # and retry.
 | |
|       # The other operations will either:
 | |
|       # - Notice the pool is paused, fail with a PoolClearedError, and retry.
 | |
|       # - Or block waiting in server selection until the server is
 | |
|       #   rediscovered.
 | |
|       #
 | |
|       # Note that this test does not guarantee that a PoolClearedError will be
 | |
|       # raised but it is likely since the initial insert is delayed.
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread0
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 2
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread1
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 3
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread2
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 4
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread3
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 5
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread4
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 6
 | |
|       - name: runOnThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread5
 | |
|           operation:
 | |
|             name: insertOne
 | |
|             object: *collection
 | |
|             arguments:
 | |
|               document:
 | |
|                 _id: 7
 | |
|       # Stop threads.
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread0
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread1
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread2
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread3
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread4
 | |
|       - name: waitForThread
 | |
|         object: testRunner
 | |
|         arguments:
 | |
|           thread: *thread5
 | |
|       # The first shutdown 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 an operation to ensure the node still usable.
 | |
|       - name: insertOne
 | |
|         object: *collection
 | |
|         arguments:
 | |
|           document:
 | |
|             _id: 8
 | |
|       # 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
 | |
|           - _id: 4
 | |
|           - _id: 5
 | |
|           - _id: 6
 | |
|           - _id: 7
 | |
|           - _id: 8
 |