Return-Path: X-Original-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Delivered-To: apmail-hadoop-hdfs-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0A8AF4745 for ; Sun, 12 Jun 2011 18:17:31 +0000 (UTC) Received: (qmail 49000 invoked by uid 500); 12 Jun 2011 18:17:30 -0000 Delivered-To: apmail-hadoop-hdfs-commits-archive@hadoop.apache.org Received: (qmail 48970 invoked by uid 500); 12 Jun 2011 18:17:30 -0000 Mailing-List: contact hdfs-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hdfs-dev@hadoop.apache.org Delivered-To: mailing list hdfs-commits@hadoop.apache.org Received: (qmail 48962 invoked by uid 99); 12 Jun 2011 18:17:30 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 12 Jun 2011 18:17:30 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 12 Jun 2011 18:17:26 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 358B62388A36; Sun, 12 Jun 2011 18:17:06 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1134951 [3/3] - in /hadoop/hdfs/trunk: ./ src/java/org/apache/hadoop/hdfs/ src/java/org/apache/hadoop/hdfs/server/namenode/ src/test/hdfs/org/apache/hadoop/cli/ src/test/hdfs/org/apache/hadoop/hdfs/ src/test/hdfs/org/apache/hadoop/hdfs/ser... Date: Sun, 12 Jun 2011 18:17:05 -0000 To: hdfs-commits@hadoop.apache.org From: eli@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110612181706.358B62388A36@eris.apache.org> Modified: hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java (original) +++ hadoop/hdfs/trunk/src/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java Sun Jun 12 18:17:05 2011 @@ -391,6 +391,7 @@ public class LeaseManager { /** Check the leases beginning from the oldest. */ private synchronized void checkLeases() { + assert fsnamesystem.hasWriteLock(); for(; sortedLeases.size() > 0; ) { final Lease oldest = sortedLeases.first(); if (!oldest.expiredHardLimit()) { Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/cli/TestHDFSCLI.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/cli/TestHDFSCLI.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/cli/TestHDFSCLI.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/cli/TestHDFSCLI.java Sun Jun 12 18:17:05 2011 @@ -56,7 +56,7 @@ public class TestHDFSCLI extends CLITest .racks(racks) .hosts(hosts) .build(); - + dfsCluster.waitClusterUp(); namenode = conf.get(DFSConfigKeys.FS_DEFAULT_NAME_KEY, "file:///"); username = System.getProperty("user.name"); Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/DFSTestUtil.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/DFSTestUtil.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/DFSTestUtil.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/DFSTestUtil.java Sun Jun 12 18:17:05 2011 @@ -555,6 +555,15 @@ public class DFSTestUtil { IOUtils.copyBytes(is, os, s.length(), true); } + /* Append the given string to the given file */ + public static void appendFile(FileSystem fs, Path p, String s) + throws IOException { + assert fs.exists(p); + InputStream is = new ByteArrayInputStream(s.getBytes()); + FSDataOutputStream os = fs.append(p); + IOUtils.copyBytes(is, os, s.length(), true); + } + // Returns url content as string. public static String urlGet(URL url) throws IOException { URLConnection conn = url.openConnection(); Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDecommission.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDecommission.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDecommission.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestDecommission.java Sun Jun 12 18:17:05 2011 @@ -35,6 +35,7 @@ import org.apache.hadoop.hdfs.protocol.D import org.apache.hadoop.hdfs.protocol.FSConstants.DatanodeReportType; import org.apache.hadoop.hdfs.server.namenode.FSNamesystem; import org.apache.hadoop.hdfs.server.namenode.NameNode; +import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter; import static org.junit.Assert.*; import org.junit.After; @@ -201,7 +202,8 @@ public class TestDecommission { nodes.add(nodename); writeConfigFile(excludeFile, nodes); cluster.getNamesystem(nnIndex).refreshNodes(conf); - DatanodeInfo ret = cluster.getNamesystem(nnIndex).getDatanode(info[index]); + DatanodeInfo ret = NameNodeAdapter.getDatanode( + cluster.getNameNode(nnIndex), info[index]); waitNodeState(ret, waitForState); return ret; } @@ -371,7 +373,7 @@ public class TestDecommission { // Stop decommissioning and verify stats writeConfigFile(excludeFile, null); fsn.refreshNodes(conf); - DatanodeInfo ret = fsn.getDatanode(downnode); + DatanodeInfo ret = NameNodeAdapter.getDatanode(namenode, downnode); waitNodeState(ret, AdminStates.NORMAL); verifyStats(namenode, fsn, ret, false); } Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestSafeMode.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestSafeMode.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestSafeMode.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/TestSafeMode.java Sun Jun 12 18:17:05 2011 @@ -20,20 +20,44 @@ package org.apache.hadoop.hdfs; import java.io.IOException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction; -import junit.framework.TestCase; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.After; +import org.junit.Test; /** * Tests to verify safe mode correctness. */ -public class TestSafeMode extends TestCase { - - static Log LOG = LogFactory.getLog(TestSafeMode.class); +public class TestSafeMode { + Configuration conf; + MiniDFSCluster cluster; + FileSystem fs; + DistributedFileSystem dfs; + + @Before + public void startUp() throws IOException { + conf = new HdfsConfiguration(); + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build(); + cluster.waitActive(); + fs = cluster.getFileSystem(); + dfs = (DistributedFileSystem)fs; + } + + @After + public void tearDown() throws IOException { + if (fs != null) { + fs.close(); + } + if (cluster != null) { + cluster.shutdown(); + } + } /** * This test verifies that if SafeMode is manually entered, name-node does not @@ -51,61 +75,123 @@ public class TestSafeMode extends TestCa * * @throws IOException */ - public void testManualSafeMode() throws IOException { - MiniDFSCluster cluster = null; - DistributedFileSystem fs = null; + @Test + public void testManualSafeMode() throws IOException { + fs = (DistributedFileSystem)cluster.getFileSystem(); + Path file1 = new Path("/tmp/testManualSafeMode/file1"); + Path file2 = new Path("/tmp/testManualSafeMode/file2"); + + // create two files with one block each. + DFSTestUtil.createFile(fs, file1, 1000, (short)1, 0); + DFSTestUtil.createFile(fs, file2, 2000, (short)1, 0); + fs.close(); + cluster.shutdown(); + + // now bring up just the NameNode. + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).format(false).build(); + cluster.waitActive(); + dfs = (DistributedFileSystem)cluster.getFileSystem(); + + assertTrue("No datanode is started. Should be in SafeMode", + dfs.setSafeMode(SafeModeAction.SAFEMODE_GET)); + + // manually set safemode. + dfs.setSafeMode(SafeModeAction.SAFEMODE_ENTER); + + // now bring up the datanode and wait for it to be active. + cluster.startDataNodes(conf, 1, true, null, null); + cluster.waitActive(); + + // wait longer than dfs.namenode.safemode.extension try { - Configuration conf = new HdfsConfiguration(); - // disable safemode extension to make the test run faster. - conf.set(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_EXTENSION_KEY, "1"); - cluster = new MiniDFSCluster.Builder(conf).build(); - cluster.waitActive(); - - fs = (DistributedFileSystem)cluster.getFileSystem(); - Path file1 = new Path("/tmp/testManualSafeMode/file1"); - Path file2 = new Path("/tmp/testManualSafeMode/file2"); - - LOG.info("Created file1 and file2."); - - // create two files with one block each. - DFSTestUtil.createFile(fs, file1, 1000, (short)1, 0); - DFSTestUtil.createFile(fs, file2, 2000, (short)1, 0); - fs.close(); - cluster.shutdown(); - - // now bring up just the NameNode. - cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).format(false).build(); - cluster.waitActive(); - fs = (DistributedFileSystem)cluster.getFileSystem(); - - LOG.info("Restarted cluster with just the NameNode"); - - assertTrue("No datanode is started. Should be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - - // manually set safemode. - fs.setSafeMode(SafeModeAction.SAFEMODE_ENTER); - - // now bring up the datanode and wait for it to be active. - cluster.startDataNodes(conf, 1, true, null, null); - cluster.waitActive(); - - LOG.info("Datanode is started."); - - // wait longer than dfs.namenode.safemode.extension - try { - Thread.sleep(2000); - } catch (InterruptedException ignored) {} - - assertTrue("should still be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - - fs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE); - assertFalse("should not be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - } finally { - if(fs != null) fs.close(); - if(cluster!= null) cluster.shutdown(); + Thread.sleep(2000); + } catch (InterruptedException ignored) {} + + assertTrue("should still be in SafeMode", + dfs.setSafeMode(SafeModeAction.SAFEMODE_GET)); + assertFalse("should not be in SafeMode", + dfs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE)); + } + + public interface FSRun { + public abstract void run(FileSystem fs) throws IOException; + } + + /** + * Assert that the given function fails to run due to a safe + * mode exception. + */ + public void runFsFun(String msg, FSRun f) { + try { + f.run(fs); + fail(msg); + } catch (IOException ioe) { + assertTrue(ioe.getMessage().contains("safe mode")); + } + } + + /** + * Run various fs operations while the NN is in safe mode, + * assert that they are either allowed or fail as expected. + */ + @Test + public void testOperationsWhileInSafeMode() throws IOException { + final Path file1 = new Path("/file1"); + + assertFalse(dfs.setSafeMode(SafeModeAction.SAFEMODE_GET)); + DFSTestUtil.createFile(fs, file1, 1024, (short)1, 0); + assertTrue("Could not enter SM", + dfs.setSafeMode(SafeModeAction.SAFEMODE_ENTER)); + + runFsFun("Set quota while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + ((DistributedFileSystem)fs).setQuota(file1, 1, 1); + }}); + + runFsFun("Set perm while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + fs.setPermission(file1, FsPermission.getDefault()); + }}); + + runFsFun("Set owner while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + fs.setOwner(file1, "user", "group"); + }}); + + runFsFun("Set repl while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + fs.setReplication(file1, (short)1); + }}); + + runFsFun("Append file while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + DFSTestUtil.appendFile(fs, file1, "new bytes"); + }}); + + runFsFun("Delete file while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + fs.delete(file1, false); + }}); + + runFsFun("Rename file while in SM", new FSRun() { + public void run(FileSystem fs) throws IOException { + fs.rename(file1, new Path("file2")); + }}); + + try { + fs.setTimes(file1, 0, 0); + } catch (IOException ioe) { + fail("Set times failed while in SM"); } + + try { + DFSTestUtil.readFile(fs, file1); + } catch (IOException ioe) { + fail("Set times failed while in SM"); + } + + assertFalse("Could not leave SM", + dfs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE)); } -} + +} \ No newline at end of file Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/NameNodeAdapter.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/NameNodeAdapter.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/NameNodeAdapter.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/NameNodeAdapter.java Sun Jun 12 18:17:05 2011 @@ -21,6 +21,7 @@ import java.io.IOException; import org.apache.hadoop.ipc.Server; import org.apache.hadoop.hdfs.protocol.Block; +import org.apache.hadoop.hdfs.protocol.DatanodeID; import org.apache.hadoop.hdfs.protocol.LocatedBlocks; /** @@ -77,4 +78,18 @@ public class NameNodeAdapter { public static String getLeaseHolderForPath(NameNode namenode, String path) { return namenode.getNamesystem().leaseManager.getLeaseByPath(path).getHolder(); } + + /** + * Return the datanode descriptor for the given datanode. + */ + public static DatanodeDescriptor getDatanode(NameNode namenode, + DatanodeID id) throws IOException { + FSNamesystem ns = namenode.getNamesystem(); + ns.readLock(); + try { + return ns.getDatanode(id); + } finally { + ns.readUnlock(); + } + } } Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestDeadDatanode.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestDeadDatanode.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestDeadDatanode.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestDeadDatanode.java Sun Jun 12 18:17:05 2011 @@ -61,7 +61,14 @@ public class TestDeadDatanode { FSNamesystem namesystem = cluster.getNamesystem(); String state = alive ? "alive" : "dead"; while (System.currentTimeMillis() < stopTime) { - if (namesystem.getDatanode(nodeID).isAlive == alive) { + namesystem.readLock(); + DatanodeDescriptor dd; + try { + dd = namesystem.getDatanode(nodeID); + } finally { + namesystem.readUnlock(); + } + if (dd.isAlive == alive) { LOG.info("datanode " + nodeID + " is " + state); return; } Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestHeartbeatHandling.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestHeartbeatHandling.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestHeartbeatHandling.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestHeartbeatHandling.java Sun Jun 12 18:17:05 2011 @@ -54,7 +54,13 @@ public class TestHeartbeatHandling exten final DatanodeRegistration nodeReg = DataNodeTestUtils.getDNRegistrationForBP(cluster.getDataNodes().get(0), poolId); - DatanodeDescriptor dd = namesystem.getDatanode(nodeReg); + namesystem.readLock(); + DatanodeDescriptor dd; + try { + dd = namesystem.getDatanode(nodeReg); + } finally { + namesystem.readUnlock(); + } final int REMAINING_BLOCKS = 1; final int MAX_REPLICATE_LIMIT = Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestNNThroughputBenchmark.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestNNThroughputBenchmark.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestNNThroughputBenchmark.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestNNThroughputBenchmark.java Sun Jun 12 18:17:05 2011 @@ -24,7 +24,6 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.hdfs.HdfsConfiguration; -import org.apache.hadoop.test.GenericTestUtils; import org.junit.Test; public class TestNNThroughputBenchmark { Modified: hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestSafeMode.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestSafeMode.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestSafeMode.java (original) +++ hadoop/hdfs/trunk/src/test/hdfs/org/apache/hadoop/hdfs/server/namenode/TestSafeMode.java Sun Jun 12 18:17:05 2011 @@ -20,109 +20,31 @@ package org.apache.hadoop.hdfs.server.na import java.io.IOException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.protocol.FSConstants.SafeModeAction; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; -import org.apache.hadoop.hdfs.DFSTestUtil; -import junit.framework.TestCase; + +import org.junit.Test; +import static org.junit.Assert.*; /** * Tests to verify safe mode correctness. */ -public class TestSafeMode extends TestCase { +public class TestSafeMode { - static Log LOG = LogFactory.getLog(TestSafeMode.class); - - /** - * This test verifies that if SafeMode is manually entered, name-node does not - * come out of safe mode even after the startup safe mode conditions are met. - *
    - *
  1. Start cluster with 1 data-node.
  2. - *
  3. Create 2 files with replication 1.
  4. - *
  5. Re-start cluster with 0 data-nodes. - * Name-node should stay in automatic safe-mode.
  6. - *
  7. Enter safe mode manually.
  8. - *
  9. Start the data-node.
  10. - *
  11. Wait longer than dfs.namenode.safemode.extension and - * verify that the name-node is still in safe mode.
  12. - *
- * - * @throws IOException - */ - public void testManualSafeMode() throws IOException { - MiniDFSCluster cluster = null; - DistributedFileSystem fs = null; - try { - Configuration conf = new HdfsConfiguration(); - // disable safemode extension to make the test run faster. - conf.set(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_EXTENSION_KEY, "1"); - cluster = new MiniDFSCluster.Builder(conf).build(); - cluster.waitActive(); - - fs = (DistributedFileSystem)cluster.getFileSystem(); - Path file1 = new Path("/tmp/testManualSafeMode/file1"); - Path file2 = new Path("/tmp/testManualSafeMode/file2"); - - LOG.info("Created file1 and file2."); - - // create two files with one block each. - DFSTestUtil.createFile(fs, file1, 1000, (short)1, 0); - DFSTestUtil.createFile(fs, file2, 2000, (short)1, 0); - fs.close(); - cluster.shutdown(); - - // now bring up just the NameNode. - cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0).format(false).build(); - cluster.waitActive(); - fs = (DistributedFileSystem)cluster.getFileSystem(); - - LOG.info("Restarted cluster with just the NameNode"); - - assertTrue("No datanode is started. Should be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - - // manually set safemode. - fs.setSafeMode(SafeModeAction.SAFEMODE_ENTER); - - // now bring up the datanode and wait for it to be active. - cluster.startDataNodes(conf, 1, true, null, null); - cluster.waitActive(); - - LOG.info("Datanode is started."); - - // wait longer than dfs.namenode.safemode.extension - try { - Thread.sleep(2000); - } catch (InterruptedException ignored) {} - - assertTrue("should still be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - - fs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE); - assertFalse("should not be in SafeMode", - fs.setSafeMode(SafeModeAction.SAFEMODE_GET)); - } finally { - if(fs != null) fs.close(); - if(cluster!= null) cluster.shutdown(); - } - } - - /** * Verify that the NameNode stays in safemode when dfs.safemode.datanode.min * is set to a number greater than the number of live datanodes. */ + @Test public void testDatanodeThreshold() throws IOException { MiniDFSCluster cluster = null; DistributedFileSystem fs = null; try { - Configuration conf = new Configuration(); + Configuration conf = new HdfsConfiguration(); conf.setInt(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_EXTENSION_KEY, 0); conf.setInt(DFSConfigKeys.DFS_NAMENODE_SAFEMODE_MIN_DATANODES_KEY, 1); Modified: hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java URL: http://svn.apache.org/viewvc/hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java?rev=1134951&r1=1134950&r2=1134951&view=diff ============================================================================== --- hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java (original) +++ hadoop/hdfs/trunk/src/test/unit/org/apache/hadoop/hdfs/server/namenode/TestNNLeaseRecovery.java Sun Jun 12 18:17:05 2011 @@ -39,7 +39,8 @@ import org.apache.hadoop.hdfs.server.com import org.apache.hadoop.test.GenericTestUtils; import org.apache.log4j.Level; import org.junit.After; -import static org.junit.Assert.assertFalse; + +import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; import static org.mockito.Matchers.anyString; @@ -99,6 +100,17 @@ public class TestNNLeaseRecovery { } } + // Release the lease for the given file + private boolean releaseLease(FSNamesystem ns, LeaseManager.Lease lm, + Path file) throws IOException { + fsn.writeLock(); + try { + return fsn.internalReleaseLease(lm, file.toString(), null); + } finally { + fsn.writeUnlock(); + } + } + /** * Mocks FSNamesystem instance, adds an empty file and invokes lease recovery * method. @@ -118,7 +130,7 @@ public class TestNNLeaseRecovery { fsn.dir.addFile(file.toString(), ps, (short)3, 1l, "test", "test-machine", dnd, 1001l); assertTrue("True has to be returned in this case", - fsn.internalReleaseLease(lm, file.toString(), null)); + releaseLease(fsn, lm, file)); } /** @@ -143,9 +155,9 @@ public class TestNNLeaseRecovery { mockFileBlocks(2, null, HdfsConstants.BlockUCState.UNDER_CONSTRUCTION, file, dnd, ps, false); - fsn.internalReleaseLease(lm, file.toString(), null); - assertTrue("FSNamesystem.internalReleaseLease suppose to throw " + - "IOException here", false); + releaseLease(fsn, lm, file); + fail("FSNamesystem.internalReleaseLease suppose to throw " + + "IOException here"); } /** @@ -169,15 +181,14 @@ public class TestNNLeaseRecovery { mockFileBlocks(2, HdfsConstants.BlockUCState.COMMITTED, HdfsConstants.BlockUCState.COMMITTED, file, dnd, ps, false); - fsn.internalReleaseLease(lm, file.toString(), null); - assertTrue("FSNamesystem.internalReleaseLease suppose to throw " + - "AlreadyBeingCreatedException here", false); + releaseLease(fsn, lm, file); + fail("FSNamesystem.internalReleaseLease suppose to throw " + + "IOException here"); } /** * Mocks FSNamesystem instance, adds an empty file with 0 blocks * and invokes lease recovery method. - * */ @Test public void testInternalReleaseLease_0blocks () throws IOException { @@ -194,7 +205,7 @@ public class TestNNLeaseRecovery { mockFileBlocks(0, null, null, file, dnd, ps, false); assertTrue("True has to be returned in this case", - fsn.internalReleaseLease(lm, file.toString(), null)); + releaseLease(fsn, lm, file)); } /** @@ -217,9 +228,9 @@ public class TestNNLeaseRecovery { mockFileBlocks(1, null, HdfsConstants.BlockUCState.COMMITTED, file, dnd, ps, false); - fsn.internalReleaseLease(lm, file.toString(), null); - assertTrue("FSNamesystem.internalReleaseLease suppose to throw " + - "AlreadyBeingCreatedException here", false); + releaseLease(fsn, lm, file); + fail("FSNamesystem.internalReleaseLease suppose to throw " + + "IOException here"); } /** @@ -244,7 +255,7 @@ public class TestNNLeaseRecovery { HdfsConstants.BlockUCState.UNDER_CONSTRUCTION, file, dnd, ps, false); assertFalse("False is expected in return in this case", - fsn.internalReleaseLease(lm, file.toString(), null)); + releaseLease(fsn, lm, file)); } @Test