@@ -340,7 +340,12 @@ private ServerDescription doHeartbeat(final ServerDescription currentServerDescr
340340 }
341341
342342 private void logAndNotifyHeartbeatStarted (final boolean shouldStreamResponses ) {
343- ConnectionDescription description = connection .getDescription ();
343+ ConnectionDescription description = withLock (lock , () -> {
344+ if (connection != null ) {
345+ return connection .getDescription ();
346+ }
347+ return null ;
348+ });
344349 if (description != null ) {
345350 alreadyLoggedHeartBeatStarted = true ;
346351 logHeartbeatStarted (serverId , description , shouldStreamResponses );
@@ -357,20 +362,34 @@ private void logAndNotifyHeartbeatStarted(final boolean shouldStreamResponses) {
357362 private void logAndNotifyHeartbeatSucceeded (final boolean shouldStreamResponses , final BsonDocument helloResult ) {
358363 alreadyLoggedHeartBeatStarted = false ;
359364 long elapsedTimeNanos = getElapsedTimeNanos ();
360- if (!shouldStreamResponses ) {
361- roundTripTimeSampler .addSample (elapsedTimeNanos );
365+
366+ ConnectionDescription description = withLock (lock , () -> {
367+ if (connection != null ) {
368+ return connection .getDescription ();
369+ }
370+ return null ;
371+ });
372+ if (description != null ) {
373+ if (!shouldStreamResponses ) {
374+ roundTripTimeSampler .addSample (elapsedTimeNanos );
375+ }
376+ logHeartbeatSucceeded (serverId , description , shouldStreamResponses , elapsedTimeNanos , helloResult );
377+ serverMonitorListener .serverHeartbeatSucceeded (
378+ new ServerHeartbeatSucceededEvent (description .getConnectionId (), helloResult ,
379+ elapsedTimeNanos , shouldStreamResponses ));
362380 }
363- logHeartbeatSucceeded (serverId , connection .getDescription (), shouldStreamResponses , elapsedTimeNanos , helloResult );
364- serverMonitorListener .serverHeartbeatSucceeded (
365- new ServerHeartbeatSucceededEvent (connection .getDescription ().getConnectionId (), helloResult ,
366- elapsedTimeNanos , shouldStreamResponses ));
367381 }
368382
369383 private void logAndNotifyHeartbeatFailed (final boolean shouldStreamResponses , final Exception e ) {
370384 alreadyLoggedHeartBeatStarted = false ;
371385 long elapsedTimeNanos = getElapsedTimeNanos ();
372386
373- ConnectionDescription description = connection != null ? connection .getDescription () : null ;
387+ ConnectionDescription description = withLock (lock , () -> {
388+ if (connection != null ) {
389+ return connection .getDescription ();
390+ }
391+ return null ;
392+ });
374393 if (description != null ) {
375394 logHeartbeatFailed (serverId , description , shouldStreamResponses , elapsedTimeNanos , e );
376395 serverMonitorListener .serverHeartbeatFailed (
@@ -383,6 +402,7 @@ private void logAndNotifyHeartbeatFailed(final boolean shouldStreamResponses, fi
383402 }
384403 }
385404 }
405+
386406 private long getElapsedTimeNanos () {
387407 return System .nanoTime () - lookupStartTimeNanos ;
388408 }
0 commit comments