@@ -356,66 +356,70 @@ func getWriteConcernErrorForProcessing(err error) (*driver.WriteConcernError, bo
356
356
}
357
357
358
358
// ProcessError handles SDAM error handling and implements driver.ErrorProcessor.
359
- func (s * Server ) ProcessError (err error , conn driver.Connection ) {
359
+ func (s * Server ) ProcessError (err error , conn driver.Connection ) driver. ProcessErrorResult {
360
360
// ignore nil error
361
361
if err == nil {
362
- return
362
+ return driver . NoChange
363
363
}
364
364
365
365
s .processErrorLock .Lock ()
366
366
defer s .processErrorLock .Unlock ()
367
367
368
368
// ignore stale error
369
369
if conn .Stale () {
370
- return
370
+ return driver . NoChange
371
371
}
372
372
// Invalidate server description if not master or node recovering error occurs.
373
373
// These errors can be reported as a command error or a write concern error.
374
374
desc := conn .Description ()
375
375
if cerr , ok := err .(driver.Error ); ok && (cerr .NodeIsRecovering () || cerr .NotMaster ()) {
376
376
// ignore stale error
377
377
if desc .TopologyVersion .CompareToIncoming (cerr .TopologyVersion ) >= 0 {
378
- return
378
+ return driver . NoChange
379
379
}
380
380
381
381
// updates description to unknown
382
382
s .updateDescription (description .NewServerFromError (s .address , err , cerr .TopologyVersion ))
383
383
s .RequestImmediateCheck ()
384
384
385
+ res := driver .ServerMarkedUnknown
385
386
// If the node is shutting down or is older than 4.2, we synchronously clear the pool
386
387
if cerr .NodeIsShuttingDown () || desc .WireVersion == nil || desc .WireVersion .Max < 8 {
388
+ res = driver .ConnectionPoolCleared
387
389
s .pool .clear ()
388
390
}
389
- return
391
+ return res
390
392
}
391
393
if wcerr , ok := getWriteConcernErrorForProcessing (err ); ok {
392
394
// ignore stale error
393
395
if desc .TopologyVersion .CompareToIncoming (wcerr .TopologyVersion ) >= 0 {
394
- return
396
+ return driver . NoChange
395
397
}
396
398
397
399
// updates description to unknown
398
400
s .updateDescription (description .NewServerFromError (s .address , err , wcerr .TopologyVersion ))
399
401
s .RequestImmediateCheck ()
400
402
403
+ res := driver .ServerMarkedUnknown
401
404
// If the node is shutting down or is older than 4.2, we synchronously clear the pool
402
405
if wcerr .NodeIsShuttingDown () || desc .WireVersion == nil || desc .WireVersion .Max < 8 {
406
+ res = driver .ConnectionPoolCleared
403
407
s .pool .clear ()
404
408
}
405
- return
409
+ return res
406
410
}
407
411
408
412
wrappedConnErr := unwrapConnectionError (err )
409
413
if wrappedConnErr == nil {
410
- return
414
+ return driver . NoChange
411
415
}
412
416
413
417
// Ignore transient timeout errors.
414
418
if netErr , ok := wrappedConnErr .(net.Error ); ok && netErr .Timeout () {
415
- return
419
+ return driver . NoChange
416
420
}
417
421
if wrappedConnErr == context .Canceled || wrappedConnErr == context .DeadlineExceeded {
418
- return
422
+ return driver . NoChange
419
423
}
420
424
421
425
// For a non-timeout network error, we clear the pool, set the description to Unknown, and cancel the in-progress
@@ -424,6 +428,7 @@ func (s *Server) ProcessError(err error, conn driver.Connection) {
424
428
s .updateDescription (description .NewServerFromError (s .address , err , nil ))
425
429
s .pool .clear ()
426
430
s .cancelCheck ()
431
+ return driver .ConnectionPoolCleared
427
432
}
428
433
429
434
// update handles performing heartbeats and updating any subscribers of the
0 commit comments