DataNodeUGIProvider { UserGroupInformation ugi() throws IOException { UserGroupInformation ugi; try { final Token<DelegationTokenIdentifier> token = params.delegationToken(); if (UserGroupInformation.isSecurityEnabled() && token != null) { ugi = ugiCache.get(buildTokenCacheKey(token), new Callable<UserGroupInformation>() { @Override public UserGroupInformation call() throws Exception { return tokenUGI(token); } }); } else { final String usernameFromQuery = params.userName(); final String doAsUserFromQuery = params.doAsUser(); final String remoteUser = usernameFromQuery == null ? JspHelper .getDefaultWebUserName(params.conf()) : usernameFromQuery; ugi = ugiCache.get( buildNonTokenCacheKey(doAsUserFromQuery, remoteUser), new Callable<UserGroupInformation>() { @Override public UserGroupInformation call() throws Exception { return nonTokenUGI(usernameFromQuery, doAsUserFromQuery, remoteUser); } }); } } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof IOException) { throw (IOException) cause; } else { throw new IOException(cause); } } return ugi; } DataNodeUGIProvider(ParameterParser params); static synchronized void init(Configuration conf); static final Logger LOG; }
@Test public void testUGICacheInSecure() throws Exception { String uri1 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new UserParam("root")); String uri2 = WebHdfsFileSystem.PATH_PREFIX + PATH + "?op=OPEN" + Param.toSortedString("&", new OffsetParam((long) OFFSET), new LengthParam((long) LENGTH), new UserParam("hdfs")); DataNodeUGIProvider ugiProvider1 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri1)), conf)); UserGroupInformation ugi11 = ugiProvider1.ugi(); UserGroupInformation ugi12 = ugiProvider1.ugi(); Assert.assertEquals( "With UGI cache, two UGIs for the same user should be same", ugi11, ugi12); DataNodeUGIProvider ugiProvider2 = new DataNodeUGIProvider( new ParameterParser(new QueryStringDecoder(URI.create(uri2)), conf)); UserGroupInformation url21 = ugiProvider2.ugi(); UserGroupInformation url22 = ugiProvider2.ugi(); Assert.assertEquals( "With UGI cache, two UGIs for the same user should be same", url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different user should not be same", ugi11, url22); awaitCacheEmptyDueToExpiration(); ugi12 = ugiProvider1.ugi(); url22 = ugiProvider2.ugi(); String msg = "With cache eviction, two UGIs returned by" + " the same user should not be same"; Assert.assertNotEquals(msg, ugi11, ugi12); Assert.assertNotEquals(msg, url21, url22); Assert.assertNotEquals( "With UGI cache, two UGIs for the different user should not be same", ugi11, url22); }