HDFS-9472. concat() API does not give proper exception messages on ./reserved relative path (Rakesh R via umamahesh)
(cherry picked from commit e363417e7b
)
This commit is contained in:
parent
5047ee56af
commit
7dc558b6a7
|
@ -868,6 +868,9 @@ Release 2.8.0 - UNRELEASED
|
||||||
HDFS-9527. The return type of FSNamesystem.getBlockCollection should be
|
HDFS-9527. The return type of FSNamesystem.getBlockCollection should be
|
||||||
changed to INodeFile. (szetszwo)
|
changed to INodeFile. (szetszwo)
|
||||||
|
|
||||||
|
HDFS-9472. concat() API does not give proper exception messages on ./reserved
|
||||||
|
relative path (Rakesh R via umamahesh)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than
|
HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than
|
||||||
|
|
|
@ -49,14 +49,11 @@ class FSDirConcatOp {
|
||||||
|
|
||||||
static HdfsFileStatus concat(FSDirectory fsd, String target, String[] srcs,
|
static HdfsFileStatus concat(FSDirectory fsd, String target, String[] srcs,
|
||||||
boolean logRetryCache) throws IOException {
|
boolean logRetryCache) throws IOException {
|
||||||
Preconditions.checkArgument(!target.isEmpty(), "Target file name is empty");
|
validatePath(target, srcs);
|
||||||
Preconditions.checkArgument(srcs != null && srcs.length > 0,
|
|
||||||
"No sources given");
|
|
||||||
assert srcs != null;
|
assert srcs != null;
|
||||||
if (FSDirectory.LOG.isDebugEnabled()) {
|
if (FSDirectory.LOG.isDebugEnabled()) {
|
||||||
FSDirectory.LOG.debug("concat {} to {}", Arrays.toString(srcs), target);
|
FSDirectory.LOG.debug("concat {} to {}", Arrays.toString(srcs), target);
|
||||||
}
|
}
|
||||||
|
|
||||||
final INodesInPath targetIIP = fsd.getINodesInPath4Write(target);
|
final INodesInPath targetIIP = fsd.getINodesInPath4Write(target);
|
||||||
// write permission for the target
|
// write permission for the target
|
||||||
FSPermissionChecker pc = null;
|
FSPermissionChecker pc = null;
|
||||||
|
@ -86,6 +83,25 @@ class FSDirConcatOp {
|
||||||
return fsd.getAuditFileInfo(targetIIP);
|
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,
|
private static void verifyTargetFile(FSDirectory fsd, final String target,
|
||||||
final INodesInPath targetIIP) throws IOException {
|
final INodesInPath targetIIP) throws IOException {
|
||||||
// check the target
|
// check the target
|
||||||
|
|
|
@ -503,4 +503,23 @@ public class TestHDFSConcat {
|
||||||
assertEquals(blockSize * 2, dfs.getFileStatus(trg).getLen());
|
assertEquals(blockSize * 2, dfs.getFileStatus(trg).getLen());
|
||||||
assertFalse(dfs.exists(src));
|
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