HDFS-8153. Error Message points to wrong parent directory in case of path component name length error. Contributed by Anu Engineer.

cherry picked from 369ddc67bd
This commit is contained in:
Jitendra Pandey 2015-04-16 22:15:57 -07:00
parent cffc801ecb
commit 0743f128a0
3 changed files with 85 additions and 3 deletions

View File

@ -29,6 +29,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

View File

@ -964,7 +964,7 @@ public class FSDirectory implements Closeable {
// 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);
}

View File

@ -20,6 +20,7 @@ package org.apache.hadoop.hdfs.server.namenode;
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;
@ -173,29 +174,107 @@ public class TestFsLimits {
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")