@@ -59,34 +59,40 @@ public BaseCluster(final String clusterId, final ClusterSettings settings, final
5959 }
6060
6161 @ Override
62- public Server getServer (final ServerSelector serverSelector , final long maxWaitTime , final TimeUnit timeUnit ) {
62+ public Server getServer (final ServerSelector serverSelector , final long maxWaitTime , final TimeUnit maxWaitTimeTimeUnit ,
63+ final long connectRetryFrequency , final TimeUnit connectRetryFrequencyTimeUnit ) {
6364 isTrue ("open" , !isClosed ());
6465
6566 try {
6667 CountDownLatch currentPhase = phase .get ();
6768 ClusterDescription curDescription = description ;
6869 List <ServerDescription > serverDescriptions = serverSelector .choose (curDescription );
69- final long endTime = System .nanoTime () + NANOSECONDS .convert (maxWaitTime , timeUnit );
70+ final long endTime = System .nanoTime () + NANOSECONDS .convert (maxWaitTime , maxWaitTimeTimeUnit );
71+ boolean selectionFailureLogged = false ;
7072 while (true ) {
7173 throwIfIncompatible (curDescription );
74+
7275 if (!serverDescriptions .isEmpty ()) {
7376 ClusterableServer server = getRandomServer (new ArrayList <ServerDescription >(serverDescriptions ));
7477 if (server != null ) {
7578 return new WrappedServer (server );
7679 }
7780 }
7881
79- final long timeout = endTime - System .nanoTime ();
80-
81- LOGGER . info ( format ( "No server chosen by %s from cluster description %s. Waiting for %d ms before timing out" ,
82- serverSelector , curDescription , MILLISECONDS . convert ( timeout , NANOSECONDS )));
82+ if ( System .nanoTime () > endTime ) {
83+ throw new MongoTimeoutException ( format ( "Timed out while waiting for a server that matches %s after %d ms" ,
84+ serverSelector , MILLISECONDS . convert ( maxWaitTime , maxWaitTimeTimeUnit )));
85+ }
8386
87+ if (!selectionFailureLogged ) {
88+ LOGGER .info (format ("No server chosen by %s from cluster description %s. Waiting for %d ms before timing out" ,
89+ serverSelector , curDescription , MILLISECONDS .convert (maxWaitTime , maxWaitTimeTimeUnit )));
90+ selectionFailureLogged = true ;
91+ }
8492 connect ();
8593
86- if (!currentPhase .await (timeout , NANOSECONDS )) {
87- throw new MongoTimeoutException (format ("Timed out while waiting for a server that matches %s after %d ms" ,
88- serverSelector , MILLISECONDS .convert (maxWaitTime , timeUnit )));
89- }
94+ currentPhase .await (connectRetryFrequency , connectRetryFrequencyTimeUnit );
95+
9096 currentPhase = phase .get ();
9197 curDescription = description ;
9298 serverDescriptions = serverSelector .choose (curDescription );
@@ -97,25 +103,32 @@ public Server getServer(final ServerSelector serverSelector, final long maxWaitT
97103 }
98104
99105 @ Override
100- public ClusterDescription getDescription (final long maxWaitTime , final TimeUnit timeUnit ) {
106+ public ClusterDescription getDescription (final long maxWaitTime , final TimeUnit maxWaitTimeTimeUnit ,
107+ final long connectRetryFrequency , final TimeUnit connectRetryFrequencyTimeUnit ) {
101108 isTrue ("open" , !isClosed ());
102109
103110 try {
104111 CountDownLatch currentPhase = phase .get ();
105112 ClusterDescription curDescription = description ;
106- final long endTime = System .nanoTime () + NANOSECONDS .convert (maxWaitTime , timeUnit );
113+ final long endTime = System .nanoTime () + NANOSECONDS .convert (maxWaitTime , maxWaitTimeTimeUnit );
114+ boolean selectionFailureLogged = false ;
107115 while (curDescription .getType () == ClusterType .Unknown ) {
108- final long timeout = endTime - System .nanoTime ();
109116
110- LOGGER .info (format ("Cluster description not yet available. Waiting for %d ms before timing out" ,
111- MILLISECONDS .convert (timeout , NANOSECONDS )));
117+ if (System .nanoTime () > endTime ) {
118+ throw new MongoTimeoutException (format ("Timed out while waiting to connect after %d ms" ,
119+ MILLISECONDS .convert (maxWaitTime , maxWaitTimeTimeUnit )));
120+ }
121+
122+ if (!selectionFailureLogged ) {
123+ LOGGER .info (format ("Cluster description not yet available. Waiting for %d ms before timing out" ,
124+ MILLISECONDS .convert (maxWaitTime , maxWaitTimeTimeUnit )));
125+ selectionFailureLogged = true ;
126+ }
112127
113128 connect ();
114129
115- if (!currentPhase .await (timeout , NANOSECONDS )) {
116- throw new MongoTimeoutException (format ("Timed out while waiting to connect after %d ms" ,
117- MILLISECONDS .convert (maxWaitTime , timeUnit )));
118- }
130+ currentPhase .await (connectRetryFrequency , connectRetryFrequencyTimeUnit );
131+
119132 currentPhase = phase .get ();
120133 curDescription = description ;
121134 }
0 commit comments