diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/CopyFromLocalOperation.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/CopyFromLocalOperation.java index a50c31fc86..87e687b755 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/CopyFromLocalOperation.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/CopyFromLocalOperation.java @@ -130,7 +130,7 @@ public CopyFromLocalOperation( this.callbacks = callbacks; this.deleteSource = deleteSource; this.overwrite = overwrite; - this.source = source; + this.source = source.toUri().getScheme() == null ? new Path("file://", source) : source; this.destination = destination; // Capacity of 1 is a safe default for now since transfer manager can also diff --git a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ACopyFromLocalFile.java b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ACopyFromLocalFile.java index f9600de6d2..ffc8a990ed 100644 --- a/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ACopyFromLocalFile.java +++ b/hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3ACopyFromLocalFile.java @@ -19,6 +19,7 @@ package org.apache.hadoop.fs.s3a; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.Collection; @@ -107,4 +108,15 @@ public void testOnlyFromLocal() throws Throwable { intercept(IllegalArgumentException.class, () -> getFileSystem().copyFromLocalFile(true, true, dest, dest)); } + + @Test + public void testCopyFromLocalWithNoFileScheme() throws IOException { + describe("Copying from local file with no file scheme to remote s3 destination"); + File source = createTempFile("tempData"); + Path dest = path(getMethodName()); + + Path sourcePathWithOutScheme = new Path(source.toURI().getPath()); + assertNull(sourcePathWithOutScheme.toUri().getScheme()); + getFileSystem().copyFromLocalFile(true, true, sourcePathWithOutScheme, dest); + } }