diff --git a/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/SimpleCopyListing.java b/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/SimpleCopyListing.java index d2598a42d0..cabb7e352a 100644 --- a/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/SimpleCopyListing.java +++ b/hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/SimpleCopyListing.java @@ -191,7 +191,7 @@ private Path getPathWithSchemeAndAuthority(Path path) throws IOException { authority = fs.getUri().getAuthority(); } - return new Path(scheme, authority, path.toUri().getPath()); + return new Path(scheme, authority, makeQualified(path).toUri().getPath()); } /** diff --git a/hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestDistCpSync.java b/hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestDistCpSync.java index 04de8e4d6d..90e6840f71 100644 --- a/hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestDistCpSync.java +++ b/hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestDistCpSync.java @@ -674,4 +674,42 @@ public void testSync8() throws Exception { testAndVerify(numCreatedModified); } + + private void initData9(Path dir) throws Exception { + final Path foo = new Path(dir, "foo"); + final Path foo_f1 = new Path(foo, "f1"); + + DFSTestUtil.createFile(dfs, foo_f1, BLOCK_SIZE, DATA_NUM, 0L); + } + + private void changeData9(Path dir) throws Exception { + final Path foo = new Path(dir, "foo"); + final Path foo_f2 = new Path(foo, "f2"); + + DFSTestUtil.createFile(dfs, foo_f2, BLOCK_SIZE, DATA_NUM, 0L); + } + + /** + * Test a case where the source path is relative. + */ + @Test + public void testSync9() throws Exception { + + // use /user/$USER/source for source directory + Path sourcePath = new Path(dfs.getWorkingDirectory(), "source"); + initData9(sourcePath); + initData9(target); + dfs.allowSnapshot(sourcePath); + dfs.allowSnapshot(target); + dfs.createSnapshot(sourcePath, "s1"); + dfs.createSnapshot(target, "s1"); + changeData9(sourcePath); + dfs.createSnapshot(sourcePath, "s2"); + + String[] args = new String[]{"-update","-diff", "s1", "s2", + "source", target.toString()}; + new DistCp(conf, OptionsParser.parse(args)).execute(); + verifyCopy(dfs.getFileStatus(sourcePath), + dfs.getFileStatus(target), false); + } }