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

网格计算

开发平台:

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.common;
  19. import java.io.IOException;
  20. import junit.framework.TestCase;
  21. import org.apache.commons.logging.Log;
  22. import org.apache.commons.logging.LogFactory;
  23. import org.apache.hadoop.conf.Configuration;
  24. import static org.apache.hadoop.hdfs.protocol.FSConstants.LAYOUT_VERSION;
  25. import org.apache.hadoop.hdfs.MiniDFSCluster;
  26. import org.apache.hadoop.hdfs.TestDFSUpgradeFromImage;
  27. import org.apache.hadoop.hdfs.server.common.HdfsConstants.StartupOption;
  28. import org.apache.hadoop.hdfs.server.datanode.UpgradeObjectDatanode;
  29. import org.apache.hadoop.hdfs.server.namenode.UpgradeObjectNamenode;
  30. import org.apache.hadoop.hdfs.server.protocol.UpgradeCommand;
  31. import org.apache.hadoop.hdfs.tools.DFSAdmin;
  32. /**
  33.  */
  34. public class TestDistributedUpgrade extends TestCase {
  35.   private static final Log LOG = LogFactory.getLog(TestDistributedUpgrade.class);
  36.   private Configuration conf;
  37.   private int testCounter = 0;
  38.   private MiniDFSCluster cluster = null;
  39.     
  40.   /**
  41.    * Writes an INFO log message containing the parameters.
  42.    */
  43.   void log(String label, int numDirs) {
  44.     LOG.info("============================================================");
  45.     LOG.info("***TEST " + (testCounter++) + "*** " 
  46.              + label + ":"
  47.              + " numDirs="+numDirs);
  48.   }
  49.   
  50.   /**
  51.    * Attempts to start a NameNode with the given operation.  Starting
  52.    * the NameNode should throw an exception.
  53.    */
  54.   void startNameNodeShouldFail(StartupOption operation) {
  55.     try {
  56.       //cluster = new MiniDFSCluster(conf, 0, operation); // should fail
  57.       // we set manage dirs to true as NN has to start from untar'ed image with 
  58.       // nn dirs set to name1 and name2
  59.       cluster = new MiniDFSCluster(0, conf, 0, false, true,
  60.           operation, null); // Should fail
  61.       throw new AssertionError("NameNode should have failed to start");
  62.     } catch (Exception expected) {
  63.       expected = null;
  64.       // expected
  65.     }
  66.   }
  67.   
  68.   /**
  69.    * Attempts to start a DataNode with the given operation.  Starting
  70.    * the DataNode should throw an exception.
  71.    */
  72.   void startDataNodeShouldFail(StartupOption operation) {
  73.     try {
  74.       cluster.startDataNodes(conf, 1, false, operation, null); // should fail
  75.       throw new AssertionError("DataNode should have failed to start");
  76.     } catch (Exception expected) {
  77.       // expected
  78.       assertFalse(cluster.isDataNodeUp());
  79.     }
  80.   }
  81.  
  82.   /**
  83.    */
  84.   public void testDistributedUpgrade() throws Exception {
  85.     int numDirs = 1;
  86.     TestDFSUpgradeFromImage testImg = new TestDFSUpgradeFromImage();
  87.     testImg.unpackStorage();
  88.     int numDNs = testImg.numDataNodes;
  89.     // register new upgrade objects (ignore all existing)
  90.     UpgradeObjectCollection.initialize();
  91.     UpgradeObjectCollection.registerUpgrade(new UO_Datanode1());
  92.     UpgradeObjectCollection.registerUpgrade(new UO_Namenode1());
  93.     UpgradeObjectCollection.registerUpgrade(new UO_Datanode2());
  94.     UpgradeObjectCollection.registerUpgrade(new UO_Namenode2());
  95.     UpgradeObjectCollection.registerUpgrade(new UO_Datanode3());
  96.     UpgradeObjectCollection.registerUpgrade(new UO_Namenode3());
  97.     conf = new Configuration();
  98.     if (System.getProperty("test.build.data") == null) { // to test to be run outside of ant
  99.       System.setProperty("test.build.data", "build/test/data");
  100.     }
  101.     conf.setInt("dfs.datanode.scan.period.hours", -1); // block scanning off
  102.     log("NameNode start in regular mode when dustributed upgrade is required", numDirs);
  103.     startNameNodeShouldFail(StartupOption.REGULAR);
  104.     log("Start NameNode only distributed upgrade", numDirs);
  105.     // cluster = new MiniDFSCluster(conf, 0, StartupOption.UPGRADE);
  106.     cluster = new MiniDFSCluster(0, conf, 0, false, true,
  107.                                   StartupOption.UPGRADE, null);
  108.     cluster.shutdown();
  109.     log("NameNode start in regular mode when dustributed upgrade has been started", numDirs);
  110.     startNameNodeShouldFail(StartupOption.REGULAR);
  111.     log("NameNode rollback to the old version that require a dustributed upgrade", numDirs);
  112.     startNameNodeShouldFail(StartupOption.ROLLBACK);
  113.     log("Normal distributed upgrade for the cluster", numDirs);
  114.     cluster = new MiniDFSCluster(0, conf, numDNs, false, true,
  115.                                   StartupOption.UPGRADE, null);
  116.     DFSAdmin dfsAdmin = new DFSAdmin();
  117.     dfsAdmin.setConf(conf);
  118.     dfsAdmin.run(new String[] {"-safemode", "wait"});
  119.     cluster.shutdown();
  120.     // it should be ok to start in regular mode
  121.     log("NameCluster regular startup after the upgrade", numDirs);
  122.     cluster = new MiniDFSCluster(0, conf, numDNs, false, true,
  123.                                   StartupOption.REGULAR, null);
  124.     cluster.waitActive();
  125.     cluster.shutdown();
  126.   }
  127.   public static void main(String[] args) throws Exception {
  128.     new TestDistributedUpgrade().testDistributedUpgrade();
  129.     LOG.info("=== DONE ===");
  130.   }
  131. }
  132. /**
  133.  * Upgrade object for data-node
  134.  */
  135. class UO_Datanode extends UpgradeObjectDatanode {
  136.   int version;
  137.   UO_Datanode(int v) {
  138.     this.status = (short)0;
  139.     version = v;
  140.   }
  141.   public int getVersion() {
  142.     return version;
  143.   }
  144.   public void doUpgrade() throws IOException {
  145.     this.status = (short)100;
  146.     getDatanode().namenode.processUpgradeCommand(
  147.         new UpgradeCommand(UpgradeCommand.UC_ACTION_REPORT_STATUS, 
  148.             getVersion(), getUpgradeStatus()));
  149.   }
  150.   public UpgradeCommand startUpgrade() throws IOException {
  151.     return null;
  152.   }
  153. }
  154. /**
  155.  * Upgrade object for name-node
  156.  */
  157. class UO_Namenode extends UpgradeObjectNamenode {
  158.   int version;
  159.   UO_Namenode(int v) {
  160.     status = (short)0;
  161.     version = v;
  162.   }
  163.   public int getVersion() {
  164.     return version;
  165.   }
  166.   synchronized public UpgradeCommand processUpgradeCommand(
  167.                                   UpgradeCommand command) throws IOException {
  168.     switch(command.getAction()) {
  169.       case UpgradeCommand.UC_ACTION_REPORT_STATUS:
  170.         this.status += command.getCurrentStatus()/8;  // 4 reports needed
  171.         break;
  172.       default:
  173.         this.status++;
  174.     }
  175.     return null;
  176.   }
  177.   public UpgradeCommand completeUpgrade() throws IOException {
  178.     return null;
  179.   }
  180. }
  181. class UO_Datanode1 extends UO_Datanode {
  182.   UO_Datanode1() {
  183.     super(LAYOUT_VERSION+1);
  184.   }
  185. }
  186. class UO_Namenode1 extends UO_Namenode {
  187.   UO_Namenode1() {
  188.     super(LAYOUT_VERSION+1);
  189.   }
  190. }
  191. class UO_Datanode2 extends UO_Datanode {
  192.   UO_Datanode2() {
  193.     super(LAYOUT_VERSION+2);
  194.   }
  195. }
  196. class UO_Namenode2 extends UO_Namenode {
  197.   UO_Namenode2() {
  198.     super(LAYOUT_VERSION+2);
  199.   }
  200. }
  201. class UO_Datanode3 extends UO_Datanode {
  202.   UO_Datanode3() {
  203.     super(LAYOUT_VERSION+3);
  204.   }
  205. }
  206. class UO_Namenode3 extends UO_Namenode {
  207.   UO_Namenode3() {
  208.     super(LAYOUT_VERSION+3);
  209.   }
  210. }