try { loc = NodeBase.normalize(loc); Node locNode = getNode(loc); if (locNode instanceof InnerNodeWithNodeGroup) { InnerNodeWithNodeGroup node = (InnerNodeWithNodeGroup) locNode; return getNodeGroup(node.getNetworkLocation()); } else { return NodeBase.ROOT;
@Override protected int getWeight(Node reader, Node node) { // 0 is local, 1 is same node group, 2 is same rack, 3 is off rack // Start off by initializing to off rack int weight = 3; if (reader != null) { if (reader.equals(node)) { weight = 0; } else if (isOnSameNodeGroup(reader, node)) { weight = 1; } else if (isOnSameRack(reader, node)) { weight = 2; } } return weight; }
/** * Sort nodes array by their distances to <i>reader</i>. * <p/> * This is the same as {@link NetworkTopology#sortByDistance(Node, Node[], * int)} except with a four-level network topology which contains the * additional network distance of a "node group" which is between local and * same rack. * * @param reader Node where data will be read * @param nodes Available replicas with the requested data * @param activeLen Number of active nodes at the front of the array */ @Override public void sortByDistance(Node reader, Node[] nodes, int activeLen) { // If reader is not a datanode (not in NetworkTopology tree), we need to // replace this reader with a sibling leaf node in tree. if (reader != null && !this.contains(reader)) { Node nodeGroup = getNode(reader.getNetworkLocation()); if (nodeGroup != null && nodeGroup instanceof InnerNode) { InnerNode parentNode = (InnerNode) nodeGroup; // replace reader with the first children of its parent in tree reader = parentNode.getLeaf(0, null); } else { return; } } super.sortByDistance(reader, nodes, activeLen); }
try { if (clusterMap.remove(node)) { Node nodeGroup = getNode(node.getNetworkLocation()); if (nodeGroup == null) { nodeGroup = factory.newInnerNode(node.getNetworkLocation()); InnerNode rack = (InnerNode)getNode(nodeGroup.getNetworkLocation()); if (rack == null) { numOfRacks--; LOG.debug("NetworkTopology became:\n" + this.toString());
public void pseudoSortByDistance( Node reader, Node[] nodes ) { if (reader != null && !this.contains(reader)) { Node nodeGroup = getNode(reader.getNetworkLocation()); if (nodeGroup != null && nodeGroup instanceof InnerNode) { InnerNode parentNode = (InnerNode) nodeGroup; swap(nodes, tempIndex, i); } else if (localNodeGroupNode == -1 && isOnSameNodeGroup(reader, nodes[i])) { } else if (localRackNode == -1 && isOnSameRack(reader, nodes[i])) { localRackNode = i; if (tempIndex != 0 && localNodeGroupNode != -1) break; swap(nodes, tempIndex, localNodeGroupNode); if (localRackNode == tempIndex) { localRackNode = localNodeGroupNode; swap(nodes, tempIndex, localRackNode); tempIndex++; swap(nodes, 0, r.nextInt(nodes.length));
NetworkTopologyWithNodeGroup.DEFAULT_NODEGROUP); Node nodeGroup = getNode(node.getNetworkLocation()); if (nodeGroup == null) { nodeGroup = new InnerNodeWithNodeGroup(node.getNetworkLocation()); rack = getNode(nodeGroup.getNetworkLocation()); if (rack == null) { incrementRacks(); LOG.debug("NetworkTopology became:\n" + this.toString());
clusterMapNodeGroup.getNodeGroup(favoredNode.getNetworkLocation()); try { target =
/** * Check if two nodes are on the same node group (hypervisor) The * assumption here is: each nodes are leaf nodes. * * @param node1 * one node (can be null) * @param node2 * another node (can be null) * @return true if node1 and node2 are on the same node group; false * otherwise * @exception IllegalArgumentException * when either node1 or node2 is null, or node1 or node2 do * not belong to the cluster */ @Override public boolean isOnSameNodeGroup(Node node1, Node node2) { if (node1 == null || node2 == null) { return false; } netlock.readLock().lock(); try { return isSameParents(node1, node2); } finally { netlock.readLock().unlock(); } }
@Override public String getRack(String loc) { netlock.readLock().lock(); try { loc = NodeBase.normalize(loc); Node locNode = getNode(loc); if (locNode instanceof InnerNodeWithNodeGroup) { InnerNodeWithNodeGroup node = (InnerNodeWithNodeGroup) locNode; if (node.isRack()) { return loc; } else if (node.isNodeGroup()) { return node.getNetworkLocation(); } else { // may be a data center return null; } } else { // not in cluster map, don't handle it return loc; } } finally { netlock.readLock().unlock(); } }
@Test public void testNodeGroups() throws Exception { assertEquals(3, cluster.getNumOfRacks()); assertTrue(cluster.isOnSameNodeGroup(dataNodes[0], dataNodes[1])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[1], dataNodes[2])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[2], dataNodes[3])); assertTrue(cluster.isOnSameNodeGroup(dataNodes[3], dataNodes[4])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[4], dataNodes[5])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[5], dataNodes[6])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[6], dataNodes[7])); }
@Test public void testRacks() throws Exception { assertEquals(3, cluster.getNumOfRacks()); assertTrue(cluster.isOnSameRack(dataNodes[0], dataNodes[1])); assertTrue(cluster.isOnSameRack(dataNodes[1], dataNodes[2])); assertFalse(cluster.isOnSameRack(dataNodes[2], dataNodes[3])); assertTrue(cluster.isOnSameRack(dataNodes[3], dataNodes[4])); assertTrue(cluster.isOnSameRack(dataNodes[4], dataNodes[5])); assertFalse(cluster.isOnSameRack(dataNodes[5], dataNodes[6])); assertTrue(cluster.isOnSameRack(dataNodes[6], dataNodes[7])); }
NetworkTopologyWithNodeGroup.DEFAULT_NODEGROUP); Node nodeGroup = getNode(node.getNetworkLocation()); if (nodeGroup == null) { nodeGroup = new InnerNodeWithNodeGroup(node.getNetworkLocation()); rack = getNode(nodeGroup.getNetworkLocation()); if (rack == null) { incrementRacks(); LOG.debug("NetworkTopology became:\n" + this.toString());
try { if (clusterMap.remove(node)) { Node nodeGroup = getNode(node.getNetworkLocation()); if (nodeGroup == null) { nodeGroup = new InnerNode(node.getNetworkLocation()); InnerNode rack = (InnerNode)getNode(nodeGroup.getNetworkLocation()); if (rack == null) { numOfRacks--; LOG.debug("NetworkTopology became:\n" + this.toString());
clusterMap.getNodeGroup(localMachine.getNetworkLocation()), excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes); try { return chooseRandom( clusterMap.getNodeGroup(newLocal.getNetworkLocation()), excludedNodes, blocksize, maxNodesPerRack, results, avoidStaleNodes, storageTypes);
@Override public boolean isOnSameRack( Node node1, Node node2) { if (node1 == null || node2 == null || node1.getParent() == null || node2.getParent() == null) { return false; } netlock.readLock().lock(); try { return isSameParents(node1.getParent(), node2.getParent()); } finally { netlock.readLock().unlock(); } }
@Override protected Node getNodeForNetworkLocation(Node node) { // if node only with default rack info, here we need to add default // nodegroup info if (NetworkTopology.DEFAULT_RACK.equals(node.getNetworkLocation())) { node.setNetworkLocation(node.getNetworkLocation() + DEFAULT_NODEGROUP); } Node nodeGroup = getNode(node.getNetworkLocation()); if (nodeGroup == null) { nodeGroup = new InnerNodeWithNodeGroup(node.getNetworkLocation()); } return getNode(nodeGroup.getNetworkLocation()); }
@Test public void testNodeGroups() throws Exception { assertEquals(3, cluster.getNumOfRacks()); assertTrue(cluster.isOnSameNodeGroup(dataNodes[0], dataNodes[1])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[1], dataNodes[2])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[2], dataNodes[3])); assertTrue(cluster.isOnSameNodeGroup(dataNodes[3], dataNodes[4])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[4], dataNodes[5])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[5], dataNodes[6])); assertFalse(cluster.isOnSameNodeGroup(dataNodes[6], dataNodes[7])); }
@Test public void testRacks() throws Exception { assertEquals(3, cluster.getNumOfRacks()); assertTrue(cluster.isOnSameRack(dataNodes[0], dataNodes[1])); assertTrue(cluster.isOnSameRack(dataNodes[1], dataNodes[2])); assertFalse(cluster.isOnSameRack(dataNodes[2], dataNodes[3])); assertTrue(cluster.isOnSameRack(dataNodes[3], dataNodes[4])); assertTrue(cluster.isOnSameRack(dataNodes[4], dataNodes[5])); assertFalse(cluster.isOnSameRack(dataNodes[5], dataNodes[6])); assertTrue(cluster.isOnSameRack(dataNodes[6], dataNodes[7])); }
try { loc = InnerNode.normalize(loc); Node locNode = getNode(loc); if (locNode instanceof InnerNodeWithNodeGroup) { InnerNodeWithNodeGroup node = (InnerNodeWithNodeGroup) locNode; return getNodeGroup(node.getNetworkLocation()); } else { return NodeBase.ROOT;
@Override protected int getWeight(Node reader, Node node) { // 0 is local, 1 is same node group, 2 is same rack, 3 is off rack // Start off by initializing to off rack int weight = 3; if (reader != null) { if (reader.equals(node)) { weight = 0; } else if (isOnSameNodeGroup(reader, node)) { weight = 1; } else if (isOnSameRack(reader, node)) { weight = 2; } } return weight; }