@@ -49,6 +49,11 @@ const (
4949	namespaceExistsErrCode  int32  =  48 
5050)
5151
52+ type  failPoint  struct  {
53+ 	name    string 
54+ 	client  * mongo.Client 
55+ }
56+ 
5257// T is a wrapper around testing.T. 
5358type  T  struct  {
5459	// connsCheckedOut is the net number of connections checked out during test execution. 
@@ -68,7 +73,8 @@ type T struct {
6873	createdColls       []* Collection  // collections created in this test 
6974	proxyDialer        * proxyDialer 
7075	dbName , collName   string 
71- 	failPointNames     []string 
76+ 	hasFailPoint       bool 
77+ 	failPoints         []failPoint 
7278	minServerVersion   string 
7379	maxServerVersion   string 
7480	validTopologies    []TopologyKind 
@@ -166,7 +172,14 @@ func (t *T) cleanup() {
166172
167173	// always disconnect the client regardless of clientType because Client.Disconnect will work against 
168174	// all deployments 
169- 	_  =  t .Client .Disconnect (context .Background ())
175+ 	if  ! t .hasFailPoint  {
176+ 		_  =  t .Client .Disconnect (context .Background ())
177+ 	}
178+ 	for  _ , fp  :=  range  t .failPoints  {
179+ 		fp .client .Disconnect (context .Background ())
180+ 	}
181+ 	t .hasFailPoint  =  false 
182+ 	t .failPoints  =  t .failPoints [:0 ]
170183}
171184
172185// Run creates a new T instance for a sub-test and runs the given callback. It also creates a new collection using the 
@@ -220,7 +233,7 @@ func (t *T) RunOpts(name string, opts *Options, callback func(mt *T)) {
220233				sub .ClearCollections ()
221234			}
222235			// only disconnect client if it's not being shared 
223- 			if  sub .shareClient  ==  nil  ||  ! * sub .shareClient  {
236+ 			if  ( sub .shareClient  ==  nil  ||  ! * sub .shareClient )  &&   ! sub . hasFailPoint  {
224237				_  =  sub .Client .Disconnect (context .Background ())
225238			}
226239			assert .Equal (sub , 0 , sessions , "%v sessions checked out" , sessions )
@@ -364,7 +377,10 @@ func (t *T) ResetClient(opts *options.ClientOptions) {
364377		t .clientOpts  =  opts 
365378	}
366379
367- 	_  =  t .Client .Disconnect (context .Background ())
380+ 	if  ! t .hasFailPoint  {
381+ 		_  =  t .Client .Disconnect (context .Background ())
382+ 	}
383+ 	t .hasFailPoint  =  false 
368384	t .createTestClient ()
369385	t .DB  =  t .Client .Database (t .dbName )
370386	t .Coll  =  t .DB .Collection (t .collName , t .collOpts )
@@ -523,7 +539,8 @@ func (t *T) SetFailPoint(fp failpoint.FailPoint) {
523539	if  err  :=  SetFailPoint (fp , t .Client ); err  !=  nil  {
524540		t .Fatal (err )
525541	}
526- 	t .failPointNames  =  append (t .failPointNames , fp .ConfigureFailPoint )
542+ 	t .hasFailPoint  =  true 
543+ 	t .failPoints  =  append (t .failPoints , failPoint {name : fp .ConfigureFailPoint , client : t .Client })
527544}
528545
529546// SetFailPointFromDocument sets the fail point represented by the given document for the client associated with T. This 
@@ -536,29 +553,32 @@ func (t *T) SetFailPointFromDocument(fp bson.Raw) {
536553	}
537554
538555	name  :=  fp .Index (0 ).Value ().StringValue ()
539- 	t .failPointNames  =  append (t .failPointNames , name )
556+ 	t .hasFailPoint  =  true 
557+ 	t .failPoints  =  append (t .failPoints , failPoint {name : name , client : t .Client })
540558}
541559
542560// TrackFailPoint adds the given fail point to the list of fail points to be disabled when the current test finishes. 
543561// This function does not create a fail point on the server. 
544562func  (t  * T ) TrackFailPoint (fpName  string ) {
545- 	t .failPointNames  =  append (t .failPointNames , fpName )
563+ 	t .hasFailPoint  =  true 
564+ 	t .failPoints  =  append (t .failPoints , failPoint {name : fpName , client : t .Client })
546565}
547566
548567// ClearFailPoints disables all previously set failpoints for this test. 
549568func  (t  * T ) ClearFailPoints () {
550- 	db  :=  t .Client .Database ("admin" )
551- 	for  _ , fp  :=  range  t .failPointNames  {
569+ 	for  _ , fp  :=  range  t .failPoints  {
552570		cmd  :=  failpoint.FailPoint {
553- 			ConfigureFailPoint : fp ,
571+ 			ConfigureFailPoint : fp . name ,
554572			Mode :               failpoint .ModeOff ,
555573		}
556- 		err  :=  db .RunCommand (context .Background (), cmd ).Err ()
574+ 		err  :=  fp . client . Database ( "admin" ) .RunCommand (context .Background (), cmd ).Err ()
557575		if  err  !=  nil  {
558- 			t .Fatalf ("error clearing fail point %s: %v" , fp , err )
576+ 			t .Fatalf ("error clearing fail point %s: %v" , fp . name , err )
559577		}
578+ 		_  =  fp .client .Disconnect (context .Background ())
560579	}
561- 	t .failPointNames  =  t .failPointNames [:0 ]
580+ 	t .hasFailPoint  =  false 
581+ 	t .failPoints  =  t .failPoints [:0 ]
562582}
563583
564584// CloneDatabase modifies the default database for this test to match the given options. 
0 commit comments