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
This commit is contained in:
Boris Shkolnik 2010-06-07 22:55:13 +00:00
parent 42a38a4b58
commit 2232093326
3 changed files with 46 additions and 2 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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();
}
}