Repository: bigtop Updated Branches: refs/heads/master bd060d02a -> abba9b4da
BIGTOP-1706. Make TestBlockRecovery runnable under all users Project: http://git-wip-us.apache.org/repos/asf/bigtop/repo Commit: http://git-wip-us.apache.org/repos/asf/bigtop/commit/abba9b4d Tree: http://git-wip-us.apache.org/repos/asf/bigtop/tree/abba9b4d Diff: http://git-wip-us.apache.org/repos/asf/bigtop/diff/abba9b4d Branch: refs/heads/master Commit: abba9b4da23da213ba2dd2f4d796193d3754d0f7 Parents: bd060d0 Author: Dasha <[email protected]> Authored: Thu Feb 26 12:02:19 2015 -0800 Committer: Dasha <[email protected]> Committed: Thu Feb 26 12:02:19 2015 -0800 ---------------------------------------------------------------------- .../itest/hadoop/hdfs/TestBlockRecovery.groovy | 85 ++++++++++---------- 1 file changed, 41 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/bigtop/blob/abba9b4d/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hdfs/TestBlockRecovery.groovy ---------------------------------------------------------------------- diff --git a/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hdfs/TestBlockRecovery.groovy b/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hdfs/TestBlockRecovery.groovy index f7bc04e..2a3f2d9 100644 --- a/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hdfs/TestBlockRecovery.groovy +++ b/bigtop-tests/test-artifacts/hadoop/src/main/groovy/org/apache/bigtop/itest/hadoop/hdfs/TestBlockRecovery.groovy @@ -37,23 +37,22 @@ import org.apache.hadoop.hdfs.DFSTestUtil; This test checks block recovery after a block is corrupted. The test must be performed on a cluster with at least three datanodes to allow block recovery. - The test must be run under user hdfs. Block replication must be set to a minimum value of 2 for this test to work properly. */ public class TestBlockRecovery { - private static Shell sh = new Shell("/bin/bash"); + private static Shell shHDFS = new Shell("/bin/bash", "hdfs"); private static Configuration conf; private static final String corruptContent = "0123456789"; - private static final String fsFilePath = USER_DIR + "/file0"; + private static final String HDFS_TEST_DIR = "/tmp/TestBlockRecovery$corruptContent"; + private static final String fsFilePath = HDFS_TEST_DIR + "/file0"; private static final String grepIP = "grep -o '\\[[^]]*\\]' | " + "grep -o '[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*'"; private static final String localTestDir = "/tmp/test"; private static final String outputFile = localTestDir + "/fsckOutput.txt"; - private static final String USER_DIR = "/user/hdfs"; private static final int sleepTime = 60 * 1000; private static final int TIMEOUT = 5000; @@ -64,7 +63,6 @@ public class TestBlockRecovery { private static String cksumError; private static String initialBlockChecksum; private static String fileContent; - private static String USERNAME; private static def dataDirs = []; private static def nodesBeforeRecovery = []; @@ -90,88 +88,87 @@ public class TestBlockRecovery { if (dataDirs == null) dataDirs = conf.get("dfs.datanode.data.dir").split(","); - USERNAME = System.getProperty("user.name"); - Assume.assumeTrue(USERNAME == "hdfs"); - - numberOfDataNodes = sh.exec("hdfs dfsadmin -report | grep ^Name | wc -l").getOut()[0] as short; + numberOfDataNodes = shHDFS.exec("hdfs dfsadmin -report | grep ^Name | wc -l").getOut()[0] as short; Assume.assumeTrue(numberOfDataNodes >= 3); - sh.exec("rm -rf $localTestDir"); - sh.exec("mkdir $localTestDir"); - sh.exec("hadoop fs -rm -r $fsFilePath"); + shHDFS.exec("rm -rf $localTestDir"); + shHDFS.exec("mkdir $localTestDir"); + shHDFS.exec("hadoop fs -rm -r $fsFilePath"); Thread.sleep(TIMEOUT); - sh.exec("hadoop fs -mkdir -p $USER_DIR"); - assertTrue("Failed to create input directory", sh.getRet() == 0); + shHDFS.exec("hadoop fs -mkdir -p $HDFS_TEST_DIR && hadoop fs -chmod 777 $HDFS_TEST_DIR"); + assertTrue("Failed to create input directory", shHDFS.getRet() == 0); repFactor = (numberOfDataNodes - 1); + try { + DFSTestUtil.createFile(fileSys, new Path(fsFilePath), fileLen, repFactor, SEED); + } catch (Exception e) { + assert "Exception should not be thrown" + } + fileContent = shHDFS.exec("hadoop fs -cat $fsFilePath").getOut()[0]; - DFSTestUtil.createFile(fileSys, new Path(fsFilePath), fileLen, repFactor, SEED); - - fileContent = sh.exec("hadoop fs -cat $fsFilePath").getOut()[0]; - - sh.exec("hdfs fsck $fsFilePath -blocks -locations -files > $outputFile"); - assertTrue("Could not write output to file", sh.getRet() == 0); + shHDFS.exec("hdfs fsck $fsFilePath -blocks -locations -files > $outputFile"); + assertTrue("Could not write output to file", shHDFS.getRet() == 0); - nodesBeforeRecovery = sh.exec("grep -o '\\[[^]]*\\]' $outputFile | " + + nodesBeforeRecovery = shHDFS.exec("grep -o '\\[[^]]*\\]' $outputFile | " + "grep -o '[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*'").getOut(); - assertTrue("Could not obtain datanode addresses", sh.getRet() == 0); + assertTrue("Could not obtain datanode addresses", shHDFS.getRet() == 0); - blockToTest = sh.exec("grep -o 'blk_[0-9]*' $outputFile").getOut()[0]; - assertTrue("Could not obtain block number", sh.getRet() == 0); + blockToTest = shHDFS.exec("grep -o 'blk_[0-9]*' $outputFile").getOut()[0]; + assertTrue("Could not obtain block number", shHDFS.getRet() == 0); for (int i = 0; i < dataDirs.length; i++) { def dataDir = dataDirs[i] - blockLocation = sh.exec("find $dataDir -name $blockToTest | grep $dataDir").getOut()[0]; + blockLocation = shHDFS.exec("find $dataDir -name $blockToTest | grep $dataDir").getOut()[0]; if (blockLocation != null) break; } assertNotNull("Could not find specified block", blockLocation); - initialBlockChecksum = sh.exec("cksum $blockLocation").getOut()[0].split(" ")[0]; - assertTrue("Could not obtain checksum for block $blockToTest", sh.getRet() == 0); + initialBlockChecksum = shHDFS.exec("cksum $blockLocation").getOut()[0].split(" ")[0]; + assertTrue("Could not obtain checksum for block $blockToTest", shHDFS.getRet() == 0); } @AfterClass public static void tearDown() { // deletion of test files - sh.exec("hadoop fs -rm -r -skipTrash $fsFilePath"); - assertTrue("Could not delete file $fsFilePath", sh.getRet() == 0); - sh.exec("rm -rf $localTestDir"); - assertTrue("Could not delete test directory $localTestDir", sh.getRet() == 0); + shHDFS.exec("hadoop fs -rm -r -skipTrash $fsFilePath"); + assertTrue("Could not delete file $fsFilePath", shHDFS.getRet() == 0); + shHDFS.exec("rm -rf $localTestDir"); + assertTrue("Could not delete test directory $localTestDir", shHDFS.getRet() == 0); } @Test public void testBlockRecovery() { // corrupt block - sh.exec("echo $corruptContent > $blockLocation"); - assertTrue("Could not write to file", sh.getRet() == 0); + shHDFS.exec("echo $corruptContent > $blockLocation"); + assertTrue("Could not write to file", shHDFS.getRet() == 0); // perform checksum after block corruption - String corruptBlockChecksum = sh.exec("cksum $blockLocation").getOut()[0].split(" ")[0]; - assertTrue("Could not obtain checksum for block $blockToTest", sh.getRet() == 0); + String corruptBlockChecksum = shHDFS.exec("cksum $blockLocation").getOut()[0].split(" ")[0]; + assertTrue("Could not obtain checksum for block $blockToTest", shHDFS.getRet() == 0); // trigger block recovery by trying to access the file - sh.exec("hadoop fs -cat $fsFilePath"); + shHDFS.exec("hadoop fs -cat $fsFilePath"); // make sure checksum changes back to original, indicating block recovery for (int j = 0; j < 3; j++) { // wait a bit to let the block recover sleep(sleepTime); // see if checksum has changed - cksumError = sh.exec("hadoop fs -cat $fsFilePath | grep -o 'Checksum error'").getErr(); + cksumError = shHDFS.exec("hadoop fs -cat $fsFilePath | grep -o 'Checksum error'").getErr(); if (cksumError != "Checksum error") break; } assertNotNull("Block has not been successfully triggered for recovery.", cksumError); - nodesAfterRecovery = sh.exec("hdfs fsck $fsFilePath -blocks -locations -files | $grepIP").getOut(); - assertTrue("Could not obtain datanode addresses", sh.getRet() == 0); + nodesAfterRecovery = shHDFS.exec("hdfs fsck $fsFilePath -blocks -locations -files | $grepIP").getOut(); + assertTrue("Could not obtain datanode addresses", shHDFS.getRet() == 0); blockRecoveryNode = (nodesBeforeRecovery.intersect(nodesAfterRecovery))[0]; if (blockRecoveryNode == null) { sleep(sleepTime); - nodesAfterRecovery = sh.exec("hdfs fsck $fsFilePath -blocks -locations -files | $grepIP").getOut(); - assertTrue("Could not obtain datanode addresses", sh.getRet() == 0); + nodesAfterRecovery = shHDFS.exec("hdfs fsck $fsFilePath -blocks -locations -files | $grepIP").getOut(); + assertTrue("Could not obtain datanode addresses", shHDFS.getRet() == 0); blockRecoveryNode = (nodesBeforeRecovery.intersect(nodesAfterRecovery))[0]; assert (blockRecoveryNode.size() != 0): "Block has not been successfully triggered for recovery." @@ -185,14 +182,14 @@ public class TestBlockRecovery { while (cksumAttempt < 3) { if (corruptBlockChecksum != initialBlockChecksum) { sleep(sleepTime); - corruptBlockChecksum = sh.exec("ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_hdfsuser " + + corruptBlockChecksum = shHDFS.exec("ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_hdfsuser " + "$blockRecoveryNode 'cksum `find ${dataDirs.join(' ')}" + " -name $blockToTest 2>/dev/null | grep $blockToTest` '").getOut()[0].split(" ")[0]; ++cksumAttempt; } else { // If block recovers, verify file content is the same as before corruption - if (sh.exec("hadoop fs -cat $fsFilePath").getOut()[0] == fileContent) { - assertTrue("Could not read file $fsFilePath", sh.getRet() == 0); + if (shHDFS.exec("hadoop fs -cat $fsFilePath").getOut()[0] == fileContent) { + assertTrue("Could not read file $fsFilePath", shHDFS.getRet() == 0); success = true; break; }
