Author: ddas Date: Sat Feb 20 20:13:26 2010 New Revision: 912207 URL: http://svn.apache.org/viewvc?rev=912207&view=rev Log: HADOOP-6545. Changes the Key for the FileSystem cache to be UGI. Contributed by Devaraj Das.
Modified: hadoop/common/trunk/CHANGES.txt hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java Modified: hadoop/common/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/trunk/CHANGES.txt?rev=912207&r1=912206&r2=912207&view=diff ============================================================================== --- hadoop/common/trunk/CHANGES.txt (original) +++ hadoop/common/trunk/CHANGES.txt Sat Feb 20 20:13:26 2010 @@ -224,6 +224,8 @@ HADOOP-6572. Makes sure that SASL encryption and push to responder queue for the RPC response happens atomically. (Kan Zhang via ddas) + HADOOP-6545. Changes the Key for the FileSystem cache to be UGI (ddas) + Release 0.21.0 - Unreleased INCOMPATIBLE CHANGES Modified: hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java?rev=912207&r1=912206&r2=912207&view=diff ============================================================================== --- hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java (original) +++ hadoop/common/trunk/src/java/org/apache/hadoop/fs/FileSystem.java Sat Feb 20 20:13:26 2010 @@ -1854,7 +1854,7 @@ static class Key { final String scheme; final String authority; - final String username; + final UserGroupInformation ugi; final long unique; // an artificial way to make a key unique Key(URI uri, Configuration conf) throws IOException { @@ -1866,13 +1866,12 @@ authority = uri.getAuthority()==null?"":uri.getAuthority().toLowerCase(); this.unique = unique; - UserGroupInformation ugi = UserGroupInformation.getCurrentUser(); - username = ugi.getUserName(); + this.ugi = UserGroupInformation.getCurrentUser(); } /** {...@inheritdoc} */ public int hashCode() { - return (scheme + authority + username).hashCode() + (int)unique; + return (scheme + authority).hashCode() + ugi.hashCode() + (int)unique; } static boolean isEqual(Object a, Object b) { @@ -1888,7 +1887,7 @@ Key that = (Key)obj; return isEqual(this.scheme, that.scheme) && isEqual(this.authority, that.authority) - && isEqual(this.username, that.username) + && isEqual(this.ugi, that.ugi) && (this.unique == that.unique); } return false; @@ -1896,7 +1895,7 @@ /** {...@inheritdoc} */ public String toString() { - return username + "@" + scheme + "://" + authority; + return "("+ugi.toString() + ")@" + scheme + "://" + authority; } } } Modified: hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java URL: http://svn.apache.org/viewvc/hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java?rev=912207&r1=912206&r2=912207&view=diff ============================================================================== --- hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java (original) +++ hadoop/common/trunk/src/test/core/org/apache/hadoop/fs/TestFileSystemCaching.java Sat Feb 20 20:13:26 2010 @@ -24,7 +24,16 @@ import java.net.URI; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.security.token.Token; +import org.apache.hadoop.security.token.TokenIdentifier; import org.junit.Test; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import static org.mockito.Mockito.mock; + + public class TestFileSystemCaching { @@ -46,5 +55,60 @@ FileSystem fs2 = FileSystem.get(new URI("uncachedfile://a"), conf); assertNotSame(fs1, fs2); } + + @SuppressWarnings("unchecked") + @Test + public <T extends TokenIdentifier> void testCacheForUgi() throws Exception { + final Configuration conf = new Configuration(); + conf.set("fs.cachedfile.impl", conf.get("fs.file.impl")); + UserGroupInformation ugiA = UserGroupInformation.createRemoteUser("foo"); + UserGroupInformation ugiB = UserGroupInformation.createRemoteUser("bar"); + FileSystem fsA = ugiA.doAs(new PrivilegedExceptionAction<FileSystem>() { + public FileSystem run() throws Exception { + return FileSystem.get(new URI("cachedfile://a"), conf); + } + }); + FileSystem fsA1 = ugiA.doAs(new PrivilegedExceptionAction<FileSystem>() { + public FileSystem run() throws Exception { + return FileSystem.get(new URI("cachedfile://a"), conf); + } + }); + //Since the UGIs are the same, we should have the same filesystem for both + assertSame(fsA, fsA1); + + FileSystem fsB = ugiB.doAs(new PrivilegedExceptionAction<FileSystem>() { + public FileSystem run() throws Exception { + return FileSystem.get(new URI("cachedfile://a"), conf); + } + }); + //Since the UGIs are different, we should end up with different filesystems + //corresponding to the two UGIs + assertNotSame(fsA, fsB); + + Token<T> t1 = mock(Token.class); + ugiA = UserGroupInformation.createRemoteUser("foo"); + ugiA.addToken(t1); + + fsA = ugiA.doAs(new PrivilegedExceptionAction<FileSystem>() { + public FileSystem run() throws Exception { + return FileSystem.get(new URI("cachedfile://a"), conf); + } + }); + //Although the users in the UGI are same, ugiA has tokens in it, and + //we should end up with different filesystems corresponding to the two UGIs + assertNotSame(fsA, fsA1); + + ugiA = UserGroupInformation.createRemoteUser("foo"); + ugiA.addToken(t1); + + fsA1 = ugiA.doAs(new PrivilegedExceptionAction<FileSystem>() { + public FileSystem run() throws Exception { + return FileSystem.get(new URI("cachedfile://a"), conf); + } + }); + //Now the users in the UGI are the same, and they also have the same token. + //We should have the same filesystem for both + assertSame(fsA, fsA1); + } }