use of voldemort.store.routed.PutPipelineData in project voldemort by voldemort.
the class AbstractConfigureNodes method getNodes.
protected List<Node> getNodes(ByteArray key) {
List<Node> nodes = new ArrayList<Node>();
pipelineData.setReplicationSet(routingStrategy.routeRequest(key.get()));
// raise an error if no server has any partitions defined
if (pipelineData.getReplicationSet().size() == 0) {
throw new IllegalArgumentException("All servers configured with no partitions");
}
for (Node node : pipelineData.getReplicationSet()) {
if (failureDetector.isAvailable(node))
nodes.add(node);
else {
if (pipelineData instanceof PutPipelineData) {
((PutPipelineData) pipelineData).getSynchronizer().tryDelegateSlop(node);
}
pipelineData.addFailedNode(node);
if (logger.isDebugEnabled()) {
logger.debug("Key " + ByteUtils.toHexString(key.get()) + " Node " + node.getId() + " down");
}
}
}
if (nodes.size() < required) {
List<Integer> failedNodes = new ArrayList<Integer>();
List<Integer> allNodes = new ArrayList<Integer>();
for (Node node : pipelineData.getReplicationSet()) {
allNodes.add(node.getId());
}
for (Node node : pipelineData.getFailedNodes()) {
failedNodes.add(node.getId());
}
String errorMessage = "Only " + nodes.size() + " nodes up in preference list" + ", but " + required + " required. Replication set: " + allNodes + "Nodes down: " + failedNodes;
if (logger.isDebugEnabled()) {
logger.debug(errorMessage);
}
throw new InsufficientOperationalNodesException(errorMessage);
}
return nodes;
}
Aggregations