|
@@ -21,13 +21,20 @@ package org.apache.hadoop.hdfs.security.token.delegation;
|
|
|
import java.io.ByteArrayInputStream;
|
|
|
import java.io.DataInputStream;
|
|
|
import java.io.IOException;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
+import org.apache.commons.collections.map.LRUMap;
|
|
|
import org.apache.hadoop.classification.InterfaceAudience;
|
|
|
import org.apache.hadoop.hdfs.web.WebHdfsConstants;
|
|
|
import org.apache.hadoop.io.Text;
|
|
|
+import org.apache.hadoop.security.UserGroupInformation;
|
|
|
import org.apache.hadoop.security.token.Token;
|
|
|
+import org.apache.hadoop.security.token.TokenIdentifier;
|
|
|
import org.apache.hadoop.security.token.delegation.AbstractDelegationTokenIdentifier;
|
|
|
|
|
|
+import com.google.common.annotations.VisibleForTesting;
|
|
|
+
|
|
|
/**
|
|
|
* A delegation token identifier that is specific to HDFS.
|
|
|
*/
|
|
@@ -37,6 +44,15 @@ public class DelegationTokenIdentifier
|
|
|
public static final Text HDFS_DELEGATION_KIND =
|
|
|
new Text("HDFS_DELEGATION_TOKEN");
|
|
|
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private static Map<TokenIdentifier, UserGroupInformation> ugiCache =
|
|
|
+ Collections.synchronizedMap(new LRUMap(64));
|
|
|
+
|
|
|
+ @VisibleForTesting
|
|
|
+ public void clearCache() {
|
|
|
+ ugiCache.clear();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Create an empty delegation token identifier for reading into.
|
|
|
*/
|
|
@@ -58,6 +74,16 @@ public class DelegationTokenIdentifier
|
|
|
return HDFS_DELEGATION_KIND;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public UserGroupInformation getUser() {
|
|
|
+ UserGroupInformation ugi = ugiCache.get(this);
|
|
|
+ if (ugi == null) {
|
|
|
+ ugi = super.getUser();
|
|
|
+ ugiCache.put(this, ugi);
|
|
|
+ }
|
|
|
+ return ugi;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public String toString() {
|
|
|
StringBuilder sbld = new StringBuilder();
|