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

网格计算

开发平台:

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.hdfs.server.namenode;
  19. import java.io.IOException;
  20. import java.util.ArrayList;
  21. import java.util.List;
  22. import org.apache.hadoop.conf.Configuration;
  23. import org.apache.hadoop.net.NetworkTopology;
  24. import org.apache.hadoop.net.Node;
  25. import org.apache.hadoop.fs.FileSystem;
  26. import org.apache.hadoop.hdfs.protocol.DatanodeID;
  27. import org.apache.hadoop.hdfs.protocol.FSConstants;
  28. import junit.framework.TestCase;
  29. public class TestReplicationPolicy extends TestCase {
  30.   private static final int BLOCK_SIZE = 1024;
  31.   private static final int NUM_OF_DATANODES = 6;
  32.   private static final Configuration CONF = new Configuration();
  33.   private static final NetworkTopology cluster;
  34.   private static NameNode namenode;
  35.   private static ReplicationTargetChooser replicator;
  36.   private static DatanodeDescriptor dataNodes[] = 
  37.     new DatanodeDescriptor[] {
  38.       new DatanodeDescriptor(new DatanodeID("h1:5020"), "/d1/r1"),
  39.       new DatanodeDescriptor(new DatanodeID("h2:5020"), "/d1/r1"),
  40.       new DatanodeDescriptor(new DatanodeID("h3:5020"), "/d1/r2"),
  41.       new DatanodeDescriptor(new DatanodeID("h4:5020"), "/d1/r2"),
  42.       new DatanodeDescriptor(new DatanodeID("h5:5020"), "/d2/r3"),
  43.       new DatanodeDescriptor(new DatanodeID("h6:5020"), "/d2/r3")
  44.     };
  45.    
  46.   private final static DatanodeDescriptor NODE = 
  47.     new DatanodeDescriptor(new DatanodeID("h7:5020"), "/d2/r4");
  48.   
  49.   static {
  50.     try {
  51.       FileSystem.setDefaultUri(CONF, "hdfs://localhost:0");
  52.       NameNode.format(CONF);
  53.       namenode = new NameNode(CONF);
  54.     } catch (IOException e) {
  55.       // TODO Auto-generated catch block
  56.       e.printStackTrace();
  57.     }
  58.     FSNamesystem fsNamesystem = FSNamesystem.getFSNamesystem();
  59.     replicator = fsNamesystem.replicator;
  60.     cluster = fsNamesystem.clusterMap;
  61.     // construct network topology
  62.     for(int i=0; i<NUM_OF_DATANODES; i++) {
  63.       cluster.add(dataNodes[i]);
  64.     }
  65.     for(int i=0; i<NUM_OF_DATANODES; i++) {
  66.       dataNodes[i].updateHeartbeat(
  67.           2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  68.           2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0);
  69.     }
  70.   }
  71.   
  72.   /**
  73.    * In this testcase, client is dataNodes[0]. So the 1st replica should be
  74.    * placed on dataNodes[0], the 2nd replica should be placed on 
  75.    * different rack and third should be placed on different node
  76.    * of rack chosen for 2nd node.
  77.    * The only excpetion is when the <i>numOfReplicas</i> is 2, 
  78.    * the 1st is on dataNodes[0] and the 2nd is on a different rack.
  79.    * @throws Exception
  80.    */
  81.   public void testChooseTarget1() throws Exception {
  82.     dataNodes[0].updateHeartbeat(
  83.         2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L, 
  84.         FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 4); // overloaded
  85.     DatanodeDescriptor[] targets;
  86.     targets = replicator.chooseTarget(
  87.                                       0, dataNodes[0], null, BLOCK_SIZE);
  88.     assertEquals(targets.length, 0);
  89.     
  90.     targets = replicator.chooseTarget(
  91.                                       1, dataNodes[0], null, BLOCK_SIZE);
  92.     assertEquals(targets.length, 1);
  93.     assertEquals(targets[0], dataNodes[0]);
  94.     
  95.     targets = replicator.chooseTarget(
  96.                                       2, dataNodes[0], null, BLOCK_SIZE);
  97.     assertEquals(targets.length, 2);
  98.     assertEquals(targets[0], dataNodes[0]);
  99.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  100.     
  101.     targets = replicator.chooseTarget(
  102.                                       3, dataNodes[0], null, BLOCK_SIZE);
  103.     assertEquals(targets.length, 3);
  104.     assertEquals(targets[0], dataNodes[0]);
  105.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  106.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]));
  107.     targets = replicator.chooseTarget(
  108.                                      4, dataNodes[0], null, BLOCK_SIZE);
  109.     assertEquals(targets.length, 4);
  110.     assertEquals(targets[0], dataNodes[0]);
  111.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]) ||
  112.                cluster.isOnSameRack(targets[2], targets[3]));
  113.     assertFalse(cluster.isOnSameRack(targets[0], targets[2]));
  114.     
  115.     dataNodes[0].updateHeartbeat(
  116.         2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  117.         FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0); 
  118.   }
  119.   /**
  120.    * In this testcase, client is dataNodes[0], but the dataNodes[1] is
  121.    * not allowed to be chosen. So the 1st replica should be
  122.    * placed on dataNodes[0], the 2nd replica should be placed on a different
  123.    * rack, the 3rd should be on same rack as the 2nd replica, and the rest
  124.    * should be placed on a third rack.
  125.    * @throws Exception
  126.    */
  127.   public void testChooseTarget2() throws Exception { 
  128.     List<Node> excludedNodes;
  129.     DatanodeDescriptor[] targets;
  130.     
  131.     excludedNodes = new ArrayList<Node>();
  132.     excludedNodes.add(dataNodes[1]); 
  133.     targets = replicator.chooseTarget(
  134.                                       0, dataNodes[0], excludedNodes, BLOCK_SIZE);
  135.     assertEquals(targets.length, 0);
  136.     
  137.     excludedNodes.clear();
  138.     excludedNodes.add(dataNodes[1]); 
  139.     targets = replicator.chooseTarget(
  140.                                       1, dataNodes[0], excludedNodes, BLOCK_SIZE);
  141.     assertEquals(targets.length, 1);
  142.     assertEquals(targets[0], dataNodes[0]);
  143.     
  144.     excludedNodes.clear();
  145.     excludedNodes.add(dataNodes[1]); 
  146.     targets = replicator.chooseTarget(
  147.                                       2, dataNodes[0], excludedNodes, BLOCK_SIZE);
  148.     assertEquals(targets.length, 2);
  149.     assertEquals(targets[0], dataNodes[0]);
  150.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  151.     
  152.     excludedNodes.clear();
  153.     excludedNodes.add(dataNodes[1]); 
  154.     targets = replicator.chooseTarget(
  155.                                       3, dataNodes[0], excludedNodes, BLOCK_SIZE);
  156.     assertEquals(targets.length, 3);
  157.     assertEquals(targets[0], dataNodes[0]);
  158.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  159.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]));
  160.     
  161.     excludedNodes.clear();
  162.     excludedNodes.add(dataNodes[1]); 
  163.     targets = replicator.chooseTarget(
  164.                                       4, dataNodes[0], excludedNodes, BLOCK_SIZE);
  165.     assertEquals(targets.length, 4);
  166.     assertEquals(targets[0], dataNodes[0]);
  167.     for(int i=1; i<4; i++) {
  168.       assertFalse(cluster.isOnSameRack(targets[0], targets[i]));
  169.     }
  170.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]) ||
  171.                cluster.isOnSameRack(targets[2], targets[3]));
  172.     assertFalse(cluster.isOnSameRack(targets[1], targets[3]));
  173.   }
  174.   /**
  175.    * In this testcase, client is dataNodes[0], but dataNodes[0] is not qualified
  176.    * to be chosen. So the 1st replica should be placed on dataNodes[1], 
  177.    * the 2nd replica should be placed on a different rack,
  178.    * the 3rd replica should be placed on the same rack as the 2nd replica,
  179.    * and the rest should be placed on the third rack.
  180.    * @throws Exception
  181.    */
  182.   public void testChooseTarget3() throws Exception {
  183.     // make data node 0 to be not qualified to choose
  184.     dataNodes[0].updateHeartbeat(
  185.         2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  186.         (FSConstants.MIN_BLOCKS_FOR_WRITE-1)*BLOCK_SIZE, 0); // no space
  187.         
  188.     DatanodeDescriptor[] targets;
  189.     targets = replicator.chooseTarget(
  190.                                       0, dataNodes[0], null, BLOCK_SIZE);
  191.     assertEquals(targets.length, 0);
  192.     
  193.     targets = replicator.chooseTarget(
  194.                                       1, dataNodes[0], null, BLOCK_SIZE);
  195.     assertEquals(targets.length, 1);
  196.     assertEquals(targets[0], dataNodes[1]);
  197.     
  198.     targets = replicator.chooseTarget(
  199.                                       2, dataNodes[0], null, BLOCK_SIZE);
  200.     assertEquals(targets.length, 2);
  201.     assertEquals(targets[0], dataNodes[1]);
  202.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  203.     
  204.     targets = replicator.chooseTarget(
  205.                                       3, dataNodes[0], null, BLOCK_SIZE);
  206.     assertEquals(targets.length, 3);
  207.     assertEquals(targets[0], dataNodes[1]);
  208.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]));
  209.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  210.     
  211.     targets = replicator.chooseTarget(
  212.                                       4, dataNodes[0], null, BLOCK_SIZE);
  213.     assertEquals(targets.length, 4);
  214.     assertEquals(targets[0], dataNodes[1]);
  215.     for(int i=1; i<4; i++) {
  216.       assertFalse(cluster.isOnSameRack(targets[0], targets[i]));
  217.     }
  218.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]) ||
  219.                cluster.isOnSameRack(targets[2], targets[3]));
  220.     assertFalse(cluster.isOnSameRack(targets[1], targets[3]));
  221.     dataNodes[0].updateHeartbeat(
  222.         2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  223.         FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0); 
  224.   }
  225.   
  226.   /**
  227.    * In this testcase, client is dataNodes[0], but none of the nodes on rack 1
  228.    * is qualified to be chosen. So the 1st replica should be placed on either
  229.    * rack 2 or rack 3. 
  230.    * the 2nd replica should be placed on a different rack,
  231.    * the 3rd replica should be placed on the same rack as the 1st replica,
  232.    * @throws Exception
  233.    */
  234.   public void testChoooseTarget4() throws Exception {
  235.     // make data node 0 & 1 to be not qualified to choose: not enough disk space
  236.     for(int i=0; i<2; i++) {
  237.       dataNodes[i].updateHeartbeat(
  238.           2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  239.           (FSConstants.MIN_BLOCKS_FOR_WRITE-1)*BLOCK_SIZE, 0);
  240.     }
  241.       
  242.     DatanodeDescriptor[] targets;
  243.     targets = replicator.chooseTarget(
  244.                                       0, dataNodes[0], null, BLOCK_SIZE);
  245.     assertEquals(targets.length, 0);
  246.     
  247.     targets = replicator.chooseTarget(
  248.                                       1, dataNodes[0], null, BLOCK_SIZE);
  249.     assertEquals(targets.length, 1);
  250.     assertFalse(cluster.isOnSameRack(targets[0], dataNodes[0]));
  251.     
  252.     targets = replicator.chooseTarget(
  253.                                       2, dataNodes[0], null, BLOCK_SIZE);
  254.     assertEquals(targets.length, 2);
  255.     assertFalse(cluster.isOnSameRack(targets[0], dataNodes[0]));
  256.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  257.     
  258.     targets = replicator.chooseTarget(
  259.                                       3, dataNodes[0], null, BLOCK_SIZE);
  260.     assertEquals(targets.length, 3);
  261.     for(int i=0; i<3; i++) {
  262.       assertFalse(cluster.isOnSameRack(targets[i], dataNodes[0]));
  263.     }
  264.     assertTrue(cluster.isOnSameRack(targets[0], targets[1]) ||
  265.                cluster.isOnSameRack(targets[1], targets[2]));
  266.     assertFalse(cluster.isOnSameRack(targets[0], targets[2]));
  267.     
  268.     for(int i=0; i<2; i++) {
  269.       dataNodes[i].updateHeartbeat(
  270.           2*FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0L,
  271.           FSConstants.MIN_BLOCKS_FOR_WRITE*BLOCK_SIZE, 0);
  272.     }
  273.   }
  274.   /**
  275.    * In this testcase, client is is a node outside of file system.
  276.    * So the 1st replica can be placed on any node. 
  277.    * the 2nd replica should be placed on a different rack,
  278.    * the 3rd replica should be placed on the same rack as the 2nd replica,
  279.    * @throws Exception
  280.    */
  281.   public void testChooseTarget5() throws Exception {
  282.     DatanodeDescriptor[] targets;
  283.     targets = replicator.chooseTarget(
  284.                                       0, NODE, null, BLOCK_SIZE);
  285.     assertEquals(targets.length, 0);
  286.     
  287.     targets = replicator.chooseTarget(
  288.                                       1, NODE, null, BLOCK_SIZE);
  289.     assertEquals(targets.length, 1);
  290.     
  291.     targets = replicator.chooseTarget(
  292.                                       2, NODE, null, BLOCK_SIZE);
  293.     assertEquals(targets.length, 2);
  294.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  295.     
  296.     targets = replicator.chooseTarget(
  297.                                       3, NODE, null, BLOCK_SIZE);
  298.     assertEquals(targets.length, 3);
  299.     assertTrue(cluster.isOnSameRack(targets[1], targets[2]));
  300.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));    
  301.   }
  302.   
  303.   /**
  304.    * This testcase tests re-replication, when dataNodes[0] is already chosen.
  305.    * So the 1st replica can be placed on random rack. 
  306.    * the 2nd replica should be placed on different node by same rack as 
  307.    * the 1st replica. The 3rd replica can be placed randomly.
  308.    * @throws Exception
  309.    */
  310.   public void testRereplicate1() throws Exception {
  311.     List<DatanodeDescriptor> chosenNodes = new ArrayList<DatanodeDescriptor>();
  312.     chosenNodes.add(dataNodes[0]);    
  313.     DatanodeDescriptor[] targets;
  314.     
  315.     targets = replicator.chooseTarget(
  316.                                       0, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  317.     assertEquals(targets.length, 0);
  318.     
  319.     targets = replicator.chooseTarget(
  320.                                       1, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  321.     assertEquals(targets.length, 1);
  322.     assertFalse(cluster.isOnSameRack(dataNodes[0], targets[0]));
  323.     
  324.     targets = replicator.chooseTarget(
  325.                                       2, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  326.     assertEquals(targets.length, 2);
  327.     assertTrue(cluster.isOnSameRack(dataNodes[0], targets[0]));
  328.     assertFalse(cluster.isOnSameRack(targets[0], targets[1]));
  329.     
  330.     targets = replicator.chooseTarget(
  331.                                       3, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  332.     assertEquals(targets.length, 3);
  333.     assertTrue(cluster.isOnSameRack(dataNodes[0], targets[0]));
  334.     assertFalse(cluster.isOnSameRack(targets[0], targets[2]));
  335.   }
  336.   /**
  337.    * This testcase tests re-replication, 
  338.    * when dataNodes[0] and dataNodes[1] are already chosen.
  339.    * So the 1st replica should be placed on a different rack than rack 1. 
  340.    * the rest replicas can be placed randomly,
  341.    * @throws Exception
  342.    */
  343.   public void testRereplicate2() throws Exception {
  344.     List<DatanodeDescriptor> chosenNodes = new ArrayList<DatanodeDescriptor>();
  345.     chosenNodes.add(dataNodes[0]);
  346.     chosenNodes.add(dataNodes[1]);
  347.     DatanodeDescriptor[] targets;
  348.     targets = replicator.chooseTarget(
  349.                                       0, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  350.     assertEquals(targets.length, 0);
  351.     
  352.     targets = replicator.chooseTarget(
  353.                                       1, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  354.     assertEquals(targets.length, 1);
  355.     assertFalse(cluster.isOnSameRack(dataNodes[0], targets[0]));
  356.     
  357.     targets = replicator.chooseTarget(
  358.                                       2, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  359.     assertEquals(targets.length, 2);
  360.     assertFalse(cluster.isOnSameRack(dataNodes[0], targets[0]));
  361.     assertFalse(cluster.isOnSameRack(dataNodes[0], targets[1]));
  362.   }
  363.   /**
  364.    * This testcase tests re-replication, 
  365.    * when dataNodes[0] and dataNodes[2] are already chosen.
  366.    * So the 1st replica should be placed on the rack that the writer resides. 
  367.    * the rest replicas can be placed randomly,
  368.    * @throws Exception
  369.    */
  370.   public void testRereplicate3() throws Exception {
  371.     List<DatanodeDescriptor> chosenNodes = new ArrayList<DatanodeDescriptor>();
  372.     chosenNodes.add(dataNodes[0]);
  373.     chosenNodes.add(dataNodes[2]);
  374.     
  375.     DatanodeDescriptor[] targets;
  376.     targets = replicator.chooseTarget(
  377.                                       0, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  378.     assertEquals(targets.length, 0);
  379.     
  380.     targets = replicator.chooseTarget(
  381.                                       1, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  382.     assertEquals(targets.length, 1);
  383.     assertTrue(cluster.isOnSameRack(dataNodes[0], targets[0]));
  384.     assertFalse(cluster.isOnSameRack(dataNodes[2], targets[0]));
  385.     
  386.     targets = replicator.chooseTarget(
  387.                                1, dataNodes[2], chosenNodes, null, BLOCK_SIZE);
  388.     assertEquals(targets.length, 1);
  389.     assertTrue(cluster.isOnSameRack(dataNodes[2], targets[0]));
  390.     assertFalse(cluster.isOnSameRack(dataNodes[0], targets[0]));
  391.     targets = replicator.chooseTarget(
  392.                                       2, dataNodes[0], chosenNodes, null, BLOCK_SIZE);
  393.     assertEquals(targets.length, 2);
  394.     assertTrue(cluster.isOnSameRack(dataNodes[0], targets[0]));
  395.     
  396.     targets = replicator.chooseTarget(
  397.                                2, dataNodes[2], chosenNodes, null, BLOCK_SIZE);
  398.     assertEquals(targets.length, 2);
  399.     assertTrue(cluster.isOnSameRack(dataNodes[2], targets[0]));
  400.   }
  401.   
  402. }