Skip to content

Commit

Permalink
HDFS-8153. Error Message points to wrong parent directory in case of …
Browse files Browse the repository at this point in the history
…path component name length error. Contributed by Anu Engineer.
  • Loading branch information
jnp committed Apr 17, 2015
1 parent bb6dde6 commit 369ddc6
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 3 deletions.
3 changes: 3 additions & 0 deletions hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt
Expand Up @@ -543,6 +543,9 @@ Release 2.7.1 - UNRELEASED
HDFS-8149. The footer of the Web UI "Hadoop, 2014" is old.
(Brahma Reddy Battula via aajisaka)

HDFS-8153. Error Message points to wrong parent directory in case of
path component name length error (Anu Engineer via jitendra)

Release 2.7.0 - UNRELEASED

INCOMPATIBLE CHANGES
Expand Down
Expand Up @@ -972,7 +972,7 @@ public INodesInPath addLastINode(INodesInPath existing, INode inode,
// original location because a quota violation would cause the the item
// to go "poof". The fs limits must be bypassed for the same reason.
if (checkQuota) {
final String parentPath = existing.getPath(pos - 1);
final String parentPath = existing.getPath();
verifyMaxComponentLength(inode.getLocalNameBytes(), parentPath);
verifyMaxDirItems(parent, parentPath);
}
Expand Down
Expand Up @@ -20,6 +20,7 @@

import static org.apache.hadoop.hdfs.server.common.Util.fileAsURI;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;

Expand Down Expand Up @@ -173,29 +174,107 @@ public void testDuringEditLogs() throws Exception {
HadoopIllegalArgumentException.class);
}

private void mkdirs(String name, Class<?> expected)
@Test
/**
* This test verifies that error string contains the
* right parent directory name if the operation fails with
* PathComponentTooLongException
*/
public void testParentDirectoryNameIsCorrect() throws Exception {
conf.setInt(DFSConfigKeys.DFS_NAMENODE_MAX_COMPONENT_LENGTH_KEY, 20);
mkdirs("/user", null);
mkdirs("/user/testHome", null);
mkdirs("/user/testHome/FileNameLength", null);

mkdirCheckParentDirectory(
"/user/testHome/FileNameLength/really_big_name_0003_fail",
"/user/testHome/FileNameLength", PathComponentTooLongException.class);

renameCheckParentDirectory("/user/testHome/FileNameLength",
"/user/testHome/really_big_name_0003_fail", "/user/testHome/",
PathComponentTooLongException.class);

}


/**
* Verifies that Parent Directory is correct after a failed call to mkdir
* @param name Directory Name
* @param ParentDirName Expected Parent Directory
* @param expected Exception that is expected
* @throws Exception
*/
private void mkdirCheckParentDirectory(String name, String ParentDirName,
Class<?> expected)
throws Exception {
verify(mkdirs(name, expected), ParentDirName);
}

/**
*
/**
* Verifies that Parent Directory is correct after a failed call to mkdir
* @param name Directory Name
* @param dst Destination Name
* @param ParentDirName Expected Parent Directory
* @param expected Exception that is expected
* @throws Exception
*/
private void renameCheckParentDirectory(String name, String dst,
String ParentDirName,
Class<?> expected)
throws Exception {
verify(rename(name, dst, expected), ParentDirName);
}

/**
* verifies the ParentDirectory Name is present in the message given.
* @param message - Expection Message
* @param ParentDirName - Parent Directory Name to look for.
*/
private void verify(String message, String ParentDirName) {
boolean found = false;
if (message != null) {
String[] tokens = message.split("\\s+");
for (String token : tokens) {
if (token != null && token.equals(ParentDirName)) {
found = true;
break;
}
}
}
assertTrue(found);
}

private String mkdirs(String name, Class<?> expected)
throws Exception {
lazyInitFSDirectory();
Class<?> generated = null;
String errorString = null;
try {
fs.mkdirs(name, perms, false);
} catch (Throwable e) {
generated = e.getClass();
e.printStackTrace();
errorString = e.getMessage();
}
assertEquals(expected, generated);
return errorString;
}

private void rename(String src, String dst, Class<?> expected)
private String rename(String src, String dst, Class<?> expected)
throws Exception {
lazyInitFSDirectory();
Class<?> generated = null;
String errorString = null;
try {
fs.renameTo(src, dst, false, new Rename[] { });
} catch (Throwable e) {
generated = e.getClass();
errorString = e.getMessage();
}
assertEquals(expected, generated);
return errorString;
}

@SuppressWarnings("deprecation")
Expand Down

0 comments on commit 369ddc6

Please sign in to comment.