From 2ba149f85c94d1f2a1d8833b8b9c3b36c5600ce2 Mon Sep 17 00:00:00 2001 From: Eli Collins Date: Wed, 12 Sep 2012 18:36:01 +0000 Subject: [PATCH] HDFS-3902. TestDatanodeBlockScanner#testBlockCorruptionPolicy is broken. Contributed by Andy Isaacson git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1384081 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../datanode/BlockPoolSliceScanner.java | 3 ++- .../server/datanode/DataBlockScanner.java | 3 ++- .../hadoop/hdfs/TestDatanodeBlockScanner.java | 21 +++++++++++++------ .../server/datanode/DataNodeTestUtils.java | 6 ++++++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index d4474e5c53..50eb2263ee 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -783,6 +783,9 @@ Release 2.0.2-alpha - 2012-09-07 HDFS-3833. TestDFSShell fails on windows due to concurrent file read/write. (Brandon Li via suresh) + HDFS-3902. TestDatanodeBlockScanner#testBlockCorruptionPolicy is broken. + (Andy Isaacson via eli) + Release 2.0.0-alpha - 05-23-2012 INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java index 757c0d79c5..e0582e4760 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceScanner.java @@ -374,7 +374,8 @@ private synchronized void adjustThrottler() { throttler.setBandwidth(Math.min(bw, MAX_SCAN_RATE)); } - private void verifyBlock(ExtendedBlock block) { + @VisibleForTesting + void verifyBlock(ExtendedBlock block) { BlockSender blockSender = null; /* In case of failure, attempt to read second time to reduce diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java index 4a2b76296b..95a883a87d 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataBlockScanner.java @@ -172,7 +172,8 @@ private synchronized int getBlockPoolSetSize() { return blockPoolScannerMap.size(); } - private synchronized BlockPoolSliceScanner getBPScanner(String bpid) { + @VisibleForTesting + synchronized BlockPoolSliceScanner getBPScanner(String bpid) { return blockPoolScannerMap.get(bpid); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDatanodeBlockScanner.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDatanodeBlockScanner.java index dfc9e9a667..a3cfb25731 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDatanodeBlockScanner.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDatanodeBlockScanner.java @@ -34,14 +34,19 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.logging.impl.Log4JLogger; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.protocol.DatanodeInfo; import org.apache.hadoop.hdfs.protocol.ExtendedBlock; import org.apache.hadoop.hdfs.protocol.HdfsConstants.DatanodeReportType; +import org.apache.hadoop.hdfs.server.datanode.DataNode; +import org.apache.hadoop.hdfs.server.datanode.DataNodeTestUtils; +import org.apache.hadoop.hdfs.server.namenode.FSNamesystem; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Time; +import org.apache.log4j.Level; import org.junit.Test; /** @@ -59,6 +64,10 @@ public class TestDatanodeBlockScanner { private static Pattern pattern_blockVerify = Pattern.compile(".*?(SCAN_PERIOD)\\s*:\\s*(\\d+.*?)"); + + static { + ((Log4JLogger)FSNamesystem.auditLog).getLogger().setLevel(Level.WARN); + } /** * This connects to datanode and fetches block verification data. * It repeats this until the given block has a verification time > newTime. @@ -206,12 +215,12 @@ public void testBlockCorruptionPolicy() throws Exception { assertTrue(MiniDFSCluster.corruptReplica(1, block)); assertTrue(MiniDFSCluster.corruptReplica(2, block)); - // Read the file to trigger reportBadBlocks by client - try { - IOUtils.copyBytes(fs.open(file1), new IOUtils.NullOutputStream(), - conf, true); - } catch (IOException e) { - // Ignore exception + // Trigger each of the DNs to scan this block immediately. + // The block pool scanner doesn't run frequently enough on its own + // to notice these, and due to HDFS-1371, the client won't report + // bad blocks to the NN when all replicas are bad. + for (DataNode dn : cluster.getDataNodes()) { + DataNodeTestUtils.runBlockScannerForBlock(dn, block); } // We now have the blocks to be marked as corrupt and we get back all diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/DataNodeTestUtils.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/DataNodeTestUtils.java index 55b4bf57db..9a660263fc 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/DataNodeTestUtils.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/datanode/DataNodeTestUtils.java @@ -114,6 +114,12 @@ public static InterDatanodeProtocol createInterDatanodeProtocolProxy( dn.getDnConf().socketTimeout, dn.getDnConf().connectToDnViaHostname); } + public static void runBlockScannerForBlock(DataNode dn, ExtendedBlock b) { + DataBlockScanner scanner = dn.getBlockScanner(); + BlockPoolSliceScanner bpScanner = scanner.getBPScanner(b.getBlockPoolId()); + bpScanner.verifyBlock(b); + } + public static void shutdownBlockScanner(DataNode dn) { if (dn.blockScanner != null) { dn.blockScanner.shutdown();