TestOverReplicatedBlocks.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.server.namenode;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import org.apache.hadoop.conf.Configuration;
  22. import org.apache.hadoop.fs.FileSystem;
  23. import org.apache.hadoop.fs.Path;
  24. import org.apache.hadoop.hdfs.DFSTestUtil;
  25. import org.apache.hadoop.hdfs.MiniDFSCluster;
  26. import org.apache.hadoop.hdfs.TestDatanodeBlockScanner;
  27. import org.apache.hadoop.hdfs.MiniDFSCluster.DataNodeProperties;
  28. import org.apache.hadoop.hdfs.protocol.Block;
  29. import org.apache.hadoop.hdfs.protocol.DatanodeID;
  30. import junit.framework.TestCase;
  31. public class TestOverReplicatedBlocks extends TestCase {
  32.   /** Test processOverReplicatedBlock can handle corrupt replicas fine.
  33.    * It make sure that it won't treat corrupt replicas as valid ones 
  34.    * thus prevents NN deleting valid replicas but keeping
  35.    * corrupt ones.
  36.    */
  37.   public void testProcesOverReplicateBlock() throws IOException {
  38.     Configuration conf = new Configuration();
  39.     conf.setLong("dfs.blockreport.intervalMsec", 1000L);
  40.     conf.set("dfs.replication.pending.timeout.sec", Integer.toString(2));
  41.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 3, true, null);
  42.     FileSystem fs = cluster.getFileSystem();
  43.     try {
  44.       final Path fileName = new Path("/foo1");
  45.       DFSTestUtil.createFile(fs, fileName, 2, (short)3, 0L);
  46.       DFSTestUtil.waitReplication(fs, fileName, (short)3);
  47.       
  48.       // corrupt the block on datanode 0
  49.       Block block = DFSTestUtil.getFirstBlock(fs, fileName);
  50.       TestDatanodeBlockScanner.corruptReplica(block.getBlockName(), 0);
  51.       DataNodeProperties dnProps = cluster.stopDataNode(0);
  52.       // remove block scanner log to trigger block scanning
  53.       File scanLog = new File(System.getProperty("test.build.data"),
  54.           "dfs/data/data1/current/dncp_block_verification.log.curr");
  55.       //wait for one minute for deletion to succeed;
  56.       for(int i=0; !scanLog.delete(); i++) {
  57.         assertTrue("Could not delete log file in one minute", i < 60);
  58.         try {
  59.           Thread.sleep(1000);
  60.         } catch (InterruptedException ignored) {}
  61.       }
  62.       
  63.       // restart the datanode so the corrupt replica will be detected
  64.       cluster.restartDataNode(dnProps);
  65.       DFSTestUtil.waitReplication(fs, fileName, (short)2);
  66.       
  67.       final DatanodeID corruptDataNode = 
  68.         cluster.getDataNodes().get(2).dnRegistration;
  69.       final FSNamesystem namesystem = FSNamesystem.getFSNamesystem();
  70.       synchronized (namesystem.heartbeats) {
  71.         // set live datanode's remaining space to be 0 
  72.         // so they will be chosen to be deleted when over-replication occurs
  73.         for (DatanodeDescriptor datanode : namesystem.heartbeats) {
  74.           if (!corruptDataNode.equals(datanode)) {
  75.             datanode.updateHeartbeat(100L, 100L, 0L, 0);
  76.           }
  77.         }
  78.         
  79.         // decrease the replication factor to 1; 
  80.         namesystem.setReplication(fileName.toString(), (short)1);
  81.         // corrupt one won't be chosen to be excess one
  82.         // without 4910 the number of live replicas would be 0: block gets lost
  83.         assertEquals(1, namesystem.countNodes(block).liveReplicas());
  84.       }
  85.     } finally {
  86.       cluster.shutdown();
  87.     }
  88.   }
  89. }