diff --git a/CHANGES.txt b/CHANGES.txt index f58d608d57..fd422bb105 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -44,6 +44,9 @@ Trunk (unreleased changes) HADOOP-6674. Makes use of the SASL authentication options in the SASL RPC. (Jitendra Pandey via ddas) + HADOOP-6813. Add a new newInstance method in FileSystem that takes + a "user" as argument (ddas via boryas) + BUG FIXES HADOOP-6638. try to relogin in a case of failed RPC connection (expired tgt) only in case the subject is loginUser or proxyUgi.realUser. (boryas) diff --git a/src/java/org/apache/hadoop/fs/FileSystem.java b/src/java/org/apache/hadoop/fs/FileSystem.java index 63bdca1464..4414b72888 100644 --- a/src/java/org/apache/hadoop/fs/FileSystem.java +++ b/src/java/org/apache/hadoop/fs/FileSystem.java @@ -230,6 +230,30 @@ public static FileSystem get(URI uri, Configuration conf) throws IOException { return CACHE.get(uri, conf); } + /** + * Returns the FileSystem for this URI's scheme and authority and the + * passed user. Internally invokes {@link #newInstance(URI, Configuration)} + * @param uri + * @param conf + * @param user + * @return filesystem instance + * @throws IOException + * @throws InterruptedException + */ + public static FileSystem newInstance(final URI uri, final Configuration conf, + final String user) throws IOException, InterruptedException { + UserGroupInformation ugi; + if (user == null) { + ugi = UserGroupInformation.getCurrentUser(); + } else { + ugi = UserGroupInformation.createRemoteUser(user); + } + return ugi.doAs(new PrivilegedExceptionAction() { + public FileSystem run() throws IOException { + return newInstance(uri,conf); + } + }); + } /** Returns the FileSystem for this URI's scheme and authority. The scheme * of the URI determines a configuration property name, * fs.scheme.class whose value names the FileSystem class. diff --git a/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java b/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java index b2806f08cd..f7d9373066 100644 --- a/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java +++ b/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java @@ -35,7 +35,7 @@ import java.util.concurrent.Semaphore; import static org.mockito.Mockito.mock; - +import static junit.framework.Assert.assertTrue; public class TestFileSystemCaching { @@ -158,10 +158,27 @@ public FileSystem run() throws Exception { @Test public void testUserFS() throws Exception { final Configuration conf = new Configuration(); - + conf.set("fs.cachedfile.impl", conf.get("fs.file.impl")); FileSystem fsU1 = FileSystem.get(new URI("cachedfile://a"), conf, "bar"); FileSystem fsU2 = FileSystem.get(new URI("cachedfile://a"), conf, "foo"); assertNotSame(fsU1, fsU2); } + + @Test + public void testFsUniqueness() throws Exception { + final Configuration conf = new Configuration(); + conf.set("fs.cachedfile.impl", conf.get("fs.file.impl")); + // multiple invocations of FileSystem.get return the same object. + FileSystem fs1 = FileSystem.get(conf); + FileSystem fs2 = FileSystem.get(conf); + assertTrue(fs1 == fs2); + + // multiple invocations of FileSystem.newInstance return different objects + fs1 = FileSystem.newInstance(new URI("cachedfile://a"), conf, "bar"); + fs2 = FileSystem.newInstance(new URI("cachedfile://a"), conf, "bar"); + assertTrue(fs1 != fs2 && !fs1.equals(fs2)); + fs1.close(); + fs2.close(); + } }