From 759494f3a1a5e2883267e61c5179e6e5446631b3 Mon Sep 17 00:00:00 2001 From: Boris Shkolnik Date: Tue, 18 May 2010 16:21:24 +0000 Subject: [PATCH] HADOOP-6769. Add an API in FileSystem to get FileSystem instances based on users git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@945735 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES.txt | 2 ++ src/java/org/apache/hadoop/fs/FileSystem.java | 26 +++++++++++++++++++ .../hadoop/fs/TestFileSystemCaching.java | 12 ++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index c785b1e7af..00a67087d5 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -3,6 +3,8 @@ Hadoop Change Log Trunk (unreleased changes) IMPROVEMENTS + HADOOP-6769. Add an API in FileSystem to get FileSystem instances based + on users(ddas via boryas) HADOOP-6600. mechanism for authorization check for inter-server protocols. (boryas) diff --git a/src/java/org/apache/hadoop/fs/FileSystem.java b/src/java/org/apache/hadoop/fs/FileSystem.java index 54c4c54f40..15a29331f1 100644 --- a/src/java/org/apache/hadoop/fs/FileSystem.java +++ b/src/java/org/apache/hadoop/fs/FileSystem.java @@ -21,6 +21,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; +import java.security.PrivilegedExceptionAction; import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; @@ -95,6 +96,31 @@ public abstract class FileSystem extends Configured implements Closeable { * or the JVM is exited. */ private Set deleteOnExit = new TreeSet(); + + /** + * Get a filesystem instance based on the uri, the passed + * configuration and the user + * @param uri + * @param conf + * @param user + * @return the filesystem instance + * @throws IOException + * @throws InterruptedException + */ + public static FileSystem get(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 get(uri, conf); + } + }); + } /** Returns the configured filesystem implementation.*/ public static FileSystem get(Configuration conf) throws IOException { diff --git a/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java b/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java index b860282fa3..b2806f08cd 100644 --- a/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java +++ b/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java @@ -26,6 +26,7 @@ import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.security.token.TokenIdentifier; @@ -153,5 +154,14 @@ public FileSystem run() throws Exception { //We should have the same filesystem for both assertSame(fsA, fsA1); } - + + @Test + public void testUserFS() throws Exception { + final Configuration conf = new Configuration(); + + FileSystem fsU1 = FileSystem.get(new URI("cachedfile://a"), conf, "bar"); + FileSystem fsU2 = FileSystem.get(new URI("cachedfile://a"), conf, "foo"); + + assertNotSame(fsU1, fsU2); + } }