Skip to content

Commit 73f9141

Browse files
authored
JAVA-2987 BasicLoadBalancingPolicy remote compute nodes check all liveNodes (#1576)
* BasicLoadBalancingPolicy remote compute nodes -> don't presume local dc nodes to be up and among the liveNodes that where found (can happen if the local dc wasn't up when the application started) * BasicLoadBalancingPolicy: follow suggestion from @absurdfarce for remote computeNodes to make the code cleaner and more efficient * BasicLoadBalancingPolicy: fix formatting
1 parent 85efee4 commit 73f9141

File tree

1 file changed

+10
-20
lines changed

1 file changed

+10
-20
lines changed

core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/BasicLoadBalancingPolicy.java

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.datastax.oss.driver.internal.core.util.collection.LazyQueryPlan;
4343
import com.datastax.oss.driver.internal.core.util.collection.QueryPlan;
4444
import com.datastax.oss.driver.internal.core.util.collection.SimpleQueryPlan;
45+
import com.datastax.oss.driver.shaded.guava.common.base.Predicates;
4546
import edu.umd.cs.findbugs.annotations.NonNull;
4647
import edu.umd.cs.findbugs.annotations.Nullable;
4748
import java.nio.ByteBuffer;
@@ -322,30 +323,19 @@ protected Queue<Node> maybeAddDcFailover(@Nullable Request request, @NonNull Que
322323

323324
@Override
324325
protected Object[] computeNodes() {
325-
Object[] dcs = liveNodes.dcs().toArray();
326-
if (dcs.length <= 1) {
327-
return EMPTY_NODES;
328-
}
329-
Object[] remoteNodes = new Object[(dcs.length - 1) * maxNodesPerRemoteDc];
330-
int remoteNodesLength = 0;
331-
for (Object dc : dcs) {
332-
if (!dc.equals(localDc)) {
333-
Object[] remoteNodesInDc = liveNodes.dc((String) dc).toArray();
334-
for (int i = 0; i < maxNodesPerRemoteDc && i < remoteNodesInDc.length; i++) {
335-
remoteNodes[remoteNodesLength++] = remoteNodesInDc[i];
336-
}
337-
}
338-
}
326+
Set<String> dcs = liveNodes.dcs();
327+
Object[] remoteNodes =
328+
dcs.stream()
329+
.filter(Predicates.not(Predicates.equalTo(localDc)))
330+
.flatMap(dc -> liveNodes.dc(dc).stream().limit(maxNodesPerRemoteDc))
331+
.toArray();
332+
333+
int remoteNodesLength = remoteNodes.length;
339334
if (remoteNodesLength == 0) {
340335
return EMPTY_NODES;
341336
}
342337
shuffleHead(remoteNodes, remoteNodesLength);
343-
if (remoteNodes.length == remoteNodesLength) {
344-
return remoteNodes;
345-
}
346-
Object[] trimmedRemoteNodes = new Object[remoteNodesLength];
347-
System.arraycopy(remoteNodes, 0, trimmedRemoteNodes, 0, remoteNodesLength);
348-
return trimmedRemoteNodes;
338+
return remoteNodes;
349339
}
350340
};
351341

0 commit comments

Comments
 (0)