From 864baf23aa3df201f81b721852221c6475388295 Mon Sep 17 00:00:00 2001 From: Jing Zhao Date: Thu, 14 Apr 2016 10:35:22 -0700 Subject: [PATCH] HDFS-10216. Distcp -diff throws exception when handling relative path. Contributed by Takashi Ohnishi. (cherry picked from commit 404f57f328b00a42ec8b952ad08cd7a80207c7f2) --- .../hadoop/tools/SimpleCopyListing.java | 2 +- .../apache/hadoop/tools/TestDistCpSync.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) 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 d2598a42d0e..cabb7e352aa 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 @@ public class SimpleCopyListing extends CopyListing { 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 04de8e4d6d9..90e6840f714 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 class TestDistCpSync { 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); + } }