Bläddra i källkod

Merge -r 945734:945735 from trunk to branch-0.21. Fixes: HADOOP-6769

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.21@953871 13f79535-47bb-0310-9956-ffa450edef68
Thomas White 15 år sedan
förälder
incheckning
daa58ba45e

+ 3 - 0
CHANGES.txt

@@ -858,6 +858,9 @@ Release 0.21.0 - Unreleased
 
     HADOOP-6403.  Deprecate EC2 bash scripts.  (tomwhite)
 
+    HADOOP-6769. Add an API in FileSystem to get FileSystem instances based 
+    on users(ddas via boryas)
+
   OPTIMIZATIONS
 
     HADOOP-5595. NameNode does not need to run a replicator to choose a

+ 26 - 0
src/java/org/apache/hadoop/fs/FileSystem.java

@@ -21,6 +21,7 @@ import java.io.Closeable;
 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<Path> deleteOnExit = new TreeSet<Path>();
+  
+  /**
+   * 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<FileSystem>() {
+      public FileSystem run() throws IOException {
+        return get(uri, conf);
+      }
+    });
+  }
 
   /** Returns the configured filesystem implementation.*/
   public static FileSystem get(Configuration conf) throws IOException {

+ 11 - 1
src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java

@@ -26,6 +26,7 @@ import java.net.URI;
 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 class TestFileSystemCaching {
     //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);   
+  }
 }