From 12f1ae6e9a7b5edfe8f56d3d75b0f18b4563b1d3 Mon Sep 17 00:00:00 2001 From: Andrii Rosa Date: Wed, 17 Apr 2024 14:30:31 -0700 Subject: [PATCH] Make number of preferred nodes configurable --- .../com/facebook/presto/delta/DeltaSplit.java | 5 ++--- .../java/com/facebook/presto/hive/HiveSplit.java | 2 +- .../presto/hive/TestHiveSplitSource.java | 2 +- .../java/com/facebook/presto/hudi/HudiSplit.java | 2 +- .../facebook/presto/iceberg/IcebergSplit.java | 2 +- .../scheduler/ConsistentHashingNodeProvider.java | 3 --- .../scheduler/ModularHashingNodeProvider.java | 3 --- .../presto/execution/scheduler/NodeMap.java | 15 +++++---------- .../execution/scheduler/NodeScheduler.java | 6 ++++-- .../execution/scheduler/NodeSchedulerConfig.java | 14 ++++++++++++++ .../nodeSelection/SimpleNodeSelector.java | 16 ++++------------ .../nodeSelection/TopologyAwareNodeSelector.java | 10 ++++------ .../presto/execution/TestNodeScheduler.java | 10 ++++++---- .../execution/TestNodeSchedulerConfig.java | 7 +++++-- .../com/facebook/presto/spi/NodeProvider.java | 5 ++--- 15 files changed, 50 insertions(+), 52 deletions(-) diff --git a/presto-delta/src/main/java/com/facebook/presto/delta/DeltaSplit.java b/presto-delta/src/main/java/com/facebook/presto/delta/DeltaSplit.java index 3f0e93168d9b..c9d76fdcd997 100644 --- a/presto-delta/src/main/java/com/facebook/presto/delta/DeltaSplit.java +++ b/presto-delta/src/main/java/com/facebook/presto/delta/DeltaSplit.java @@ -128,9 +128,8 @@ public NodeSelectionStrategy getNodeSelectionStrategy() public List getPreferredNodes(NodeProvider nodeProvider) { if (getNodeSelectionStrategy() == SOFT_AFFINITY) { - // SOFT_AFFINITY node selection strategy scheduler would choose 2 workers (preferred, secondary preferred) - // for scheduling - return nodeProvider.get(filePath, 2); + // SOFT_AFFINITY node selection strategy scheduler would choose preferred nodes for scheduling + return nodeProvider.get(filePath); } return ImmutableList.of(); // empty list indicates no preference. } diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HiveSplit.java b/presto-hive/src/main/java/com/facebook/presto/hive/HiveSplit.java index 5ec45f228008..7492716b1c55 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HiveSplit.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HiveSplit.java @@ -167,7 +167,7 @@ public List getAddresses() public List getPreferredNodes(NodeProvider nodeProvider) { if (getNodeSelectionStrategy() == SOFT_AFFINITY) { - return nodeProvider.get(fileSplit.getPath() + "#" + fileSplit.getAffinitySchedulingFileSectionIndex(), 2); + return nodeProvider.get(fileSplit.getPath() + "#" + fileSplit.getAffinitySchedulingFileSectionIndex()); } return addresses; } diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveSplitSource.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveSplitSource.java index da834a85d614..65ae49a577e7 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveSplitSource.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestHiveSplitSource.java @@ -167,7 +167,7 @@ public void testAffinitySchedulingKey() private static String getAffinitySchedulingKey(HiveSplit split) { AtomicReference reference = new AtomicReference<>(); - split.getPreferredNodes((key, count) -> { + split.getPreferredNodes((key) -> { reference.set(key); return ImmutableList.of(); }); diff --git a/presto-hudi/src/main/java/com/facebook/presto/hudi/HudiSplit.java b/presto-hudi/src/main/java/com/facebook/presto/hudi/HudiSplit.java index 8c7c4771c027..336ea99fa727 100644 --- a/presto-hudi/src/main/java/com/facebook/presto/hudi/HudiSplit.java +++ b/presto-hudi/src/main/java/com/facebook/presto/hudi/HudiSplit.java @@ -109,7 +109,7 @@ public NodeSelectionStrategy getNodeSelectionStrategy() public List getPreferredNodes(NodeProvider nodeProvider) { if (getNodeSelectionStrategy() == SOFT_AFFINITY) { - return baseFile.map(file -> nodeProvider.get(file.getPath(), 2)).orElse(addresses); + return baseFile.map(file -> nodeProvider.get(file.getPath())).orElse(addresses); } return addresses; } diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergSplit.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergSplit.java index c60673b28920..d23b2faa337c 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergSplit.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/IcebergSplit.java @@ -143,7 +143,7 @@ public NodeSelectionStrategy getNodeSelectionStrategy() public List getPreferredNodes(NodeProvider nodeProvider) { if (getNodeSelectionStrategy() == SOFT_AFFINITY) { - return nodeProvider.get(path, 2); + return nodeProvider.get(path); } return addresses; } diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ConsistentHashingNodeProvider.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ConsistentHashingNodeProvider.java index 4598fd659a33..753d904743cb 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ConsistentHashingNodeProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ConsistentHashingNodeProvider.java @@ -15,7 +15,6 @@ import com.facebook.presto.metadata.InternalNode; import com.facebook.presto.spi.HostAddress; -import com.facebook.presto.spi.NodeProvider; import com.google.common.collect.ImmutableList; import com.google.common.hash.HashFunction; @@ -34,7 +33,6 @@ import static java.util.Objects.requireNonNull; public class ConsistentHashingNodeProvider - implements NodeProvider { private static final HashFunction HASH_FUNCTION = murmur3_32(); private final NavigableMap candidates; @@ -57,7 +55,6 @@ private ConsistentHashingNodeProvider(NavigableMap candid this.nodeCount = nodeCount; } - @Override public List get(String key, int count) { if (count > nodeCount) { diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ModularHashingNodeProvider.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ModularHashingNodeProvider.java index 4721a8e39234..800eb87d927b 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ModularHashingNodeProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/ModularHashingNodeProvider.java @@ -15,7 +15,6 @@ import com.facebook.presto.metadata.InternalNode; import com.facebook.presto.spi.HostAddress; -import com.facebook.presto.spi.NodeProvider; import com.facebook.presto.spi.PrestoException; import com.google.common.hash.HashFunction; @@ -29,7 +28,6 @@ import static java.util.Collections.unmodifiableList; public class ModularHashingNodeProvider - implements NodeProvider { private static final HashFunction HASH_FUNCTION = murmur3_32(); @@ -43,7 +41,6 @@ public ModularHashingNodeProvider(List sortedCandidates) this.sortedCandidates = sortedCandidates; } - @Override public List get(String identifier, int count) { int size = sortedCandidates.size(); diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeMap.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeMap.java index b660135574c5..41803e0d691a 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeMap.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeMap.java @@ -24,8 +24,6 @@ import java.util.Optional; import java.util.Set; -import static java.lang.String.format; - public class NodeMap { private final Map activeNodesByNodeId; @@ -92,15 +90,12 @@ public SetMultimap getAllNodesByHostAndPort() return allNodesByHostAndPort; } - public NodeProvider getActiveNodeProvider(NodeSelectionHashStrategy nodeSelectionHashStrategy) + public NodeProvider getNodeProvider(int nodeCount) { - switch (nodeSelectionHashStrategy) { - case MODULAR_HASHING: - return new ModularHashingNodeProvider(activeNodes); - case CONSISTENT_HASHING: - return consistentHashingNodeProvider.get(); - default: - throw new IllegalArgumentException(format("Unknown NodeSelectionHashStrategy: %s", nodeSelectionHashStrategy)); + if (consistentHashingNodeProvider.isPresent()) { + return (key) -> consistentHashingNodeProvider.get().get(key, nodeCount); } + ModularHashingNodeProvider modularHashingNodeProvider = new ModularHashingNodeProvider(allNodes); + return (key) -> modularHashingNodeProvider.get(key, nodeCount); } } diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeScheduler.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeScheduler.java index b116f2c593bf..8c2ee85d75f9 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeScheduler.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeScheduler.java @@ -101,6 +101,7 @@ public class NodeScheduler private final SimpleTtlNodeSelectorConfig simpleTtlNodeSelectorConfig; private final NodeSelectionHashStrategy nodeSelectionHashStrategy; private final int minVirtualNodeCount; + private final int maxPreferredNodes; @Inject public NodeScheduler( @@ -167,6 +168,7 @@ public NodeScheduler( this.simpleTtlNodeSelectorConfig = requireNonNull(simpleTtlNodeSelectorConfig, "simpleTtlNodeSelectorConfig is null"); this.nodeSelectionHashStrategy = config.getNodeSelectionHashStrategy(); this.minVirtualNodeCount = config.getMinVirtualNodeCount(); + this.maxPreferredNodes = config.getMaxPreferredNodes(); } @PreDestroy @@ -222,7 +224,7 @@ public NodeSelector createNodeSelector(Session session, ConnectorId connectorId, topologicalSplitCounters, networkLocationSegmentNames, networkLocationCache, - nodeSelectionHashStrategy); + maxPreferredNodes); } SimpleNodeSelector simpleNodeSelector = new SimpleNodeSelector( @@ -236,7 +238,7 @@ public NodeSelector createNodeSelector(Session session, ConnectorId connectorId, maxPendingSplitsWeightPerTask, maxUnacknowledgedSplitsPerTask, maxTasksPerStage, - nodeSelectionHashStrategy); + maxPreferredNodes); if (resourceAwareSchedulingStrategy == TTL) { return new SimpleTtlNodeSelector( diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeSchedulerConfig.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeSchedulerConfig.java index 0ce9aa57f9d1..1bc0af2e4ccc 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeSchedulerConfig.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/NodeSchedulerConfig.java @@ -40,6 +40,7 @@ public static class NetworkTopologyType private NodeSelectionHashStrategy nodeSelectionHashStrategy = NodeSelectionHashStrategy.MODULAR_HASHING; private int minVirtualNodeCount = 1000; private ResourceAwareSchedulingStrategy resourceAwareSchedulingStrategy = ResourceAwareSchedulingStrategy.RANDOM; + private int maxPreferredNodes = 2; @NotNull public String getNetworkTopology() @@ -160,6 +161,19 @@ public NodeSchedulerConfig setResourceAwareSchedulingStrategy(ResourceAwareSched return this; } + @Min(1) + public int getMaxPreferredNodes() + { + return maxPreferredNodes; + } + + @Config("node-scheduler.max-preferred-nodes") + public NodeSchedulerConfig setMaxPreferredNodes(int maxPreferredNodes) + { + this.maxPreferredNodes = maxPreferredNodes; + return this; + } + public enum ResourceAwareSchedulingStrategy { RANDOM, diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/SimpleNodeSelector.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/SimpleNodeSelector.java index 8d63106386a6..a7205852ea4f 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/SimpleNodeSelector.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/SimpleNodeSelector.java @@ -18,10 +18,8 @@ import com.facebook.presto.execution.RemoteTask; import com.facebook.presto.execution.scheduler.BucketNodeMap; import com.facebook.presto.execution.scheduler.InternalNodeInfo; -import com.facebook.presto.execution.scheduler.ModularHashingNodeProvider; import com.facebook.presto.execution.scheduler.NodeAssignmentStats; import com.facebook.presto.execution.scheduler.NodeMap; -import com.facebook.presto.execution.scheduler.NodeSelectionHashStrategy; import com.facebook.presto.execution.scheduler.SplitPlacementResult; import com.facebook.presto.metadata.InternalNode; import com.facebook.presto.metadata.InternalNodeManager; @@ -53,7 +51,6 @@ import static com.facebook.presto.execution.scheduler.NodeScheduler.selectExactNodes; import static com.facebook.presto.execution.scheduler.NodeScheduler.selectNodes; import static com.facebook.presto.execution.scheduler.NodeScheduler.toWhenHasSplitQueueSpaceFuture; -import static com.facebook.presto.execution.scheduler.NodeSelectionHashStrategy.MODULAR_HASHING; import static com.facebook.presto.metadata.InternalNode.NodeStatus.DEAD; import static com.facebook.presto.spi.StandardErrorCode.NODE_SELECTION_NOT_SUPPORTED; import static com.facebook.presto.spi.StandardErrorCode.NO_NODES_AVAILABLE; @@ -80,7 +77,7 @@ public class SimpleNodeSelector private final long maxPendingSplitsWeightPerTask; private final int maxUnacknowledgedSplitsPerTask; private final int maxTasksPerStage; - private final NodeSelectionHashStrategy nodeSelectionHashStrategy; + private final int maxPreferredNodes; public SimpleNodeSelector( InternalNodeManager nodeManager, @@ -93,7 +90,7 @@ public SimpleNodeSelector( long maxPendingSplitsWeightPerTask, int maxUnacknowledgedSplitsPerTask, int maxTasksPerStage, - NodeSelectionHashStrategy nodeSelectionHashStrategy) + int maxPreferredNodes) { this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.nodeSelectionStats = requireNonNull(nodeSelectionStats, "nodeSelectionStats is null"); @@ -106,7 +103,7 @@ public SimpleNodeSelector( this.maxUnacknowledgedSplitsPerTask = maxUnacknowledgedSplitsPerTask; checkArgument(maxUnacknowledgedSplitsPerTask > 0, "maxUnacknowledgedSplitsPerTask must be > 0, found: %s", maxUnacknowledgedSplitsPerTask); this.maxTasksPerStage = maxTasksPerStage; - this.nodeSelectionHashStrategy = requireNonNull(nodeSelectionHashStrategy, "nodeSelectionHashStrategy is null"); + this.maxPreferredNodes = maxPreferredNodes; } @Override @@ -152,8 +149,7 @@ public SplitPlacementResult computeAssignments(Set splits, List blockedExactNodes = new HashSet<>(); boolean splitWaitingForAnyNode = false; - NodeProvider nodeProvider = nodeMap.getActiveNodeProvider(nodeSelectionHashStrategy); - + NodeProvider nodeProvider = nodeMap.getNodeProvider(maxPreferredNodes); OptionalInt preferredNodeCount = OptionalInt.empty(); for (Split split : splits) { List candidateNodes; @@ -163,10 +159,6 @@ public SplitPlacementResult computeAssignments(Set splits, Listbuilder() diff --git a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/TopologyAwareNodeSelector.java b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/TopologyAwareNodeSelector.java index 2b463620b265..a4a351cd3f77 100644 --- a/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/TopologyAwareNodeSelector.java +++ b/presto-main/src/main/java/com/facebook/presto/execution/scheduler/nodeSelection/TopologyAwareNodeSelector.java @@ -22,7 +22,6 @@ import com.facebook.presto.execution.scheduler.NetworkLocationCache; import com.facebook.presto.execution.scheduler.NodeAssignmentStats; import com.facebook.presto.execution.scheduler.NodeMap; -import com.facebook.presto.execution.scheduler.NodeSelectionHashStrategy; import com.facebook.presto.execution.scheduler.ResettableRandomizedIterator; import com.facebook.presto.execution.scheduler.SplitPlacementResult; import com.facebook.presto.metadata.InternalNode; @@ -77,7 +76,7 @@ public class TopologyAwareNodeSelector private final List topologicalSplitCounters; private final List networkLocationSegmentNames; private final NetworkLocationCache networkLocationCache; - private final NodeSelectionHashStrategy nodeSelectionHashStrategy; + private final int maxPreferredNodes; public TopologyAwareNodeSelector( InternalNodeManager nodeManager, @@ -92,7 +91,7 @@ public TopologyAwareNodeSelector( List topologicalSplitCounters, List networkLocationSegmentNames, NetworkLocationCache networkLocationCache, - NodeSelectionHashStrategy nodeSelectionHashStrategy) + int maxPreferredNodes) { this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.nodeSelectionStats = requireNonNull(nodeSelectionStats, "nodeSelectionStats is null"); @@ -107,7 +106,7 @@ public TopologyAwareNodeSelector( this.topologicalSplitCounters = requireNonNull(topologicalSplitCounters, "topologicalSplitCounters is null"); this.networkLocationSegmentNames = requireNonNull(networkLocationSegmentNames, "networkLocationSegmentNames is null"); this.networkLocationCache = requireNonNull(networkLocationCache, "networkLocationCache is null"); - this.nodeSelectionHashStrategy = requireNonNull(nodeSelectionHashStrategy, "nodeSelectionHashStrategy is null"); + this.maxPreferredNodes = maxPreferredNodes; } @Override @@ -153,8 +152,7 @@ public SplitPlacementResult computeAssignments(Set splits, List blockedExactNodes = new HashSet<>(); boolean splitWaitingForAnyNode = false; - NodeProvider nodeProvider = nodeMap.getActiveNodeProvider(nodeSelectionHashStrategy); - + NodeProvider nodeProvider = nodeMap.getNodeProvider(maxPreferredNodes); for (Split split : splits) { SplitWeight splitWeight = split.getSplitWeight(); if (split.getNodeSelectionStrategy() == HARD_AFFINITY) { diff --git a/presto-main/src/test/java/com/facebook/presto/execution/TestNodeScheduler.java b/presto-main/src/test/java/com/facebook/presto/execution/TestNodeScheduler.java index 8d841f06161d..43b3fdc50280 100644 --- a/presto-main/src/test/java/com/facebook/presto/execution/TestNodeScheduler.java +++ b/presto-main/src/test/java/com/facebook/presto/execution/TestNodeScheduler.java @@ -246,7 +246,8 @@ public void testScheduleLocal() Set splits = ImmutableSet.of(split); Map.Entry assignment = Iterables.getOnlyElement(nodeSelector.computeAssignments(splits, ImmutableList.copyOf(taskMap.values())).getAssignments().entries()); - assertEquals(assignment.getKey().getHostAndPort(), split.getPreferredNodes(new ModularHashingNodeProvider(nodeSelector.getAllNodes())).get(0)); + ModularHashingNodeProvider modularHashingNodeProvider = new ModularHashingNodeProvider(nodeSelector.getAllNodes()); + assertEquals(assignment.getKey().getHostAndPort(), split.getPreferredNodes((key) -> modularHashingNodeProvider.get(key, 3)).get(0)); assertEquals(assignment.getValue(), split); } @@ -361,10 +362,11 @@ public NetworkLocation get(HostAddress host) } unassigned = Sets.difference(unassigned, new HashSet<>(assignments.values())); assertEquals(unassigned.size(), 3); + ModularHashingNodeProvider modularHashingNodeProvider = new ModularHashingNodeProvider(nodeSelector.getAllNodes()); int rack1 = 0; int rack2 = 0; for (Split split : unassigned) { - String rack = topology.locate(split.getPreferredNodes(new ModularHashingNodeProvider(nodeSelector.getAllNodes())).get(0)).getSegments().get(0); + String rack = topology.locate(split.getPreferredNodes((key) -> modularHashingNodeProvider.get(key, 2)).get(0)).getSegments().get(0); switch (rack) { case "rack1": rack1++; @@ -1353,7 +1355,7 @@ public NodeSelectionStrategy getNodeSelectionStrategy() @Override public List getPreferredNodes(NodeProvider nodeProvider) { - return nodeProvider.get(format("split%d", scheduleIdentifierId), 1); + return nodeProvider.get(format("split%d", scheduleIdentifierId)); } @Override @@ -1393,7 +1395,7 @@ public NodeSelectionStrategy getNodeSelectionStrategy() @Override public List getPreferredNodes(NodeProvider nodeProvider) { - return nodeProvider.get(String.valueOf(new Random().nextInt()), 1); + return nodeProvider.get(String.valueOf(new Random().nextInt())); } } diff --git a/presto-main/src/test/java/com/facebook/presto/execution/TestNodeSchedulerConfig.java b/presto-main/src/test/java/com/facebook/presto/execution/TestNodeSchedulerConfig.java index 503fbccffd22..dc41f7026bdc 100644 --- a/presto-main/src/test/java/com/facebook/presto/execution/TestNodeSchedulerConfig.java +++ b/presto-main/src/test/java/com/facebook/presto/execution/TestNodeSchedulerConfig.java @@ -40,7 +40,8 @@ public void testDefaults() .setIncludeCoordinator(true) .setNodeSelectionHashStrategy(MODULAR_HASHING) .setMinVirtualNodeCount(1000) - .setResourceAwareSchedulingStrategy(RANDOM)); + .setResourceAwareSchedulingStrategy(RANDOM) + .setMaxPreferredNodes(2)); } @Test @@ -56,6 +57,7 @@ public void testExplicitPropertyMappings() .put("node-scheduler.node-selection-hash-strategy", "CONSISTENT_HASHING") .put("node-scheduler.consistent-hashing-min-virtual-node-count", "2000") .put("experimental.resource-aware-scheduling-strategy", "TTL") + .put("node-scheduler.max-preferred-nodes", "5") .build(); NodeSchedulerConfig expected = new NodeSchedulerConfig() @@ -67,7 +69,8 @@ public void testExplicitPropertyMappings() .setMinCandidates(11) .setNodeSelectionHashStrategy(CONSISTENT_HASHING) .setMinVirtualNodeCount(2000) - .setResourceAwareSchedulingStrategy(TTL); + .setResourceAwareSchedulingStrategy(TTL) + .setMaxPreferredNodes(5); ConfigAssertions.assertFullMapping(properties, expected); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/NodeProvider.java b/presto-spi/src/main/java/com/facebook/presto/spi/NodeProvider.java index eada001ae526..2b1f7701a4bb 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/NodeProvider.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/NodeProvider.java @@ -19,8 +19,7 @@ public interface NodeProvider { /** * @param identifier an unique identifier used to obtain the nodes - * @param count how many desirable nodes to be returned - * @return a list of the chosen nodes by specific hash function + * @return a list of the chosen nodes */ - List get(String identifier, int count); + List get(String identifier); }