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
This commit is contained in:
parent
3ef19e9dbd
commit
a2d5603106
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue