From a2d560310631c85b9996f895e3a163c4f35e538e Mon Sep 17 00:00:00 2001 From: Robert Joseph Evans Date: Tue, 24 Jul 2012 19:00:50 +0000 Subject: [PATCH] HADOOP-8606. FileSystem.get may return the wrong filesystem (Daryn Sharp via bobby) git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1365224 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-common/CHANGES.txt | 3 + .../java/org/apache/hadoop/fs/FileSystem.java | 4 +- .../hadoop/fs/TestFileSystemCaching.java | 61 ++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index d4c4e6a07cb..ebd833bdb66 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -838,6 +838,9 @@ Release 0.23.3 - UNRELEASED HADOOP-8599. Non empty response from FileSystem.getFileBlockLocations when asking for data beyond the end of file. (Andrey Klochkov via todd) + HADOOP-8606. FileSystem.get may return the wrong filesystem (Daryn Sharp + via bobby) + Release 0.23.2 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java index 62b48cf7467..f65d12c711c 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/FileSystem.java @@ -280,11 +280,11 @@ public abstract class FileSystem extends Configured implements Closeable { String scheme = uri.getScheme(); String authority = uri.getAuthority(); - if (scheme == null) { // no scheme: use default FS + if (scheme == null && authority == null) { // use default FS return get(conf); } - if (authority == null) { // no authority + if (scheme != null && authority == null) { // no authority URI defaultUri = getDefaultUri(conf); if (scheme.equals(defaultUri.getScheme()) // if scheme matches default && defaultUri.getAuthority() != null) { // & default has authority diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileSystemCaching.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileSystemCaching.java index 1e176a0a12f..910139b56ec 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileSystemCaching.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFileSystemCaching.java @@ -34,8 +34,8 @@ import org.junit.Test; import java.security.PrivilegedExceptionAction; import java.util.concurrent.Semaphore; +import static org.junit.Assert.*; import static org.mockito.Mockito.mock; -import static junit.framework.Assert.assertTrue; public class TestFileSystemCaching { @@ -49,6 +49,65 @@ public class TestFileSystemCaching { assertSame(fs1, fs2); } + static class DefaultFs extends LocalFileSystem { + URI uri; + @Override + public void initialize(URI uri, Configuration conf) { + this.uri = uri; + } + @Override + public URI getUri() { + return uri; + } + } + + @Test + public void testDefaultFsUris() throws Exception { + final Configuration conf = new Configuration(); + conf.set("fs.defaultfs.impl", DefaultFs.class.getName()); + final URI defaultUri = URI.create("defaultfs://host"); + FileSystem.setDefaultUri(conf, defaultUri); + FileSystem fs = null; + + // sanity check default fs + final FileSystem defaultFs = FileSystem.get(conf); + assertEquals(defaultUri, defaultFs.getUri()); + + // has scheme, no auth + fs = FileSystem.get(URI.create("defaultfs:/"), conf); + assertSame(defaultFs, fs); + fs = FileSystem.get(URI.create("defaultfs:///"), conf); + assertSame(defaultFs, fs); + + // has scheme, same auth + fs = FileSystem.get(URI.create("defaultfs://host"), conf); + assertSame(defaultFs, fs); + + // has scheme, different auth + fs = FileSystem.get(URI.create("defaultfs://host2"), conf); + assertNotSame(defaultFs, fs); + + // no scheme, no auth + fs = FileSystem.get(URI.create("/"), conf); + assertSame(defaultFs, fs); + + // no scheme, same auth + try { + fs = FileSystem.get(URI.create("//host"), conf); + fail("got fs with auth but no scheme"); + } catch (Exception e) { + assertEquals("No FileSystem for scheme: null", e.getMessage()); + } + + // no scheme, different auth + try { + fs = FileSystem.get(URI.create("//host2"), conf); + fail("got fs with auth but no scheme"); + } catch (Exception e) { + assertEquals("No FileSystem for scheme: null", e.getMessage()); + } + } + public static class InitializeForeverFileSystem extends LocalFileSystem { final static Semaphore sem = new Semaphore(0); public void initialize(URI uri, Configuration conf) throws IOException {