TestNetworkTopology.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:6k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.net;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. import junit.framework.TestCase;
  22. import org.apache.hadoop.hdfs.server.namenode.DatanodeDescriptor;
  23. import org.apache.hadoop.hdfs.protocol.DatanodeID;
  24. public class TestNetworkTopology extends TestCase {
  25.   private final static NetworkTopology cluster = new NetworkTopology();
  26.   private final static DatanodeDescriptor dataNodes[] = new DatanodeDescriptor[] {
  27.     new DatanodeDescriptor(new DatanodeID("h1:5020"), "/d1/r1"),
  28.     new DatanodeDescriptor(new DatanodeID("h2:5020"), "/d1/r1"),
  29.     new DatanodeDescriptor(new DatanodeID("h3:5020"), "/d1/r2"),
  30.     new DatanodeDescriptor(new DatanodeID("h4:5020"), "/d1/r2"),
  31.     new DatanodeDescriptor(new DatanodeID("h5:5020"), "/d1/r2"),
  32.     new DatanodeDescriptor(new DatanodeID("h6:5020"), "/d2/r3"),
  33.     new DatanodeDescriptor(new DatanodeID("h7:5020"), "/d2/r3")
  34.   };
  35.   private final static DatanodeDescriptor NODE = 
  36.     new DatanodeDescriptor(new DatanodeID("h8:5020"), "/d2/r4");
  37.   
  38.   static {
  39.     for(int i=0; i<dataNodes.length; i++) {
  40.       cluster.add(dataNodes[i]);
  41.     }
  42.   }
  43.   
  44.   public void testContains() throws Exception {
  45.     for(int i=0; i<dataNodes.length; i++) {
  46.       assertTrue(cluster.contains(dataNodes[i]));
  47.     }
  48.     assertFalse(cluster.contains(NODE));
  49.   }
  50.   
  51.   public void testNumOfChildren() throws Exception {
  52.     assertEquals(cluster.getNumOfLeaves(), dataNodes.length);
  53.   }
  54.   public void testRacks() throws Exception {
  55.     assertEquals(cluster.getNumOfRacks(), 3);
  56.     assertTrue(cluster.isOnSameRack(dataNodes[0], dataNodes[1]));
  57.     assertFalse(cluster.isOnSameRack(dataNodes[1], dataNodes[2]));
  58.     assertTrue(cluster.isOnSameRack(dataNodes[2], dataNodes[3]));
  59.     assertTrue(cluster.isOnSameRack(dataNodes[3], dataNodes[4]));
  60.     assertFalse(cluster.isOnSameRack(dataNodes[4], dataNodes[5]));
  61.     assertTrue(cluster.isOnSameRack(dataNodes[5], dataNodes[6]));
  62.   }
  63.   
  64.   public void testGetDistance() throws Exception {
  65.     assertEquals(cluster.getDistance(dataNodes[0], dataNodes[0]), 0);
  66.     assertEquals(cluster.getDistance(dataNodes[0], dataNodes[1]), 2);
  67.     assertEquals(cluster.getDistance(dataNodes[0], dataNodes[3]), 4);
  68.     assertEquals(cluster.getDistance(dataNodes[0], dataNodes[6]), 6);
  69.   }
  70.   public void testPseudoSortByDistance() throws Exception {
  71.     DatanodeDescriptor[] testNodes = new DatanodeDescriptor[3];
  72.     
  73.     // array contains both local node & local rack node
  74.     testNodes[0] = dataNodes[1];
  75.     testNodes[1] = dataNodes[2];
  76.     testNodes[2] = dataNodes[0];
  77.     cluster.pseudoSortByDistance(dataNodes[0], testNodes );
  78.     assertTrue(testNodes[0] == dataNodes[0]);
  79.     assertTrue(testNodes[1] == dataNodes[1]);
  80.     assertTrue(testNodes[2] == dataNodes[2]);
  81.     // array contains local node
  82.     testNodes[0] = dataNodes[1];
  83.     testNodes[1] = dataNodes[3];
  84.     testNodes[2] = dataNodes[0];
  85.     cluster.pseudoSortByDistance(dataNodes[0], testNodes );
  86.     assertTrue(testNodes[0] == dataNodes[0]);
  87.     assertTrue(testNodes[1] == dataNodes[1]);
  88.     assertTrue(testNodes[2] == dataNodes[3]);
  89.     // array contains local rack node
  90.     testNodes[0] = dataNodes[5];
  91.     testNodes[1] = dataNodes[3];
  92.     testNodes[2] = dataNodes[1];
  93.     cluster.pseudoSortByDistance(dataNodes[0], testNodes );
  94.     assertTrue(testNodes[0] == dataNodes[1]);
  95.     assertTrue(testNodes[1] == dataNodes[3]);
  96.     assertTrue(testNodes[2] == dataNodes[5]);
  97.   }
  98.   
  99.   public void testRemove() throws Exception {
  100.     for(int i=0; i<dataNodes.length; i++) {
  101.       cluster.remove(dataNodes[i]);
  102.     }
  103.     for(int i=0; i<dataNodes.length; i++) {
  104.       assertFalse(cluster.contains(dataNodes[i]));
  105.     }
  106.     assertEquals(0, cluster.getNumOfLeaves());
  107.     for(int i=0; i<dataNodes.length; i++) {
  108.       cluster.add(dataNodes[i]);
  109.     }
  110.   }
  111.   
  112.   /**
  113.    * This picks a large number of nodes at random in order to ensure coverage
  114.    * 
  115.    * @param numNodes the number of nodes
  116.    * @param excludedScope the excluded scope
  117.    * @return the frequency that nodes were chosen
  118.    */
  119.   private Map<Node, Integer> pickNodesAtRandom(int numNodes,
  120.       String excludedScope) {
  121.     Map<Node, Integer> frequency = new HashMap<Node, Integer>();
  122.     for (DatanodeDescriptor dnd : dataNodes) {
  123.       frequency.put(dnd, 0);
  124.     }
  125.     for (int j = 0; j < numNodes; j++) {
  126.       Node random = cluster.chooseRandom(excludedScope);
  127.       frequency.put(random, frequency.get(random) + 1);
  128.     }
  129.     return frequency;
  130.   }
  131.   /**
  132.    * This test checks that chooseRandom works for an excluded node.
  133.    */
  134.   public void testChooseRandomExcludedNode() {
  135.     String scope = "~" + NodeBase.getPath(dataNodes[0]);
  136.     Map<Node, Integer> frequency = pickNodesAtRandom(100, scope);
  137.     for (Node key : dataNodes) {
  138.       // all nodes except the first should be more than zero
  139.       assertTrue(frequency.get(key) > 0 || key == dataNodes[0]);
  140.     }
  141.   }
  142.   /**
  143.    * This test checks that chooseRandom works for an excluded rack.
  144.    */
  145.   public void testChooseRandomExcludedRack() {
  146.     Map<Node, Integer> frequency = pickNodesAtRandom(100, "~" + "/d2");
  147.     // all the nodes on the second rack should be zero
  148.     for (int j = 0; j < dataNodes.length; j++) {
  149.       int freq = frequency.get(dataNodes[j]);
  150.       if (dataNodes[j].getNetworkLocation().startsWith("/d2")) {
  151.         assertEquals(0, freq);
  152.       } else {
  153.         assertTrue(freq > 0);
  154.       }
  155.     }
  156.   }
  157. }