@@ -66,8 +66,13 @@ public Server getServer(final ServerSelector serverSelector, final long maxWaitT
66
66
CountDownLatch currentPhase = phase .get ();
67
67
ClusterDescription curDescription = description ;
68
68
List <ServerDescription > serverDescriptions = serverSelector .choose (curDescription );
69
- final long endTime = System . nanoTime () + NANOSECONDS . convert ( maxWaitTime , timeUnit );
69
+
70
70
boolean selectionFailureLogged = false ;
71
+
72
+ final long startTimeNanos = System .nanoTime ();
73
+ final long endTimeNanos = startTimeNanos + NANOSECONDS .convert (maxWaitTime , timeUnit );
74
+ long curTimeNanos = startTimeNanos ;
75
+
71
76
while (true ) {
72
77
throwIfIncompatible (curDescription );
73
78
@@ -78,7 +83,7 @@ public Server getServer(final ServerSelector serverSelector, final long maxWaitT
78
83
}
79
84
}
80
85
81
- if (System . nanoTime () > endTime ) {
86
+ if (curTimeNanos > endTimeNanos ) {
82
87
throw new MongoTimeoutException (format ("Timed out while waiting for a server that matches %s after %d ms" ,
83
88
serverSelector , MILLISECONDS .convert (maxWaitTime , timeUnit )));
84
89
}
@@ -91,7 +96,11 @@ public Server getServer(final ServerSelector serverSelector, final long maxWaitT
91
96
92
97
connect ();
93
98
94
- currentPhase .await (serverFactory .getSettings ().getHeartbeatConnectRetryFrequency (NANOSECONDS ), NANOSECONDS );
99
+ currentPhase .await (Math .min (endTimeNanos - curTimeNanos ,
100
+ serverFactory .getSettings ().getHeartbeatConnectRetryFrequency (NANOSECONDS )),
101
+ NANOSECONDS );
102
+
103
+ curTimeNanos = System .nanoTime ();
95
104
96
105
currentPhase = phase .get ();
97
106
curDescription = description ;
@@ -109,11 +118,16 @@ public ClusterDescription getDescription(final long maxWaitTime, final TimeUnit
109
118
try {
110
119
CountDownLatch currentPhase = phase .get ();
111
120
ClusterDescription curDescription = description ;
112
- final long endTime = System . nanoTime () + NANOSECONDS . convert ( maxWaitTime , timeUnit );
121
+
113
122
boolean selectionFailureLogged = false ;
123
+
124
+ final long startTimeNanos = System .nanoTime ();
125
+ final long endTimeNanos = startTimeNanos + NANOSECONDS .convert (maxWaitTime , timeUnit );
126
+ long curTimeNanos = startTimeNanos ;
127
+
114
128
while (curDescription .getType () == ClusterType .Unknown ) {
115
129
116
- if (System . nanoTime () > endTime ) {
130
+ if (curTimeNanos > endTimeNanos ) {
117
131
throw new MongoTimeoutException (format ("Timed out while waiting to connect after %d ms" ,
118
132
MILLISECONDS .convert (maxWaitTime , timeUnit )));
119
133
}
@@ -126,7 +140,11 @@ public ClusterDescription getDescription(final long maxWaitTime, final TimeUnit
126
140
127
141
connect ();
128
142
129
- currentPhase .await (serverFactory .getSettings ().getHeartbeatConnectRetryFrequency (NANOSECONDS ), NANOSECONDS );
143
+ currentPhase .await (Math .min (endTimeNanos - curTimeNanos ,
144
+ serverFactory .getSettings ().getHeartbeatConnectRetryFrequency (NANOSECONDS )),
145
+ NANOSECONDS );
146
+
147
+ curTimeNanos = System .nanoTime ();
130
148
131
149
currentPhase = phase .get ();
132
150
curDescription = description ;
0 commit comments