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

网格计算

开发平台:

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;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import junit.framework.TestCase;
  22. import org.apache.commons.logging.Log;
  23. import org.apache.commons.logging.LogFactory;
  24. import org.apache.hadoop.conf.Configuration;
  25. import org.apache.hadoop.hdfs.server.common.HdfsConstants.NodeType;
  26. import org.apache.hadoop.hdfs.server.common.HdfsConstants.StartupOption;
  27. import static org.apache.hadoop.hdfs.server.common.HdfsConstants.NodeType.NAME_NODE;
  28. import static org.apache.hadoop.hdfs.server.common.HdfsConstants.NodeType.DATA_NODE;
  29. import org.apache.hadoop.hdfs.server.common.HdfsConstants;
  30. import org.apache.hadoop.hdfs.server.common.StorageInfo;
  31. import org.apache.hadoop.fs.FileUtil;
  32. /**
  33. * This test ensures the appropriate response (successful or failure) from
  34. * the system when the system is rolled back under various storage state and
  35. * version conditions.
  36. */
  37. public class TestDFSRollback extends TestCase {
  38.  
  39.   private static final Log LOG = LogFactory.getLog(
  40.                                                    "org.apache.hadoop.hdfs.TestDFSRollback");
  41.   private Configuration conf;
  42.   private int testCounter = 0;
  43.   private MiniDFSCluster cluster = null;
  44.   
  45.   /**
  46.    * Writes an INFO log message containing the parameters.
  47.    */
  48.   void log(String label, int numDirs) {
  49.     LOG.info("============================================================");
  50.     LOG.info("***TEST " + (testCounter++) + "*** " 
  51.              + label + ":"
  52.              + " numDirs="+numDirs);
  53.   }
  54.   
  55.   /**
  56.    * Verify that the new current directory is the old previous.  
  57.    * It is assumed that the server has recovered and rolled back.
  58.    */
  59.   void checkResult(NodeType nodeType, String[] baseDirs) throws IOException {
  60.     switch (nodeType) {
  61.     case NAME_NODE:
  62.       for (int i = 0; i < baseDirs.length; i++) {
  63.         assertTrue(new File(baseDirs[i],"current").isDirectory());
  64.         assertTrue(new File(baseDirs[i],"current/VERSION").isFile());
  65.         assertTrue(new File(baseDirs[i],"current/edits").isFile());
  66.         assertTrue(new File(baseDirs[i],"current/fsimage").isFile());
  67.         assertTrue(new File(baseDirs[i],"current/fstime").isFile());
  68.       }
  69.       break;
  70.     case DATA_NODE:
  71.       for (int i = 0; i < baseDirs.length; i++) {
  72.         assertEquals(
  73.                      UpgradeUtilities.checksumContents(
  74.                                                        nodeType, new File(baseDirs[i],"current")),
  75.                      UpgradeUtilities.checksumMasterContents(nodeType));
  76.       }
  77.       break;
  78.     }
  79.     for (int i = 0; i < baseDirs.length; i++) {
  80.       assertFalse(new File(baseDirs[i],"previous").isDirectory());
  81.     }
  82.   }
  83.  
  84.   /**
  85.    * Attempts to start a NameNode with the given operation.  Starting
  86.    * the NameNode should throw an exception.
  87.    */
  88.   void startNameNodeShouldFail(StartupOption operation) {
  89.     try {
  90.       cluster = new MiniDFSCluster(conf, 0, operation); // should fail
  91.       throw new AssertionError("NameNode should have failed to start");
  92.     } catch (Exception expected) {
  93.       // expected
  94.     }
  95.   }
  96.   
  97.   /**
  98.    * Attempts to start a DataNode with the given operation.  Starting
  99.    * the DataNode should throw an exception.
  100.    */
  101.   void startDataNodeShouldFail(StartupOption operation) {
  102.     try {
  103.       cluster.startDataNodes(conf, 1, false, operation, null); // should fail
  104.       throw new AssertionError("DataNode should have failed to start");
  105.     } catch (Exception expected) {
  106.       // expected
  107.       assertFalse(cluster.isDataNodeUp());
  108.     }
  109.   }
  110.  
  111.   /**
  112.    * This test attempts to rollback the NameNode and DataNode under
  113.    * a number of valid and invalid conditions.
  114.    */
  115.   public void testRollback() throws Exception {
  116.     File[] baseDirs;
  117.     UpgradeUtilities.initialize();
  118.     
  119.     for (int numDirs = 1; numDirs <= 2; numDirs++) {
  120.       conf = new Configuration();
  121.       conf.setInt("dfs.datanode.scan.period.hours", -1);      
  122.       conf = UpgradeUtilities.initializeStorageStateConf(numDirs, conf);
  123.       String[] nameNodeDirs = conf.getStrings("dfs.name.dir");
  124.       String[] dataNodeDirs = conf.getStrings("dfs.data.dir");
  125.       
  126.       log("Normal NameNode rollback", numDirs);
  127.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  128.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  129.       cluster = new MiniDFSCluster(conf, 0, StartupOption.ROLLBACK);
  130.       checkResult(NAME_NODE, nameNodeDirs);
  131.       cluster.shutdown();
  132.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  133.       
  134.       log("Normal DataNode rollback", numDirs);
  135.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  136.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  137.       cluster = new MiniDFSCluster(conf, 0, StartupOption.ROLLBACK);
  138.       UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "current");
  139.       UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "previous");
  140.       cluster.startDataNodes(conf, 1, false, StartupOption.ROLLBACK, null);
  141.       checkResult(DATA_NODE, dataNodeDirs);
  142.       cluster.shutdown();
  143.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  144.       UpgradeUtilities.createEmptyDirs(dataNodeDirs);
  145.       log("NameNode rollback without existing previous dir", numDirs);
  146.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  147.       startNameNodeShouldFail(StartupOption.ROLLBACK);
  148.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  149.       
  150.       log("DataNode rollback without existing previous dir", numDirs);
  151.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  152.       cluster = new MiniDFSCluster(conf, 0, StartupOption.UPGRADE);
  153.       UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "current");
  154.       cluster.startDataNodes(conf, 1, false, StartupOption.ROLLBACK, null);
  155.       cluster.shutdown();
  156.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  157.       UpgradeUtilities.createEmptyDirs(dataNodeDirs);
  158.       log("DataNode rollback with future stored layout version in previous", numDirs);
  159.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  160.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  161.       cluster = new MiniDFSCluster(conf, 0, StartupOption.ROLLBACK);
  162.       UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "current");
  163.       baseDirs = UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "previous");
  164.       UpgradeUtilities.createVersionFile(DATA_NODE, baseDirs,
  165.                                          new StorageInfo(Integer.MIN_VALUE,
  166.                                                          UpgradeUtilities.getCurrentNamespaceID(cluster),
  167.                                                          UpgradeUtilities.getCurrentFsscTime(cluster)));
  168.       startDataNodeShouldFail(StartupOption.ROLLBACK);
  169.       cluster.shutdown();
  170.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  171.       UpgradeUtilities.createEmptyDirs(dataNodeDirs);
  172.       
  173.       log("DataNode rollback with newer fsscTime in previous", numDirs);
  174.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  175.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  176.       cluster = new MiniDFSCluster(conf, 0, StartupOption.ROLLBACK);
  177.       UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "current");
  178.       baseDirs = UpgradeUtilities.createStorageDirs(DATA_NODE, dataNodeDirs, "previous");
  179.       UpgradeUtilities.createVersionFile(DATA_NODE, baseDirs,
  180.                                          new StorageInfo(UpgradeUtilities.getCurrentLayoutVersion(),
  181.                                                          UpgradeUtilities.getCurrentNamespaceID(cluster),
  182.                                                          Long.MAX_VALUE));
  183.       startDataNodeShouldFail(StartupOption.ROLLBACK);
  184.       cluster.shutdown();
  185.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  186.       UpgradeUtilities.createEmptyDirs(dataNodeDirs);
  187.       log("NameNode rollback with no edits file", numDirs);
  188.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  189.       baseDirs = UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  190.       for (File f : baseDirs) { 
  191.         FileUtil.fullyDelete(new File(f,"edits"));
  192.       }
  193.       startNameNodeShouldFail(StartupOption.ROLLBACK);
  194.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  195.       
  196.       log("NameNode rollback with no image file", numDirs);
  197.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  198.       baseDirs = UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  199.       for (File f : baseDirs) { 
  200.         FileUtil.fullyDelete(new File(f,"fsimage")); 
  201.       }
  202.       startNameNodeShouldFail(StartupOption.ROLLBACK);
  203.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  204.       
  205.       log("NameNode rollback with corrupt version file", numDirs);
  206.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  207.       baseDirs = UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  208.       for (File f : baseDirs) { 
  209.         UpgradeUtilities.corruptFile(new File(f,"VERSION")); 
  210.       }
  211.       startNameNodeShouldFail(StartupOption.ROLLBACK);
  212.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  213.       
  214.       log("NameNode rollback with old layout version in previous", numDirs);
  215.       UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "current");
  216.       baseDirs = UpgradeUtilities.createStorageDirs(NAME_NODE, nameNodeDirs, "previous");
  217.       UpgradeUtilities.createVersionFile(NAME_NODE, baseDirs,
  218.                                          new StorageInfo(1,
  219.                                                          UpgradeUtilities.getCurrentNamespaceID(null),
  220.                                                          UpgradeUtilities.getCurrentFsscTime(null)));
  221.       startNameNodeShouldFail(StartupOption.UPGRADE);
  222.       UpgradeUtilities.createEmptyDirs(nameNodeDirs);
  223.     } // end numDir loop
  224.   }
  225.  
  226.   protected void tearDown() throws Exception {
  227.     LOG.info("Shutting down MiniDFSCluster");
  228.     if (cluster != null) cluster.shutdown();
  229.   }
  230.   
  231.   public static void main(String[] args) throws Exception {
  232.     new TestDFSRollback().testRollback();
  233.   }
  234.   
  235. }