/* * Copyright 2008-2009 LinkedIn, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package voldemort.store.routed.action; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import voldemort.VoldemortException; import voldemort.cluster.Node; import voldemort.cluster.failuredetector.FailureDetector; import voldemort.routing.RoutingStrategy; import voldemort.store.routed.BasicPipelineData; import voldemort.store.routed.Pipeline.Event; import voldemort.utils.ByteArray; /** * Use the default node list returned via the routing strategy. However give * preference to the current node, if it is part of the preflist returned from * the routing strategy. */ public class ConfigureNodesLocalHost<V, PD extends BasicPipelineData<V>> extends ConfigureNodesDefault<V, PD> { @SuppressWarnings("hiding") private final Logger logger = Logger.getLogger(this.getClass()); public ConfigureNodesLocalHost(PD pipelineData, Event completeEvent, FailureDetector failureDetector, int required, RoutingStrategy routingStrategy, ByteArray key) { super(pipelineData, completeEvent, failureDetector, required, routingStrategy, key); } /* * If the current node exists in the nodes list, bring it to the front */ @Override public List<Node> getNodes(ByteArray key) { logger.debug("Giving pref to localhost ! "); List<Node> nodes = null; List<Node> reorderedNodes = new ArrayList<Node>(); try { nodes = super.getNodes(key); if(nodes == null) { return null; } String currentHost = InetAddress.getLocalHost().getHostName(); for(Node n: nodes) { if(currentHost.contains(n.getHost()) || n.getHost().contains(currentHost)) { logger.debug("Found localhost ! "); reorderedNodes.add(n); nodes.remove(n); break; } } reorderedNodes.addAll(nodes); nodes = reorderedNodes; } catch(VoldemortException e) { pipelineData.setFatalError(e); return null; } catch(UnknownHostException e) { e.printStackTrace(); return null; } return nodes; } }