HDFS-9472. concat() API does not give proper exception messages on ./reserved relative path (Rakesh R via umamahesh)

This commit is contained in:
Uma Mahesh 2015-12-10 23:55:29 -08:00
parent eee0cf4611
commit e363417e7b
3 changed files with 42 additions and 4 deletions

View File

@ -1737,6 +1737,9 @@ Release 2.8.0 - UNRELEASED
HDFS-9527. The return type of FSNamesystem.getBlockCollection should be
changed to INodeFile. (szetszwo)
HDFS-9472. concat() API does not give proper exception messages on ./reserved
relative path (Rakesh R via umamahesh)
OPTIMIZATIONS
HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than

View File

@ -49,14 +49,11 @@ class FSDirConcatOp {
static HdfsFileStatus concat(FSDirectory fsd, String target, String[] srcs,
boolean logRetryCache) throws IOException {
Preconditions.checkArgument(!target.isEmpty(), "Target file name is empty");
Preconditions.checkArgument(srcs != null && srcs.length > 0,
"No sources given");
validatePath(target, srcs);
assert srcs != null;
if (FSDirectory.LOG.isDebugEnabled()) {
FSDirectory.LOG.debug("concat {} to {}", Arrays.toString(srcs), target);
}
final INodesInPath targetIIP = fsd.getINodesInPath4Write(target);
// write permission for the target
FSPermissionChecker pc = null;
@ -86,6 +83,25 @@ static HdfsFileStatus concat(FSDirectory fsd, String target, String[] srcs,
return fsd.getAuditFileInfo(targetIIP);
}
private static void validatePath(String target, String[] srcs)
throws IOException {
Preconditions.checkArgument(!target.isEmpty(), "Target file name is empty");
Preconditions.checkArgument(srcs != null && srcs.length > 0,
"No sources given");
if (FSDirectory.isReservedRawName(target)
|| FSDirectory.isReservedInodesName(target)) {
throw new IOException("Concat operation doesn't support "
+ FSDirectory.DOT_RESERVED_STRING + " relative path : " + target);
}
for (String srcPath : srcs) {
if (FSDirectory.isReservedRawName(srcPath)
|| FSDirectory.isReservedInodesName(srcPath)) {
throw new IOException("Concat operation doesn't support "
+ FSDirectory.DOT_RESERVED_STRING + " relative path : " + srcPath);
}
}
}
private static void verifyTargetFile(FSDirectory fsd, final String target,
final INodesInPath targetIIP) throws IOException {
// check the target

View File

@ -503,4 +503,23 @@ public void testConcatRelativeTargetPath() throws IOException {
assertEquals(blockSize * 2, dfs.getFileStatus(trg).getLen());
assertFalse(dfs.exists(src));
}
@Test(timeout = 30000)
public void testConcatReservedRelativePaths() throws IOException {
String testPathDir = "/.reserved/raw/ezone";
Path dir = new Path(testPathDir);
dfs.mkdirs(dir);
Path trg = new Path(testPathDir, "trg");
Path src = new Path(testPathDir, "src");
DFSTestUtil.createFile(dfs, trg, blockSize, REPL_FACTOR, 1);
DFSTestUtil.createFile(dfs, src, blockSize, REPL_FACTOR, 1);
try {
dfs.concat(trg, new Path[] { src });
Assert.fail("Must throw Exception!");
} catch (IOException e) {
String errMsg = "Concat operation doesn't support "
+ FSDirectory.DOT_RESERVED_STRING + " relative path : " + trg;
GenericTestUtils.assertExceptionContains(errMsg, e);
}
}
}