TestFileCorruption.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.hdfs;
  19. import java.io.*;
  20. import java.util.ArrayList;
  21. import junit.framework.*;
  22. import org.apache.hadoop.conf.Configuration;
  23. import org.apache.hadoop.fs.BlockLocation;
  24. import org.apache.hadoop.fs.FileStatus;
  25. import org.apache.hadoop.fs.FileSystem;
  26. import org.apache.hadoop.fs.ChecksumException;
  27. import org.apache.hadoop.fs.Path;
  28. import org.apache.hadoop.hdfs.protocol.Block;
  29. import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
  30. import org.apache.hadoop.hdfs.server.common.GenerationStamp;
  31. import org.apache.hadoop.hdfs.server.datanode.DataNode;
  32. /**
  33.  * A JUnit test for corrupted file handling.
  34.  */
  35. public class TestFileCorruption extends TestCase {
  36.   
  37.   public TestFileCorruption(String testName) {
  38.     super(testName);
  39.   }
  40.   protected void setUp() throws Exception {
  41.   }
  42.   protected void tearDown() throws Exception {
  43.   }
  44.   
  45.   /** check if DFS can handle corrupted blocks properly */
  46.   public void testFileCorruption() throws Exception {
  47.     MiniDFSCluster cluster = null;
  48.     DFSTestUtil util = new DFSTestUtil("TestFileCorruption", 20, 3, 8*1024);
  49.     try {
  50.       Configuration conf = new Configuration();
  51.       cluster = new MiniDFSCluster(conf, 3, true, null);
  52.       FileSystem fs = cluster.getFileSystem();
  53.       util.createFiles(fs, "/srcdat");
  54.       // Now deliberately remove the blocks
  55.       File data_dir = new File(System.getProperty("test.build.data"),
  56.                                "dfs/data/data5/current");
  57.       assertTrue("data directory does not exist", data_dir.exists());
  58.       File[] blocks = data_dir.listFiles();
  59.       assertTrue("Blocks do not exist in data-dir", (blocks != null) && (blocks.length > 0));
  60.       for (int idx = 0; idx < blocks.length; idx++) {
  61.         if (!blocks[idx].getName().startsWith("blk_")) {
  62.           continue;
  63.         }
  64.         System.out.println("Deliberately removing file "+blocks[idx].getName());
  65.         assertTrue("Cannot remove file.", blocks[idx].delete());
  66.       }
  67.       assertTrue("Corrupted replicas not handled properly.",
  68.                  util.checkFiles(fs, "/srcdat"));
  69.       util.cleanup(fs, "/srcdat");
  70.     } finally {
  71.       if (cluster != null) { cluster.shutdown(); }
  72.     }
  73.   }
  74.   /** check if local FS can handle corrupted blocks properly */
  75.   public void testLocalFileCorruption() throws Exception {
  76.     Configuration conf = new Configuration();
  77.     Path file = new Path(System.getProperty("test.build.data"), "corruptFile");
  78.     FileSystem fs = FileSystem.getLocal(conf);
  79.     DataOutputStream dos = fs.create(file);
  80.     dos.writeBytes("original bytes");
  81.     dos.close();
  82.     // Now deliberately corrupt the file
  83.     dos = new DataOutputStream(new FileOutputStream(file.toString()));
  84.     dos.writeBytes("corruption");
  85.     dos.close();
  86.     // Now attempt to read the file
  87.     DataInputStream dis = fs.open(file, 512);
  88.     try {
  89.       System.out.println("A ChecksumException is expected to be logged.");
  90.       dis.readByte();
  91.     } catch (ChecksumException ignore) {
  92.       //expect this exception but let any NPE get thrown
  93.     }
  94.     fs.delete(file, true);
  95.   }
  96.   
  97.   /** Test the case that a replica is reported corrupt while it is not
  98.    * in blocksMap. Make sure that ArrayIndexOutOfBounds does not thrown.
  99.    * See Hadoop-4351.
  100.    */
  101.   public void testArrayOutOfBoundsException() throws Exception {
  102.     MiniDFSCluster cluster = null;
  103.     try {
  104.       Configuration conf = new Configuration();
  105.       cluster = new MiniDFSCluster(conf, 2, true, null);
  106.       cluster.waitActive();
  107.       
  108.       FileSystem fs = cluster.getFileSystem();
  109.       final Path FILE_PATH = new Path("/tmp.txt");
  110.       final long FILE_LEN = 1L;
  111.       DFSTestUtil.createFile(fs, FILE_PATH, FILE_LEN, (short)2, 1L);
  112.       
  113.       // get the block
  114.       File dataDir = new File(cluster.getDataDirectory(),
  115.           "data1/current");
  116.       Block blk = getBlock(dataDir);
  117.       if (blk == null) {
  118.         blk = getBlock(new File(cluster.getDataDirectory(),
  119.           "dfs/data/data2/current"));
  120.       }
  121.       assertFalse(blk==null);
  122.       // start a third datanode
  123.       cluster.startDataNodes(conf, 1, true, null, null);
  124.       ArrayList<DataNode> datanodes = cluster.getDataNodes();
  125.       assertEquals(datanodes.size(), 3);
  126.       DataNode dataNode = datanodes.get(2);
  127.       
  128.       // report corrupted block by the third datanode
  129.       cluster.getNameNode().namesystem.markBlockAsCorrupt(blk, 
  130.           new DatanodeInfo(dataNode.dnRegistration ));
  131.       
  132.       // open the file
  133.       fs.open(FILE_PATH);
  134.       
  135.       //clean up
  136.       fs.delete(FILE_PATH, false);
  137.     } finally {
  138.       if (cluster != null) { cluster.shutdown(); }
  139.     }
  140.     
  141.   }
  142.   
  143.   private Block getBlock(File dataDir) {
  144.     assertTrue("data directory does not exist", dataDir.exists());
  145.     File[] blocks = dataDir.listFiles();
  146.     assertTrue("Blocks do not exist in dataDir", (blocks != null) && (blocks.length > 0));
  147.     int idx = 0;
  148.     String blockFileName = null;
  149.     for (; idx < blocks.length; idx++) {
  150.       blockFileName = blocks[idx].getName();
  151.       if (blockFileName.startsWith("blk_") && !blockFileName.endsWith(".meta")) {
  152.         break;
  153.       }
  154.     }
  155.     if (blockFileName == null) {
  156.       return null;
  157.     }
  158.     long blockId = Long.parseLong(blockFileName.substring("blk_".length()));
  159.     long blockTimeStamp = GenerationStamp.WILDCARD_STAMP;
  160.     for (idx=0; idx < blocks.length; idx++) {
  161.       String fileName = blocks[idx].getName();
  162.       if (fileName.startsWith(blockFileName) && fileName.endsWith(".meta")) {
  163.         int startIndex = blockFileName.length()+1;
  164.         int endIndex = fileName.length() - ".meta".length();
  165.         blockTimeStamp = Long.parseLong(fileName.substring(startIndex, endIndex));
  166.         break;
  167.       }
  168.     }
  169.     return new Block(blockId, blocks[idx].length(), blockTimeStamp);
  170.   }
  171. }