Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeJspHelper.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeJspHelper.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeJspHelper.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNameNodeJspHelper.java Thu Oct 17 02:14:33 2013 @@ -17,44 +17,71 @@ */ package org.apache.hadoop.hdfs.server.namenode; - -import static org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase.*; -import static org.mockito.Mockito.*; +import static org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase.LOADING_EDITS; +import static org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase.LOADING_FSIMAGE; +import static org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase.SAFEMODE; +import static org.apache.hadoop.hdfs.server.namenode.startupprogress.Phase.SAVING_CHECKPOINT; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspWriter; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeDescriptor; +import org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager; +import org.apache.hadoop.hdfs.server.common.JspHelper; +import org.apache.hadoop.hdfs.server.datanode.DataNode; import org.apache.hadoop.hdfs.server.namenode.startupprogress.StartupProgress; import org.apache.hadoop.hdfs.server.protocol.NamenodeProtocols; +import org.apache.hadoop.hdfs.web.resources.UserParam; import org.apache.hadoop.security.UserGroupInformation; -import org.junit.After; +import org.apache.hadoop.util.VersionInfo; +import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.znerd.xmlenc.XMLOutputter; -public class TestNameNodeJspHelper { +import com.google.common.collect.ImmutableSet; - private MiniDFSCluster cluster = null; - Configuration conf = null; +public class TestNameNodeJspHelper { - @Before - public void setUp() throws Exception { + private static final int DATA_NODES_AMOUNT = 2; + + private static MiniDFSCluster cluster; + private static Configuration conf; + private static final String NAMENODE_ATTRIBUTE_KEY = "name.node"; + + @BeforeClass + public static void setUp() throws Exception { conf = new HdfsConfiguration(); - cluster = new MiniDFSCluster.Builder(conf).build(); - cluster.waitActive(); + cluster = new MiniDFSCluster.Builder(conf) + .numDataNodes(DATA_NODES_AMOUNT).build(); + cluster.waitClusterUp(); } - @After - public void tearDown() throws Exception { + @AfterClass + public static void tearDown() throws Exception { if (cluster != null) cluster.shutdown(); } @@ -66,23 +93,23 @@ public class TestNameNodeJspHelper { UserGroupInformation ugi = UserGroupInformation.createRemoteUser("auser"); String tokenString = NamenodeJspHelper.getDelegationToken(nn, request, conf, ugi); - //tokenString returned must be null because security is disabled + // tokenString returned must be null because security is disabled Assert.assertEquals(null, tokenString); } - + @Test - public void tesSecurityModeText() { + public void testSecurityModeText() { conf.set(DFSConfigKeys.HADOOP_SECURITY_AUTHENTICATION, "kerberos"); UserGroupInformation.setConfiguration(conf); String securityOnOff = NamenodeJspHelper.getSecurityModeText(); - Assert.assertTrue("security mode doesn't match. Should be ON", + Assert.assertTrue("security mode doesn't match. Should be ON", securityOnOff.contains("ON")); - //Security is enabled + // Security is enabled conf.set(DFSConfigKeys.HADOOP_SECURITY_AUTHENTICATION, "simple"); UserGroupInformation.setConfiguration(conf); - + securityOnOff = NamenodeJspHelper.getSecurityModeText(); - Assert.assertTrue("security mode doesn't match. Should be OFF", + Assert.assertTrue("security mode doesn't match. Should be OFF", securityOnOff.contains("OFF")); } @@ -107,9 +134,83 @@ public class TestNameNodeJspHelper { Assert.assertTrue(containsMatch(contents, SAFEMODE.getDescription())); } + @Test + public void testGetRollingUpgradeText() { + Assert.assertEquals("", NamenodeJspHelper.getRollingUpgradeText(null)); + } + + /** + * Tests for non-null, non-empty NameNode label. + */ + @Test + public void testGetNameNodeLabel() { + String nameNodeLabel = NamenodeJspHelper.getNameNodeLabel( + cluster.getNameNode()); + Assert.assertNotNull(nameNodeLabel); + Assert.assertFalse(nameNodeLabel.isEmpty()); + } + + /** + * Tests for non-null, non-empty NameNode label when called before + * initialization of the NameNode RPC server. + */ + @Test + public void testGetNameNodeLabelNullRpcServer() { + NameNode nn = mock(NameNode.class); + when(nn.getRpcServer()).thenReturn(null); + String nameNodeLabel = NamenodeJspHelper.getNameNodeLabel( + cluster.getNameNode()); + Assert.assertNotNull(nameNodeLabel); + Assert.assertFalse(nameNodeLabel.isEmpty()); + } + + /** + * Tests that passing a null FSNamesystem to generateSnapshotReport does not + * throw NullPointerException. + */ + @Test + public void testGenerateSnapshotReportNullNamesystem() throws Exception { + NamenodeJspHelper.generateSnapshotReport(mock(JspWriter.class), null); + } + + /** + * Tests that redirectToRandomDataNode does not throw NullPointerException if + * it finds a null FSNamesystem. + */ + @Test(expected=IOException.class) + public void testRedirectToRandomDataNodeNullNamesystem() throws Exception { + NameNode nn = mock(NameNode.class); + when(nn.getNamesystem()).thenReturn(null); + ServletContext context = mock(ServletContext.class); + when(context.getAttribute("name.node")).thenReturn(nn); + NamenodeJspHelper.redirectToRandomDataNode(context, + mock(HttpServletRequest.class), mock(HttpServletResponse.class)); + } + + /** + * Tests that XMLBlockInfo does not throw NullPointerException if it finds a + * null FSNamesystem. + */ + @Test + public void testXMLBlockInfoNullNamesystem() throws IOException { + XMLOutputter doc = new XMLOutputter(mock(JspWriter.class), "UTF-8"); + new NamenodeJspHelper.XMLBlockInfo(null, 1L).toXML(doc); + } + + /** + * Tests that XMLCorruptBlockInfo does not throw NullPointerException if it + * finds a null FSNamesystem. + */ + @Test + public void testXMLCorruptBlockInfoNullNamesystem() throws IOException { + XMLOutputter doc = new XMLOutputter(mock(JspWriter.class), "UTF-8"); + new NamenodeJspHelper.XMLCorruptBlockInfo(null, mock(Configuration.class), + 10, 1L).toXML(doc); + } + /** * Checks if the list contains any string that partially matches the regex. - * + * * @param list List<String> containing strings to check * @param regex String regex to check * @return boolean true if some string in list partially matches regex @@ -123,4 +224,149 @@ public class TestNameNodeJspHelper { } return false; } + + @Test(timeout = 15000) + public void testGetRandomDatanode() { + ImmutableSet<String> set = ImmutableSet.of(); + NameNode nameNode = cluster.getNameNode(); + ImmutableSet.Builder<String> builder = ImmutableSet.builder(); + for (DataNode dataNode : cluster.getDataNodes()) { + builder.add(dataNode.getDisplayName()); + } + set = builder.build(); + + for (int i = 0; i < 10; i++) { + DatanodeDescriptor dnDescriptor = NamenodeJspHelper + .getRandomDatanode(nameNode); + assertTrue("testGetRandomDatanode error", + set.contains(dnDescriptor.toString())); + } + } + + @Test(timeout = 15000) + public void testNamenodeJspHelperRedirectToRandomDataNode() throws IOException, InterruptedException { + final String urlPart = "browseDirectory.jsp?namenodeInfoPort="; + + ServletContext context = mock(ServletContext.class); + HttpServletRequest request = mock(HttpServletRequest.class); + HttpServletResponse resp = mock(HttpServletResponse.class); + + when(request.getScheme()).thenReturn("http"); + when(request.getParameter(UserParam.NAME)).thenReturn("localuser"); + when(context.getAttribute(NAMENODE_ATTRIBUTE_KEY)).thenReturn( + cluster.getNameNode()); + when(context.getAttribute(JspHelper.CURRENT_CONF)).thenReturn(conf); + ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); + doAnswer(new Answer<String>() { + @Override + public String answer(InvocationOnMock invocation) throws Throwable { + return null; + } + }).when(resp).sendRedirect(captor.capture()); + + NamenodeJspHelper.redirectToRandomDataNode(context, request, resp); + assertTrue(captor.getValue().contains(urlPart)); + } + + private enum DataNodeStatus { + LIVE("[Live Datanodes(| +):(| +)]\\d"), + DEAD("[Dead Datanodes(| +):(| +)]\\d"); + + private Pattern pattern; + + public Pattern getPattern() { + return pattern; + } + + DataNodeStatus(String line) { + this.pattern = Pattern.compile(line); + } + } + + private void checkDeadLiveNodes(NameNode nameNode, int deadCount, + int lifeCount) { + FSNamesystem ns = nameNode.getNamesystem(); + DatanodeManager dm = ns.getBlockManager().getDatanodeManager(); + List<DatanodeDescriptor> live = new ArrayList<DatanodeDescriptor>(); + List<DatanodeDescriptor> dead = new ArrayList<DatanodeDescriptor>(); + dm.fetchDatanodes(live, dead, true); + assertTrue("checkDeadLiveNodes error !!!", (live.size() == lifeCount) + && dead.size() == deadCount); + } + + @Test(timeout = 15000) + public void testNodeListJspGenerateNodesList() throws IOException { + String output; + NameNode nameNode = cluster.getNameNode(); + ServletContext context = mock(ServletContext.class); + when(context.getAttribute("name.node")).thenReturn(nameNode); + when(context.getAttribute(NameNodeHttpServer.NAMENODE_ADDRESS_ATTRIBUTE_KEY)) + .thenReturn(cluster.getNameNode().getHttpAddress()); + checkDeadLiveNodes(nameNode, 0, DATA_NODES_AMOUNT); + output = getOutputFromGeneratedNodesList(context, DataNodeStatus.LIVE); + assertCounts(DataNodeStatus.LIVE, output, DATA_NODES_AMOUNT); + output = getOutputFromGeneratedNodesList(context, DataNodeStatus.DEAD); + assertCounts(DataNodeStatus.DEAD, output, 0); + } + + private void assertCounts(DataNodeStatus dataNodeStatus, String output, + int expectedCount) { + Matcher matcher = DataNodeStatus.LIVE.getPattern().matcher(output); + if (matcher.find()) { + String digitLine = output.substring(matcher.start(), matcher.end()) + .trim(); + assertTrue("assertCounts error. actual != expected", + Integer.valueOf(digitLine) == expectedCount); + } else { + fail("assertCount matcher error"); + } + } + + private String getOutputFromGeneratedNodesList(ServletContext context, + DataNodeStatus dnStatus) throws IOException { + JspWriter out = mock(JspWriter.class); + ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); + NamenodeJspHelper.NodeListJsp nodelistjsp = new NamenodeJspHelper.NodeListJsp(); + final StringBuffer buffer = new StringBuffer(); + doAnswer(new Answer<String>() { + @Override + public String answer(InvocationOnMock invok) { + Object[] args = invok.getArguments(); + buffer.append((String) args[0]); + return null; + } + }).when(out).print(captor.capture()); + HttpServletRequest request = mock(HttpServletRequest.class); + when(request.getScheme()).thenReturn("http"); + when(request.getParameter("whatNodes")).thenReturn(dnStatus.name()); + nodelistjsp.generateNodesList(context, out, request); + return buffer.toString(); + } + + @Test(timeout = 15000) + public void testGetInodeLimitText() { + NameNode nameNode = cluster.getNameNode(); + FSNamesystem fsn = nameNode.getNamesystem(); + ImmutableSet<String> patterns = + ImmutableSet.of("files and directories", "Heap Memory used", "Non Heap Memory used"); + String line = NamenodeJspHelper.getInodeLimitText(fsn); + for(String pattern: patterns) { + assertTrue("testInodeLimitText error " + pattern, + line.contains(pattern)); + } + } + + @Test(timeout = 15000) + public void testGetVersionTable() { + NameNode nameNode = cluster.getNameNode(); + FSNamesystem fsn = nameNode.getNamesystem(); + ImmutableSet<String> patterns = ImmutableSet.of(VersionInfo.getVersion(), + VersionInfo.getRevision(), VersionInfo.getUser(), VersionInfo.getBranch(), + fsn.getClusterId(), fsn.getBlockPoolId()); + String line = NamenodeJspHelper.getVersionTable(fsn); + for(String pattern: patterns) { + assertTrue("testGetVersionTable error " + pattern, + line.contains(pattern)); + } + } }
Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNamenodeRetryCache.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNamenodeRetryCache.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNamenodeRetryCache.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestNamenodeRetryCache.java Thu Oct 17 02:14:33 2013 @@ -21,6 +21,7 @@ package org.apache.hadoop.hdfs.server.na import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.IOException; import java.util.EnumSet; @@ -35,11 +36,15 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.UnresolvedLinkException; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.fs.permission.PermissionStatus; +import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.HdfsConfiguration; import org.apache.hadoop.hdfs.MiniDFSCluster; +import org.apache.hadoop.hdfs.MiniDFSNNTopology; +import org.apache.hadoop.hdfs.protocol.DatanodeID; +import org.apache.hadoop.hdfs.protocol.ExtendedBlock; import org.apache.hadoop.hdfs.protocol.HdfsFileStatus; import org.apache.hadoop.hdfs.protocol.LocatedBlock; import org.apache.hadoop.ipc.ClientId; @@ -47,7 +52,9 @@ import org.apache.hadoop.ipc.RPC.RpcKind import org.apache.hadoop.ipc.RetryCache.CacheEntry; import org.apache.hadoop.ipc.RpcConstants; import org.apache.hadoop.ipc.Server; +import org.apache.hadoop.ipc.StandbyException; import org.apache.hadoop.security.AccessControlException; +import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.util.LightWeightCache; import org.junit.After; import org.junit.Assert; @@ -75,12 +82,13 @@ public class TestNamenodeRetryCache { "TestNamenodeRetryCache", null, FsPermission.getDefault()); private static DistributedFileSystem filesystem; private static int callId = 100; - private static Configuration conf = new HdfsConfiguration(); + private static Configuration conf; private static final int BlockSize = 512; /** Start a cluster */ @Before public void setup() throws Exception { + conf = new HdfsConfiguration(); conf.setLong(DFSConfigKeys.DFS_BLOCK_SIZE_KEY, BlockSize); conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_ENABLE_RETRY_CACHE_KEY, true); cluster = new MiniDFSCluster.Builder(conf).build(); @@ -294,6 +302,40 @@ public class TestNamenodeRetryCache { } /** + * Make sure a retry call does not hang because of the exception thrown in the + * first call. + */ + @Test(timeout = 60000) + public void testUpdatePipelineWithFailOver() throws Exception { + cluster.shutdown(); + namesystem = null; + filesystem = null; + cluster = new MiniDFSCluster.Builder(conf).nnTopology( + MiniDFSNNTopology.simpleHATopology()).numDataNodes(1).build(); + FSNamesystem ns0 = cluster.getNamesystem(0); + ExtendedBlock oldBlock = new ExtendedBlock(); + ExtendedBlock newBlock = new ExtendedBlock(); + DatanodeID[] newNodes = new DatanodeID[2]; + + newCall(); + try { + ns0.updatePipeline("testClient", oldBlock, newBlock, newNodes); + fail("Expect StandbyException from the updatePipeline call"); + } catch (StandbyException e) { + // expected, since in the beginning both nn are in standby state + GenericTestUtils.assertExceptionContains( + HAServiceState.STANDBY.toString(), e); + } + + cluster.transitionToActive(0); + try { + ns0.updatePipeline("testClient", oldBlock, newBlock, newNodes); + } catch (IOException e) { + // ignore call should not hang. + } + } + + /** * Test for crateSnapshot */ @Test Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestStartupProgressServlet.java Thu Oct 17 02:14:33 2013 @@ -73,24 +73,28 @@ public class TestStartupProgressServlet .put("phases", Arrays.<Object>asList( ImmutableMap.<String, Object>builder() .put("name", "LoadingFsImage") + .put("desc", "Loading fsimage") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) .build(), ImmutableMap.<String, Object>builder() .put("name", "LoadingEdits") + .put("desc", "Loading edits") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) .build(), ImmutableMap.<String, Object>builder() .put("name", "SavingCheckpoint") + .put("desc", "Saving checkpoint") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) .build(), ImmutableMap.<String, Object>builder() .put("name", "SafeMode") + .put("desc", "Safe mode") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) @@ -111,11 +115,13 @@ public class TestStartupProgressServlet .put("phases", Arrays.<Object>asList( ImmutableMap.<String, Object>builder() .put("name", "LoadingFsImage") + .put("desc", "Loading fsimage") .put("status", "COMPLETE") .put("percentComplete", 1.0f) .put("steps", Collections.<Object>singletonList( ImmutableMap.<String, Object>builder() .put("name", "Inodes") + .put("desc", "inodes") .put("count", 100L) .put("total", 100L) .put("percentComplete", 1.0f) @@ -124,6 +130,7 @@ public class TestStartupProgressServlet .build(), ImmutableMap.<String, Object>builder() .put("name", "LoadingEdits") + .put("desc", "Loading edits") .put("status", "RUNNING") .put("percentComplete", 0.5f) .put("steps", Collections.<Object>singletonList( @@ -138,12 +145,14 @@ public class TestStartupProgressServlet .build(), ImmutableMap.<String, Object>builder() .put("name", "SavingCheckpoint") + .put("desc", "Saving checkpoint") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) .build(), ImmutableMap.<String, Object>builder() .put("name", "SafeMode") + .put("desc", "Safe mode") .put("status", "PENDING") .put("percentComplete", 0.0f) .put("steps", Collections.emptyList()) @@ -164,11 +173,13 @@ public class TestStartupProgressServlet .put("phases", Arrays.<Object>asList( ImmutableMap.<String, Object>builder() .put("name", "LoadingFsImage") + .put("desc", "Loading fsimage") .put("status", "COMPLETE") .put("percentComplete", 1.0f) .put("steps", Collections.<Object>singletonList( ImmutableMap.<String, Object>builder() .put("name", "Inodes") + .put("desc", "inodes") .put("count", 100L) .put("total", 100L) .put("percentComplete", 1.0f) @@ -177,6 +188,7 @@ public class TestStartupProgressServlet .build(), ImmutableMap.<String, Object>builder() .put("name", "LoadingEdits") + .put("desc", "Loading edits") .put("status", "COMPLETE") .put("percentComplete", 1.0f) .put("steps", Collections.<Object>singletonList( @@ -191,11 +203,13 @@ public class TestStartupProgressServlet .build(), ImmutableMap.<String, Object>builder() .put("name", "SavingCheckpoint") + .put("desc", "Saving checkpoint") .put("status", "COMPLETE") .put("percentComplete", 1.0f) .put("steps", Collections.<Object>singletonList( ImmutableMap.<String, Object>builder() .put("name", "Inodes") + .put("desc", "inodes") .put("count", 300L) .put("total", 300L) .put("percentComplete", 1.0f) @@ -204,11 +218,13 @@ public class TestStartupProgressServlet .build(), ImmutableMap.<String, Object>builder() .put("name", "SafeMode") + .put("desc", "Safe mode") .put("status", "COMPLETE") .put("percentComplete", 1.0f) .put("steps", Collections.<Object>singletonList( ImmutableMap.<String, Object>builder() .put("name", "AwaitingReportedBlocks") + .put("desc", "awaiting reported blocks") .put("count", 400L) .put("total", 400L) .put("percentComplete", 1.0f) Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDNFencing.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDNFencing.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDNFencing.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDNFencing.java Thu Oct 17 02:14:33 2013 @@ -96,8 +96,8 @@ public class TestDNFencing { // Increase max streams so that we re-replicate quickly. conf.setInt(DFSConfigKeys.DFS_NAMENODE_REPLICATION_MAX_STREAMS_KEY, 1000); // See RandomDeleterPolicy javadoc. - conf.setClass("dfs.block.replicator.classname", RandomDeleterPolicy.class, - BlockPlacementPolicy.class); + conf.setClass(DFSConfigKeys.DFS_BLOCK_REPLICATOR_CLASSNAME_KEY, + RandomDeleterPolicy.class, BlockPlacementPolicy.class); conf.setInt(DFSConfigKeys.DFS_HA_TAILEDITS_PERIOD_KEY, 1); cluster = new MiniDFSCluster.Builder(conf) .nnTopology(MiniDFSNNTopology.simpleHATopology()) Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestDelegationTokensWithHA.java Thu Oct 17 02:14:33 2013 @@ -39,6 +39,7 @@ import org.apache.hadoop.conf.Configurat import org.apache.hadoop.fs.AbstractFileSystem; import org.apache.hadoop.fs.CommonConfigurationKeysPublic; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState; import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.HAUtil; @@ -47,19 +48,22 @@ import org.apache.hadoop.hdfs.MiniDFSNNT import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenIdentifier; import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenSecretManager; import org.apache.hadoop.hdfs.security.token.delegation.DelegationTokenSelector; +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 org.apache.hadoop.io.Text; +import org.apache.hadoop.ipc.RetriableException; +import org.apache.hadoop.ipc.StandbyException; import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.SecurityUtilTestHelper; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.security.token.TokenIdentifier; import org.apache.hadoop.test.GenericTestUtils; -import org.junit.AfterClass; +import org.junit.After; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; +import org.mockito.internal.util.reflection.Whitebox; import com.google.common.base.Joiner; @@ -78,8 +82,12 @@ public class TestDelegationTokensWithHA private static DelegationTokenSecretManager dtSecretManager; private static DistributedFileSystem dfs; - @BeforeClass - public static void setupCluster() throws Exception { + private volatile boolean catchup = false; + + @Before + public void setupCluster() throws Exception { + SecurityUtilTestHelper.setTokenServiceUseIp(true); + conf.setBoolean( DFSConfigKeys.DFS_NAMENODE_DELEGATION_TOKEN_ALWAYS_USE_KEY, true); conf.set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTH_TO_LOCAL, @@ -101,18 +109,12 @@ public class TestDelegationTokensWithHA nn0.getNamesystem()); } - @AfterClass - public static void shutdownCluster() throws IOException { + @After + public void shutdownCluster() throws IOException { if (cluster != null) { cluster.shutdown(); } } - - - @Before - public void prepTest() { - SecurityUtilTestHelper.setTokenServiceUseIp(true); - } @Test public void testDelegationTokenDFSApi() throws Exception { @@ -155,6 +157,96 @@ public class TestDelegationTokensWithHA doRenewOrCancel(token, clientConf, TokenTestAction.CANCEL); } + private class EditLogTailerForTest extends EditLogTailer { + public EditLogTailerForTest(FSNamesystem namesystem, Configuration conf) { + super(namesystem, conf); + } + + public void catchupDuringFailover() throws IOException { + synchronized (TestDelegationTokensWithHA.this) { + while (!catchup) { + try { + LOG.info("The editlog tailer is waiting to catchup..."); + TestDelegationTokensWithHA.this.wait(); + } catch (InterruptedException e) {} + } + } + super.catchupDuringFailover(); + } + } + + /** + * Test if correct exception (StandbyException or RetriableException) can be + * thrown during the NN failover. + */ + @Test + public void testDelegationTokenDuringNNFailover() throws Exception { + EditLogTailer editLogTailer = nn1.getNamesystem().getEditLogTailer(); + // stop the editLogTailer of nn1 + editLogTailer.stop(); + Configuration conf = (Configuration) Whitebox.getInternalState( + editLogTailer, "conf"); + nn1.getNamesystem().setEditLogTailerForTests( + new EditLogTailerForTest(nn1.getNamesystem(), conf)); + + // create token + final Token<DelegationTokenIdentifier> token = + getDelegationToken(fs, "JobTracker"); + DelegationTokenIdentifier identifier = new DelegationTokenIdentifier(); + byte[] tokenId = token.getIdentifier(); + identifier.readFields(new DataInputStream( + new ByteArrayInputStream(tokenId))); + + // Ensure that it's present in the nn0 secret manager and can + // be renewed directly from there. + LOG.info("A valid token should have non-null password, " + + "and should be renewed successfully"); + assertTrue(null != dtSecretManager.retrievePassword(identifier)); + dtSecretManager.renewToken(token, "JobTracker"); + + // transition nn0 to standby + cluster.transitionToStandby(0); + + try { + cluster.getNameNodeRpc(0).renewDelegationToken(token); + fail("StandbyException is expected since nn0 is in standby state"); + } catch (StandbyException e) { + GenericTestUtils.assertExceptionContains( + HAServiceState.STANDBY.toString(), e); + } + + new Thread() { + @Override + public void run() { + try { + cluster.transitionToActive(1); + } catch (Exception e) { + LOG.error("Transition nn1 to active failed", e); + } + } + }.start(); + + Thread.sleep(1000); + try { + nn1.getNamesystem().verifyToken(token.decodeIdentifier(), + token.getPassword()); + fail("RetriableException/StandbyException is expected since nn1 is in transition"); + } catch (IOException e) { + assertTrue(e instanceof StandbyException + || e instanceof RetriableException); + LOG.info("Got expected exception", e); + } + + catchup = true; + synchronized (this) { + this.notifyAll(); + } + + Configuration clientConf = dfs.getConf(); + doRenewOrCancel(token, clientConf, TokenTestAction.RENEW); + doRenewOrCancel(token, clientConf, TokenTestAction.CANCEL); + } + @SuppressWarnings("deprecation") @Test public void testDelegationTokenWithDoAs() throws Exception { Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestHASafeMode.java Thu Oct 17 02:14:33 2013 @@ -17,12 +17,18 @@ */ package org.apache.hadoop.hdfs.server.namenode.ha; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.io.IOException; import java.net.InetSocketAddress; import java.net.URI; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -101,6 +107,50 @@ public class TestHASafeMode { } } + /** + * Make sure the client retries when the active NN is in safemode + */ + @Test (timeout=300000) + public void testClientRetrySafeMode() throws Exception { + final Map<Path, Boolean> results = Collections + .synchronizedMap(new HashMap<Path, Boolean>()); + final Path test = new Path("/test"); + // let nn0 enter safemode + NameNodeAdapter.enterSafeMode(nn0, false); + LOG.info("enter safemode"); + new Thread() { + @Override + public void run() { + try { + boolean mkdir = fs.mkdirs(test); + LOG.info("mkdir finished, result is " + mkdir); + synchronized (TestHASafeMode.this) { + results.put(test, mkdir); + TestHASafeMode.this.notifyAll(); + } + } catch (Exception e) { + LOG.info("Got Exception while calling mkdir", e); + } + } + }.start(); + + // make sure the client's call has actually been handled by the active NN + assertFalse("The directory should not be created while NN in safemode", + fs.exists(test)); + + Thread.sleep(1000); + // let nn0 leave safemode + NameNodeAdapter.leaveSafeMode(nn0); + LOG.info("leave safemode"); + + synchronized (this) { + while (!results.containsKey(test)) { + this.wait(); + } + assertTrue(results.get(test)); + } + } + private void restartStandby() throws IOException { cluster.shutdownNameNode(1); // Set the safemode extension to be lengthy, so that the tests Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRetryCacheWithHA.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRetryCacheWithHA.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRetryCacheWithHA.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/ha/TestRetryCacheWithHA.java Thu Oct 17 02:14:33 2013 @@ -20,6 +20,7 @@ package org.apache.hadoop.hdfs.server.na import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -646,10 +647,14 @@ public class TestRetryCacheWithHA { @Override boolean checkNamenodeBeforeReturn() throws Exception { Path linkPath = new Path(link); - FileStatus linkStatus = dfs.getFileLinkStatus(linkPath); + FileStatus linkStatus = null; for (int i = 0; i < CHECKTIMES && linkStatus == null; i++) { - Thread.sleep(1000); - linkStatus = dfs.getFileLinkStatus(linkPath); + try { + linkStatus = dfs.getFileLinkStatus(linkPath); + } catch (FileNotFoundException fnf) { + // Ignoring, this can be legitimate. + Thread.sleep(1000); + } } return linkStatus != null; } @@ -857,4 +862,4 @@ public class TestRetryCacheWithHA { + results.get(op.name)); } } -} \ No newline at end of file +} Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/metrics/TestNameNodeMetrics.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/metrics/TestNameNodeMetrics.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/metrics/TestNameNodeMetrics.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/metrics/TestNameNodeMetrics.java Thu Oct 17 02:14:33 2013 @@ -192,17 +192,10 @@ public class TestNameNodeMetrics { assertCounter("CreateFileOps", 1L, rb); assertCounter("FilesCreated", (long)file.depth(), rb); - // Blocks are stored in a hashmap. Compute its capacity, which - // doubles every time the number of entries reach the threshold. - int threshold = (int)(blockCapacity * BlockManager.DEFAULT_MAP_LOAD_FACTOR); - while (threshold < blockCount) { - blockCapacity <<= 1; - } long filesTotal = file.depth() + 1; // Add 1 for root rb = getMetrics(NS_METRICS); assertGauge("FilesTotal", filesTotal, rb); assertGauge("BlocksTotal", blockCount, rb); - assertGauge("BlockCapacity", blockCapacity, rb); fs.delete(file, true); filesTotal--; // reduce the filecount for deleted file Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotDeletion.java Thu Oct 17 02:14:33 2013 @@ -23,12 +23,17 @@ import static org.junit.Assert.assertNul import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.PrintStream; +import java.security.PrivilegedAction; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.FsShell; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.hdfs.DFSConfigKeys; import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.hdfs.DFSUtil; import org.apache.hadoop.hdfs.DistributedFileSystem; @@ -45,7 +50,9 @@ import org.apache.hadoop.hdfs.server.nam import org.apache.hadoop.hdfs.server.namenode.Quota; import org.apache.hadoop.hdfs.server.namenode.snapshot.INodeDirectoryWithSnapshot.DirectoryDiffList; import org.apache.hadoop.hdfs.util.ReadOnlyList; +import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.ipc.RemoteException; +import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.test.GenericTestUtils; import org.junit.After; import org.junit.Before; @@ -777,7 +784,40 @@ public class TestSnapshotDeletion { assertEquals("user1", statusOfS1.getOwner()); assertEquals("group1", statusOfS1.getGroup()); } - + + @Test + public void testDeleteSnapshotWithPermissionsDisabled() throws Exception { + cluster.shutdown(); + Configuration newConf = new Configuration(conf); + newConf.setBoolean(DFSConfigKeys.DFS_PERMISSIONS_ENABLED_KEY, false); + cluster = new MiniDFSCluster.Builder(newConf).numDataNodes(0).build(); + cluster.waitActive(); + hdfs = cluster.getFileSystem(); + + final Path path = new Path("/dir"); + hdfs.mkdirs(path); + hdfs.allowSnapshot(path); + hdfs.mkdirs(new Path(path, "/test")); + hdfs.createSnapshot(path, "s1"); + UserGroupInformation anotherUser = UserGroupInformation + .createRemoteUser("anotheruser"); + anotherUser.doAs(new PrivilegedAction<Object>() { + @Override + public Object run() { + DistributedFileSystem anotherUserFS = null; + try { + anotherUserFS = cluster.getFileSystem(); + anotherUserFS.deleteSnapshot(path, "s1"); + } catch (IOException e) { + fail("Failed to delete snapshot : " + e.getLocalizedMessage()); + } finally { + IOUtils.closeStream(anotherUserFS); + } + return null; + } + }); + } + /** * A test covering the case where the snapshot diff to be deleted is renamed * to its previous snapshot. @@ -884,4 +924,29 @@ public class TestSnapshotDeletion { subFile1Status = hdfs.getFileStatus(subFile1SCopy); assertEquals(REPLICATION_1, subFile1Status.getReplication()); } + + @Test + public void testDeleteSnapshotCommandWithIllegalArguments() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream psOut = new PrintStream(out); + System.setOut(psOut); + System.setErr(psOut); + FsShell shell = new FsShell(); + shell.setConf(conf); + + String[] argv1 = {"-deleteSnapshot", "/tmp"}; + int val = shell.run(argv1); + assertTrue(val == -1); + assertTrue(out.toString().contains( + argv1[0] + ": Incorrect number of arguments.")); + out.reset(); + + String[] argv2 = {"-deleteSnapshot", "/tmp", "s1", "s2"}; + val = shell.run(argv2); + assertTrue(val == -1); + assertTrue(out.toString().contains( + argv2[0] + ": Incorrect number of arguments.")); + psOut.close(); + out.close(); + } } Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotRename.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotRename.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotRename.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/snapshot/TestSnapshotRename.java Thu Oct 17 02:14:33 2013 @@ -22,10 +22,13 @@ import static org.junit.Assert.assertFal import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.FsShell; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.DFSTestUtil; import org.apache.hadoop.hdfs.DistributedFileSystem; @@ -226,4 +229,29 @@ public class TestSnapshotRename { } } } + + @Test + public void testRenameSnapshotCommandWithIllegalArguments() throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + PrintStream psOut = new PrintStream(out); + System.setOut(psOut); + System.setErr(psOut); + FsShell shell = new FsShell(); + shell.setConf(conf); + + String[] argv1 = {"-renameSnapshot", "/tmp", "s1"}; + int val = shell.run(argv1); + assertTrue(val == -1); + assertTrue(out.toString().contains( + argv1[0] + ": Incorrect number of arguments.")); + out.reset(); + + String[] argv2 = {"-renameSnapshot", "/tmp", "s1", "s2", "s3"}; + val = shell.run(argv2); + assertTrue(val == -1); + assertTrue(out.toString().contains( + argv2[0] + ": Incorrect number of arguments.")); + psOut.close(); + out.close(); + } } Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/web/WebHdfsTestUtil.java Thu Oct 17 02:14:33 2013 @@ -81,7 +81,7 @@ public class WebHdfsTestUtil { public static HttpURLConnection twoStepWrite(final WebHdfsFileSystem webhdfs, final HttpOpParam.Op op, HttpURLConnection conn) throws IOException { - return webhdfs.new Runner(op, conn).twoStepWrite(); + return webhdfs.new ConnRunner(op, conn).twoStepWrite(); } public static FSDataOutputStream write(final WebHdfsFileSystem webhdfs, Modified: hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testHDFSConf.xml URL: http://svn.apache.org/viewvc/hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testHDFSConf.xml?rev=1532952&r1=1532951&r2=1532952&view=diff ============================================================================== --- hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testHDFSConf.xml (original) +++ hadoop/common/branches/HDFS-4949/hadoop-hdfs-project/hadoop-hdfs/src/test/resources/testHDFSConf.xml Thu Oct 17 02:14:33 2013 @@ -1043,6 +1043,7 @@ <test> <!-- TESTED --> <description>ls: Negative test for quoted /*/* globbing </description> + <windows>false</windows> <test-commands> <command>-fs NAMENODE -mkdir /dir0</command> <command>-fs NAMENODE -mkdir /dir0/dir1</command> @@ -1062,6 +1063,7 @@ <test> <!-- TESTED --> <description>ls: Test for quoted globbing </description> + <windows>false</windows> <test-commands> <command>-fs NAMENODE -mkdir /dir0</command> <command>-fs NAMENODE -mkdir /dir0/\*</command> @@ -1082,6 +1084,7 @@ <test> <!-- TESTED --> <description>rm: Test for quoted globbing </description> + <windows>false</windows> <test-commands> <command>-fs NAMENODE -mkdir /dir0</command> <command>-fs NAMENODE -mkdir /dir0/\*</command> @@ -6049,7 +6052,7 @@ <command>-fs NAMENODE -mkdir /dir0</command> <command>-fs NAMENODE -touchz /dir0/file0</command> <command>-fs NAMENODE -touchz /dir0/file1</command> - <command>-fs NAMENODE -setrep -R 2 /dir0</command> + <command>-fs NAMENODE -setrep 2 /dir0</command> </test-commands> <cleanup-commands> <command>-fs NAMENODE -rm -r /user</command> @@ -6072,7 +6075,7 @@ <command>-fs NAMENODE -mkdir -p dir0</command> <command>-fs NAMENODE -touchz dir0/file0</command> <command>-fs NAMENODE -touchz dir0/file1</command> - <command>-fs NAMENODE -setrep -R 2 dir0</command> + <command>-fs NAMENODE -setrep 2 dir0</command> </test-commands> <cleanup-commands> <command>-fs NAMENODE -rm -r /user</command> @@ -6090,6 +6093,24 @@ </test> <test> <!-- TESTED --> + <description>setrep: -R ignored for existing file</description> + <test-commands> + <command>-fs NAMENODE -mkdir -p dir0</command> + <command>-fs NAMENODE -touchz dir0/file0</command> + <command>-fs NAMENODE -setrep -R 2 dir0/file0</command> + </test-commands> + <cleanup-commands> + <command>-fs NAMENODE -rm -r /user</command> + </cleanup-commands> + <comparators> + <comparator> + <type>RegexpComparator</type> + <expected-output>^Replication 2 set: dir0/file0</expected-output> + </comparator> + </comparators> + </test> + + <test> <!-- TESTED --> <description>setrep: non existent file (absolute path)</description> <test-commands> <command>-fs NAMENODE -setrep 2 /dir0/file</command> @@ -6145,7 +6166,7 @@ <command>-fs NAMENODE -mkdir hdfs:///dir0/</command> <command>-fs NAMENODE -touchz hdfs:///dir0/file0</command> <command>-fs NAMENODE -touchz hdfs:///dir0/file1</command> - <command>-fs NAMENODE -setrep -R 2 hdfs:///dir0</command> + <command>-fs NAMENODE -setrep 2 hdfs:///dir0</command> </test-commands> <cleanup-commands> <command>-fs NAMENODE -rm -r hdfs:///*</command> @@ -6203,7 +6224,7 @@ <command>-fs NAMENODE -mkdir -p NAMENODE/dir0</command> <command>-fs NAMENODE -touchz NAMENODE/dir0/file0</command> <command>-fs NAMENODE -touchz NAMENODE/dir0/file1</command> - <command>-fs NAMENODE -setrep -R 2 NAMENODE/dir0</command> + <command>-fs NAMENODE -setrep 2 NAMENODE/dir0</command> </test-commands> <cleanup-commands> <command>-fs NAMENODE -rm -r NAMENODE/*</command>