HDFS-9472. concat() API does not give proper exception messages on ./reserved relative path (Rakesh R via umamahesh)
This commit is contained in:
parent
eee0cf4611
commit
e363417e7b
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user