From c86824b2b78525a5135e7a6d9ba75b69880e3365 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Thu, 26 Dec 2024 15:30:44 -0500 Subject: [PATCH 1/7] update applySrvMaxHosts --- .../connection/DnsMultiServerCluster.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index 0589d0f7d19..95d4c78dc2f 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -58,13 +59,28 @@ public void initialize(final Collection hosts) { } private Collection applySrvMaxHosts(final Collection hosts) { - Collection newHosts = hosts; + Collection newHosts = new ArrayList<>(hosts); + List existingHostList = new ArrayList<>(getSettings().getHosts()); + Integer numCurrentEndPoints = existingHostList.size(); + System.out.println("hosts:" + hosts); + System.out.println("host list:" + existingHostList); + Integer numRemovedEndPoints = 0; + Iterator iterator = existingHostList.iterator(); + while (iterator.hasNext()) { + ServerAddress host = iterator.next(); + if (!hosts.contains(host)) { + iterator.remove(); + numRemovedEndPoints++; + } + } Integer srvMaxHosts = getSettings().getSrvMaxHosts(); if (srvMaxHosts != null && srvMaxHosts > 0) { if (srvMaxHosts < hosts.size()) { List newHostsList = new ArrayList<>(hosts); + newHostsList.removeAll(existingHostList); Collections.shuffle(newHostsList, ThreadLocalRandom.current()); - newHosts = newHostsList.subList(0, srvMaxHosts); + newHosts = existingHostList; + newHosts.addAll(newHostsList.subList(0, srvMaxHosts - numCurrentEndPoints + numRemovedEndPoints)); } } return newHosts; From 14657f747c6426cb7d9c46b910120007d91b39bb Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Tue, 31 Dec 2024 13:03:26 -0500 Subject: [PATCH 2/7] update srvMaxHost logic --- .../internal/connection/DnsMultiServerCluster.java | 8 ++++---- .../mongodb/internal/connection/SrvPollingProseTests.java | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index 95d4c78dc2f..c1b8d2b441e 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -21,6 +21,7 @@ import com.mongodb.connection.ClusterId; import com.mongodb.connection.ClusterSettings; import com.mongodb.connection.ClusterType; +import com.mongodb.connection.ServerDescription; import com.mongodb.lang.Nullable; import java.util.ArrayList; @@ -29,6 +30,7 @@ import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; import static com.mongodb.assertions.Assertions.assertNotNull; @@ -39,7 +41,6 @@ public final class DnsMultiServerCluster extends AbstractMultiServerCluster { private final DnsSrvRecordMonitor dnsSrvRecordMonitor; private volatile MongoException srvResolutionException; - public DnsMultiServerCluster(final ClusterId clusterId, final ClusterSettings settings, final ClusterableServerFactory serverFactory, final DnsSrvRecordMonitorFactory dnsSrvRecordMonitorFactory) { super(clusterId, settings, serverFactory); @@ -60,10 +61,9 @@ public void initialize(final Collection hosts) { private Collection applySrvMaxHosts(final Collection hosts) { Collection newHosts = new ArrayList<>(hosts); - List existingHostList = new ArrayList<>(getSettings().getHosts()); + List existingHostList = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions() + .stream().map(ServerDescription::getAddress).collect(Collectors.toList()); Integer numCurrentEndPoints = existingHostList.size(); - System.out.println("hosts:" + hosts); - System.out.println("host list:" + existingHostList); Integer numRemovedEndPoints = 0; Iterator iterator = existingHostList.iterator(); while (iterator.hasNext()) { diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/SrvPollingProseTests.java b/driver-core/src/test/unit/com/mongodb/internal/connection/SrvPollingProseTests.java index a6605725cf8..a0f08a82360 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/SrvPollingProseTests.java +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/SrvPollingProseTests.java @@ -160,9 +160,10 @@ public void shouldUseAllRecordsWhenSrvMaxHostsIsGreaterThanOrEqualToNumSrvRecord public void shouldUseSrvMaxHostsWhenSrvMaxHostsIsLessThanNumSrvRecords() { int srvMaxHosts = 2; List updatedHosts = asList(firstHost, thirdHost, fourthHost); - initCluster(updatedHosts, srvMaxHosts); + assertEquals(srvMaxHosts, clusterHostsSet().size()); + assertTrue(updatedHosts.contains(firstHost)); assertTrue(updatedHosts.containsAll(clusterHostsSet())); } From b7e793a71de4ebfe202a2ef6553acc7984eed67e Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Mon, 13 Jan 2025 16:24:35 -0500 Subject: [PATCH 3/7] refactor --- .../connection/DnsMultiServerCluster.java | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index c1b8d2b441e..0879eba7d73 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -59,31 +59,27 @@ public void initialize(final Collection hosts) { } } - private Collection applySrvMaxHosts(final Collection hosts) { - Collection newHosts = new ArrayList<>(hosts); - List existingHostList = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions() - .stream().map(ServerDescription::getAddress).collect(Collectors.toList()); - Integer numCurrentEndPoints = existingHostList.size(); - Integer numRemovedEndPoints = 0; - Iterator iterator = existingHostList.iterator(); - while (iterator.hasNext()) { - ServerAddress host = iterator.next(); - if (!hosts.contains(host)) { - iterator.remove(); - numRemovedEndPoints++; - } - } + private Collection applySrvMaxHosts(final Collection newHosts) { Integer srvMaxHosts = getSettings().getSrvMaxHosts(); - if (srvMaxHosts != null && srvMaxHosts > 0) { - if (srvMaxHosts < hosts.size()) { - List newHostsList = new ArrayList<>(hosts); - newHostsList.removeAll(existingHostList); - Collections.shuffle(newHostsList, ThreadLocalRandom.current()); - newHosts = existingHostList; - newHosts.addAll(newHostsList.subList(0, srvMaxHosts - numCurrentEndPoints + numRemovedEndPoints)); - } + if (srvMaxHosts == null || srvMaxHosts <= 0 || newHosts.size() <= srvMaxHosts) { + return new ArrayList<>(newHosts); } - return newHosts; + // prior hosts + List result = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions().stream() + .map(ServerDescription::getAddress).collect(Collectors.toList()); + int numPriorHosts = result.size(); + + result.removeIf(host -> !newHosts.contains(host)); + int numRemovedHosts = numPriorHosts - result.size(); + int numNewHostsToAdd = srvMaxHosts - numPriorHosts + numRemovedHosts; + + List addedHosts = new ArrayList<>(newHosts); + addedHosts.removeAll(result); + Collections.shuffle(addedHosts, ThreadLocalRandom.current()); + // add the select shuffled list to the priorHosts that are a part of the newHosts + result.addAll(addedHosts.subList(0, numNewHostsToAdd)); + + return result; } @Override From a35dc0b5f2fb291be3d4d6af2e8962f7c235d09e Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Tue, 14 Jan 2025 10:56:07 -0500 Subject: [PATCH 4/7] refactor --- .../connection/DnsMultiServerCluster.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index 0879eba7d73..17ee22ced00 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -59,27 +59,35 @@ public void initialize(final Collection hosts) { } } - private Collection applySrvMaxHosts(final Collection newHosts) { + private Collection applySrvMaxHosts(final Collection latestSrvHosts) { Integer srvMaxHosts = getSettings().getSrvMaxHosts(); - if (srvMaxHosts == null || srvMaxHosts <= 0 || newHosts.size() <= srvMaxHosts) { - return new ArrayList<>(newHosts); + if (srvMaxHosts == null || srvMaxHosts <= 0 || latestSrvHosts.size() <= srvMaxHosts) { + return new ArrayList<>(latestSrvHosts); } - // prior hosts - List result = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions().stream() + List activePriorHosts = getActivePriorHosts(latestSrvHosts); + int numNewHostsToAdd = srvMaxHosts - activePriorHosts.size(); + List result = getShuffledLatestSrvHosts(latestSrvHosts, activePriorHosts, numNewHostsToAdd); + + return result; + } + + private List getActivePriorHosts(Collection latestSrvHosts) { + List priorHosts = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions().stream() .map(ServerDescription::getAddress).collect(Collectors.toList()); - int numPriorHosts = result.size(); + priorHosts.removeIf(host -> !latestSrvHosts.contains(host)); - result.removeIf(host -> !newHosts.contains(host)); - int numRemovedHosts = numPriorHosts - result.size(); - int numNewHostsToAdd = srvMaxHosts - numPriorHosts + numRemovedHosts; + return priorHosts; + } - List addedHosts = new ArrayList<>(newHosts); - addedHosts.removeAll(result); + private List getShuffledLatestSrvHosts(final Collection latestSrvHosts, + List activePriorHosts, int numNewHostsToAdd) { + List addedHosts = new ArrayList<>(latestSrvHosts); + addedHosts.removeAll(activePriorHosts); Collections.shuffle(addedHosts, ThreadLocalRandom.current()); - // add the select shuffled list to the priorHosts that are a part of the newHosts - result.addAll(addedHosts.subList(0, numNewHostsToAdd)); + // add the shuffled latestSrvHosts to the activePriorHosts + activePriorHosts.addAll(addedHosts.subList(0, numNewHostsToAdd)); - return result; + return activePriorHosts; } @Override From 025557f82d5e30aaf31d5f4496792fd7681c4efc Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 15 Jan 2025 13:57:35 -0500 Subject: [PATCH 5/7] update with suggestion --- .../internal/connection/DnsMultiServerCluster.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index 17ee22ced00..4be3d56bef7 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -64,11 +64,11 @@ private Collection applySrvMaxHosts(final Collection(latestSrvHosts); } - List activePriorHosts = getActivePriorHosts(latestSrvHosts); - int numNewHostsToAdd = srvMaxHosts - activePriorHosts.size(); - List result = getShuffledLatestSrvHosts(latestSrvHosts, activePriorHosts, numNewHostsToAdd); + List activeHosts = getActivePriorHosts(latestSrvHosts); + int numNewHostsToAdd = srvMaxHosts - activeHosts.size(); + activeHosts.addAll(addShuffledHosts(latestSrvHosts, activeHosts, numNewHostsToAdd)); - return result; + return activeHosts; } private List getActivePriorHosts(Collection latestSrvHosts) { @@ -79,15 +79,13 @@ private List getActivePriorHosts(Collection latest return priorHosts; } - private List getShuffledLatestSrvHosts(final Collection latestSrvHosts, + private List addShuffledHosts(final Collection latestSrvHosts, List activePriorHosts, int numNewHostsToAdd) { List addedHosts = new ArrayList<>(latestSrvHosts); addedHosts.removeAll(activePriorHosts); Collections.shuffle(addedHosts, ThreadLocalRandom.current()); - // add the shuffled latestSrvHosts to the activePriorHosts - activePriorHosts.addAll(addedHosts.subList(0, numNewHostsToAdd)); - return activePriorHosts; + return addedHosts.subList(0, numNewHostsToAdd); } @Override From 71ea834d5cb16e36fdfae437a261b98838b0cd33 Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 15 Jan 2025 15:20:02 -0500 Subject: [PATCH 6/7] fix checkstyle --- .../mongodb/internal/connection/DnsMultiServerCluster.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java index 4be3d56bef7..51e28ee5c84 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DnsMultiServerCluster.java @@ -27,7 +27,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; @@ -71,7 +70,7 @@ private Collection applySrvMaxHosts(final Collection getActivePriorHosts(Collection latestSrvHosts) { + private List getActivePriorHosts(final Collection latestSrvHosts) { List priorHosts = DnsMultiServerCluster.this.getCurrentDescription().getServerDescriptions().stream() .map(ServerDescription::getAddress).collect(Collectors.toList()); priorHosts.removeIf(host -> !latestSrvHosts.contains(host)); @@ -80,7 +79,7 @@ private List getActivePriorHosts(Collection latest } private List addShuffledHosts(final Collection latestSrvHosts, - List activePriorHosts, int numNewHostsToAdd) { + final List activePriorHosts, final int numNewHostsToAdd) { List addedHosts = new ArrayList<>(latestSrvHosts); addedHosts.removeAll(activePriorHosts); Collections.shuffle(addedHosts, ThreadLocalRandom.current()); From 28351a7ab27a3788af9972911c292179f259eb1a Mon Sep 17 00:00:00 2001 From: Joy Kim Date: Wed, 15 Jan 2025 15:35:18 -0500 Subject: [PATCH 7/7] fix checkstyle --- driver-kotlin-extensions/build.gradle.kts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/driver-kotlin-extensions/build.gradle.kts b/driver-kotlin-extensions/build.gradle.kts index e0192fa5abc..76f36ca33b2 100644 --- a/driver-kotlin-extensions/build.gradle.kts +++ b/driver-kotlin-extensions/build.gradle.kts @@ -165,4 +165,6 @@ tasks.javadocJar.configure { // =========================== tasks.sourcesJar { from(project.sourceSets.main.map { it.kotlin }) } -afterEvaluate { tasks.jar { manifest { attributes["Automatic-Module-Name"] = "org.mongodb.driver.kotlin.extensions" } } } +afterEvaluate { + tasks.jar { manifest { attributes["Automatic-Module-Name"] = "org.mongodb.driver.kotlin.extensions" } } +}