Jelajahi Sumber

HADOOP-6813. Add a new newInstance method in FileSystem that takes a user as argument

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@952471 13f79535-47bb-0310-9956-ffa450edef68
Boris Shkolnik 15 tahun lalu
induk
melakukan
2232093326

+ 3 - 0
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)

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

@@ -230,6 +230,30 @@ public abstract class FileSystem extends Configured implements Closeable {
     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<FileSystem>() {
+      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,
    * <tt>fs.<i>scheme</i>.class</tt> whose value names the FileSystem class.

+ 19 - 2
src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java

@@ -35,7 +35,7 @@ import java.security.PrivilegedExceptionAction;
 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 class TestFileSystemCaching {
   @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();
+  }
 }