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

网格计算

开发平台:

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.IOException;
  20. import java.net.InetSocketAddress;
  21. import java.net.URL;
  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.fs.ChecksumException;
  26. import org.apache.hadoop.fs.FSDataInputStream;
  27. import org.apache.hadoop.fs.FileSystem;
  28. import org.apache.hadoop.fs.Path;
  29. import junit.framework.TestCase;
  30. /**
  31.  * The test makes sure that NameNode detects presense blocks that do not have
  32.  * any valid replicas. In addition, it verifies that HDFS front page displays
  33.  * a warning in such a case.
  34.  */
  35. public class TestMissingBlocksAlert extends TestCase {
  36.   
  37.   private static final Log LOG = 
  38.                            LogFactory.getLog(TestMissingBlocksAlert.class);
  39.   
  40.   public void testMissingBlocksAlert() throws IOException, 
  41.                                        InterruptedException {
  42.     
  43.     MiniDFSCluster cluster = null;
  44.     
  45.     try {
  46.       Configuration conf = new Configuration();
  47.       //minimize test delay
  48.       conf.setInt("dfs.replication.interval", 0);
  49.       int fileLen = 10*1024;
  50.       //start a cluster with single datanode
  51.       cluster = new MiniDFSCluster(conf, 1, true, null);
  52.       cluster.waitActive();
  53.       DistributedFileSystem dfs = 
  54.                             (DistributedFileSystem) cluster.getFileSystem();
  55.       // create a normal file
  56.       DFSTestUtil.createFile(dfs, new Path("/testMissingBlocksAlert/file1"), 
  57.                              fileLen, (short)3, 0);
  58.       Path corruptFile = new Path("/testMissingBlocks/corruptFile");
  59.       DFSTestUtil.createFile(dfs, corruptFile, fileLen, (short)3, 0);
  60.       // Corrupt the block
  61.       String block = DFSTestUtil.getFirstBlock(dfs, corruptFile).getBlockName();
  62.       TestDatanodeBlockScanner.corruptReplica(block, 0);
  63.       // read the file so that the corrupt block is reported to NN
  64.       FSDataInputStream in = dfs.open(corruptFile); 
  65.       try {
  66.         in.readFully(new byte[fileLen]);
  67.       } catch (ChecksumException ignored) { // checksum error is expected.      
  68.       }
  69.       in.close();
  70.       LOG.info("Waiting for missing blocks count to increase...");
  71.       while (dfs.getMissingBlocksCount() <= 0) {
  72.         Thread.sleep(100);
  73.       }
  74.       assertTrue(dfs.getMissingBlocksCount() == 1);
  75.       // Now verify that it shows up on webui
  76.       URL url = new URL("http://" + conf.get("dfs.http.address") + 
  77.                         "/dfshealth.jsp");
  78.       String dfsFrontPage = DFSTestUtil.urlGet(url);
  79.       String warnStr = "WARNING : There are about ";
  80.       assertTrue("HDFS Front page does not contain expected warning", 
  81.                  dfsFrontPage.contains(warnStr + "1 missing blocks"));
  82.       // now do the reverse : remove the file expect the number of missing 
  83.       // blocks to go to zero
  84.       dfs.delete(corruptFile, true);
  85.       LOG.info("Waiting for missing blocks count to be zero...");
  86.       while (dfs.getMissingBlocksCount() > 0) {
  87.         Thread.sleep(100);
  88.       }
  89.       // and make sure WARNING disappears
  90.       // Now verify that it shows up on webui
  91.       dfsFrontPage = DFSTestUtil.urlGet(url);
  92.       assertFalse("HDFS Front page contains unexpected warning", 
  93.                   dfsFrontPage.contains(warnStr));
  94.     } finally {
  95.       if (cluster != null) {
  96.         cluster.shutdown();
  97.       }
  98.     }
  99.   }
  100. }